kafka 基础知识

kafka 对消息保存时根据Topic 进行归类;发送者为producer 接收者为Consumer;kafka集群有多个实例,每个实例称为broker
zookeeper 为集群保存一些meta信息
一个Topic 可以认为是一类消息,每个topic 将被分成多个 partition(区),每个partition 在存储层面是append log 文件
kafka 中几乎不允许对消息进行“随机读写“
每条消息在文件中的位置称为offset(偏移量),offset 为一个long型数字,它是唯一标记一条消息 保存在zookeeper中
在kafka 中,即使消息被消费,消息仍然不会被立即删除。日志文件将会根据broker 中的配置要求,保留一定的时间之后删除;比如
log 文件保留2 天,那么两天后,文件会被清除,无论其中的消息是否被消费
kafka集群几乎不需要维护任何consumer 和producer 状态信息,这些信息由zookeeper 保存
设计原理:

  1. 持久性
    kafka 使用文件存储消息,因此依赖文件系统本身;kafka对日志文件进行append操作,broker会将消息暂存在buffer中,当buffer中满了后
    在flush到磁盘
  2. 性能
    kafka除了需要考虑到磁盘的IO之外,还要考虑网络的IO;
    对于producer 端,可以将消息buffer 起来,当消息的条数达到一定阀值时,批量发送给broker;对于consumer 端也是一样,批量fetch 多条消息
    broker 端,似乎有个sendfile 系统调用可以潜在的提升网络IO 的性能
    对于producer/consumer/broker 三者而言,CPU 的开支应该都不大,因此启用消息压缩机制是一个良好的策略
    kafka 支持gzip/snappy 等多种压缩方式
  3. 生产者
    producer 将会和Topic 下所有partition leader 保持socket 连接
    消息被路由到哪个partition 上由producer 客户端决定
    其中partition leader 的位置(host:port)注册在zookeeper中,producer 作为zookeeper 的client,已经注册了watch 用来监听
    partition leader 的变更事件
  4. 消费者
    consumer 端向broker 发送"fetch"请求,并告知其获取消息的offset;
    在kafka 中,producers 将消息推送给broker 端,consumer 在和broker 建立连接之后,主动去pull(或者说fetch)消息
    在kafka 中,partition 中的消息只有一个consumer 在消费 当消息被consumer 接收之后,consumer可以在本地保存最后消息的offset,并间歇性的向zookeeper 注册offset
    Kafka 提供了两套API 给Consumer:
    高度抽象的Consumer API :
    消息消费以Consumer Group 为单位,每个Consumer Group 中可以有多个consumer,每个consumer 是一个线程,topic 的每个
    partition 同时只能被某一个consumer 读取,Consumer Group对应的每个partition 都有一个最新的offset 的值,存储在zk中
    High Level Consumer 可以并且应该被使用在多线程的环境,线程模型中线程的数量(也代表group 中consumer 的数量)和topic 的
    partition 数量有关
    ● 当提供的线程数量多于partition 的数量,则部分线程将不会接收到消息
    ● 当提供的线程数量少于partition 的数量,则部分线程将从多个partition 接收消息
    ● 当某个线程从多个partition 接收消息时,不保证接收消息的顺序;可能出现从partition3接收5条消息
    从partition4接收6条消息,接着又从partition3接收10条消息
    ● 当添加更多线程时,会引起kafka 做re-balance, 可能改变partition 和线程的对应关系
    消息传送机制
    at most once:最多一次,发送一次,无论成败,将不会重发
    at least once:消息至少发送一次,如果消息未能接受成功,可能会重发,直到接收成功 (首选)
    复制备份
    kafka 将每个partition 数据复制到多个server 上,任何一个partition 有一个leader 和多个follower(可以没有);
    备份的个数可以通过broker 配置文件来设定。
    leader 处理所有的read-writer请求,follower 需要和leader保持同步,如果follower落后太多就从replicas中删除
    日志
    每个partition 在物理存储层面,有多个log file 组成(称为segment)。segment file 的命名为" 最小offset".kafka
    zookeeper
    kafka 使用zookeeper 来存储一些meta 信息,并使用了zookeeperwatch 机制来发现meta 信息的变更并作出相应的动作(比如consumer
    失效,触发负载均衡等)
    ● Broker node registry:kafka broker 启动后,首先会向zookeeper 注册自己的节点信息(临时znode),同时当broker 和
    zookeeper 断开连接时,此znode 也会被删除 /brokers/ids/[0。。。N]
    ● Broker Topic Registry:broker 启动时, 会向zookeeper 注册自己持有的topic 和partitions 信息 /brokers/topics/[topic]/partitions/[0。。。N]
    ● Consumer and Consumer group:每个consumer 客户端被创建时,会向zookeeper 注册自己的信息;此作用主要是为了"负载均衡"。
    一个group 中的多个consumer 可以交错的消费一个topic 的所有partitions;简而言之,保证此topic 的所有partitions 都能被此
    group 所消费,且消费时为了性能考虑,让partition 相对均衡的分散到每个consumer 上

● Consumer id Registry:每个consumer 都有一个唯一的ID,此id 用来标记消费者信息 /consumers/[group_id]/ids/[consumer_id]
● Consumer offset Tracking:跟踪每个consumer 目前所消费的partition 中最大的offset
/consumers/[group_id]/offsets/[topic]/[broker_id-partition_id]-->offset_value
● Partition Owner registry:标记partition 被哪个consumer 消费
/consumers/[group_id]/owners/[topic]/[broker_id-partition_id] -->consumer_node_id
Producer 端使用zookeeper 用来"发现"broker 列表,以及和Topic下每个partition leader 建立socket 连接并发送消息。
Broker 端使用zookeeper 用来注册broker 信息, 已经监测partition leader 存活性。
Consumer 端使用zookeeper 用来注册consumer 信息,其中包括consumer 消费的partition 列表等,同时也用来发现broker 列表,并和partition leader 建立socket 连接,并获取消息

  1. 查看所有的topics
    ./kafka-topics.sh --list --zookeeper 192.168.137.5:2181
  2. 创建topics
    kafka-create-topic.sh --replica 2 --partition 8 --topic test --zookeeper 192.168.197.170:2181
  3. 查看kafka中的具体消息内容
    ./kafka-simple-consumer-shell.sh --broker-list 10.204.243.40:9092,10.204.243.39:9092,10.204.243.38:9092 --topic fcbox_sms_log --partition 0
  4. 查看topic的分片和副本情况
    ./kafka-topics.sh --describe --zookeeper 10.204.243.40:2181,10.204.243.39:2181,10.204.243.38:2181 --topic fcbox_sms_log
  5. 查看所有的topic列表
    ./kafka-topics.sh --list --zookeeper 192.168.137.5:2181,10.204.243.40:2181,10.204.243.39:2181,10.204.243.38:2181
  6. 查看topic积压情况
    ./kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --–zookeeper 10.204.8.20:2181,10.204.8.111:2181,10.204.8.122:2181 --topic fcbox-epsp-custm-info --group fcbox-g01
  7. 查看topic的挤压情况
    ./kafka-consumer-offset-checker.sh --zookeeper 10.204.5.209:2181,10.204.5.210:2181,10.204.5.211:2181 --group fcbox-log --topic fcbox-r2s-info

猜你喜欢

转载自blog.51cto.com/weadyweady/2133059
今日推荐