Kafka消息中间件
- Kafka是一个高吞吐量的分布式的可复制的发布订阅消息系统
- 官网:http://kafka.apache.org/
- 中文网:http://kafka.apachecn.org/
分布式
- producer,broker,consumer均可部署在多个服务器
- 使用zookeeper进行分布式协调管理
高性能
- 端到端的消息压缩
- 支持批量发送,异步发送
- 顺序读写
- 使用zero copy技术:zero copy技术就是减少不必要的内核缓冲区跟用户缓冲区间的拷贝,从而减少CPU的开销和内核态切换开销,达到性能的提升;zero copy下,同样的读取文件然后通过网络发送出去,只需要拷贝三次,只发生两次内核态和用户态的切换
功能简单实用
- 支持持久化
- 消费者从broker拉取数据
- 消费的消息状态由消费者维护
- 支持分区,可并行消费
- 支持高可用(多副本,自动切换leader)
基本概念
- topic:每个topic可以认为是一类消息
- producer:消息生产者,向kafka的topics发布消息
- broker:kafka集群中的一台或者多台机器统称为broker,用来接收并存储消息
- consumer:消息消费者,订阅并处理topics中的消息
- consumer group:消费者组,相同的groupid的consumer组成一个组,一条消息只能被同组的某一个consumer进行消费,不能重复消费,不同groupid的consumer,能重复消费同一条消息
- partition:topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列
- segment:段,partition物理上由多个segment组成,每个segment存储这message消息
- offset:一条消息在消息流中的偏移量
kafka架构
- kafka发送端采用push模式将消息发送到broker
- kafka通过zookeeper管理集群配置,选举leader,以及在consumer group 变化时rebalance
- kafka消费端采用pull模式订阅并消费消息
- 分区在producer端进行
- 分区是leader选举的单位
- offset由consumer端进行维护
kafka安装介绍
-
解压:tar -zxvf *.tgz -C 解压目录
-
启动服务:
# 首先启动zookeeper服务 bin/zookeeper-server-start.sh config/zookeeper.properties & # 修改配置文件 config/server.properties broker.id= 唯一编号,数字类型 port=9092 端口号 host.name=localhost broker所在节点服务器 log.dirs=/data/kafka-logs zookeeper.connect=xxx.xxx.x.x:2181, xxx.xxx.x.x :2181, xxx.xxx.x.x :2181 # 启动Kafka bin/kafka-server-start.sh config/server.properties &
kafka常用命令
# 创建topic
kafka-topics.sh
--create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 -- topic test
# 查看所有topic
kafka-topics.sh --list --zookeeper localhost:2181
# 查看具体topic
kafka-topics.sh --describe --zookeeper localhost:2181 --topic test
# 删除topic
kafka-topics.sh --zookeeper localhost:2181 --topic test --delete
# 修改topic分区
kafka-topics.sh --zookeeper localhost:2181 --alter --topic test --partitions 5
# 生产消息
kafka-console-producer.sh --broker-list localhost:9092 --topic test
# 消费消息(从头开始)
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
# 消费消息(从尾开始)
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --offset latest
# 消费消息(指定分区)
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --offset latest --partition 1
# 消费消息(取指定个数)
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --offset latest --partition 1 --max-messages 1
kafka核心原理-rebalance
rebalance,本质上是一种协议,它规定了一个consumer group是如何达成一致来分配订阅topic的所有分区
触发条件:当consumer或者topic自身发生变化时会触发rebalance
- 组成员发生变更
- 组订阅的topic数发生变更
- 组订阅的topic的分区数发生变更
kafka核心原理-分区策略
策略分类:
-
range:平均分配,若又余数,再平均分配到前面的分区
针对每一个topic,分区按照顺序进行排序 N = 分区数 / 消费者数量 M = 分区数 % 消费者数量 前M个消费者每个分配N+1个分区,后面的(消费者数据-M)个消费者每个分配N个分区
-
round-robin:将所有的topic的所有分区按照字典顺序排序,然后轮询分配给每个consumer
-
sticky:一种较为复杂的算法
分区的分配要尽可能的均匀 分区的分配尽可能的与上次分配的保持相同
-
自定义分配策略:实现AbstractPartitionAssignor类的assign方法
策略配置:
partition.assignment.strategy=range| roundrobin | sticky | 自定义策略
kafka核心原理-主从复制
kafka的高可靠性的保障来源于其健壮的副本(replication)策略,通过调节其副本相关参数,可以使得Kafka在性能和可靠性之间运转的游刃有余;Kafka从0.8.x版本开始提供partition级别的复制,replication的数量可以在$KAFKA_HOME/config/server.properties中配置
-
利用多份相同的备份共同提供冗余机制来保持系统的高可用性,这些备份在kafka中称为副本(replica)
-
replica的个数小于等于broker数,即对每个partition而言每个broker上只会有一个replica
-
所有partition的所有replica默认情况会均匀分布到所有broker上
-
kafka集群isr动态维护的一组同步副本集合(in-sync-replicas)
-
只有isr中的副本才有资格竞选leader
-
高水印值HW:high watermark,保存了该分区最新一条已提交的消息偏移量
-
日志末端位移LEO:log end offset,保存了该分区最新一条未提交的消息偏移量
- follower节点同步leader节点的消息偏移量的最小值即为leader的hw值
-
ack机制:ack=0/1/-1的不同情况
ack=0: producer不等待broker的ack,broker一接收到还没有写入磁盘就已经返回,当broker故障时有可能丢失数据 ack=1: producer等待broker的ack,partition的leader落盘成功后返回ack,如果在follower同步成功之前leader故障,那么将会丢失数据 ack=-1: producer等待broker的ack,partition的leader和follower全部落盘成功后才返回ack,数据一般不会丢失,延迟时间长但是可靠性高
-
以下是4台broker,topic为4分区2副本的分布图,其中虚线框为副本