介绍
基于Zookeeper的高吞吐量低延迟的分布式发布与订阅消息系统;
架构
kafka消息传递流程
生产者发送消息给kafka集群,kafka集群把消息转发给消费者;客户端和服务器之间的通信是通过一个简单的、高性能的、与语言无关的TCP协议完成;
kafka集群架构
Zookeeper用于管理和协调Broker,系统中新增Broker或Broker故障失效,Zookeeper将通知生产者和消费者;
相关概念
-
主题:对消息进行分类
-
分区:一个主题可分为多个分区且可分布存储在不同Broker上;可扩张消息的容量,实现水平扩展;
-
分区副本:同一个分区可复制多个副本分配到不同的Broker;领导者副本失效,会从跟随者副本选取一个领导者副本;跟随者副本会周期性向领导者副本发起请求,同步数据;
-
ISR同步复制方案:领导者副本会维护一个需要保持同步的副本列表,称为ISR;如果一段时间内(可通过replica.lag.time.max.ms配置)跟随者没有发送请求,认为改跟随者不需要同步,从ISR中删除
-
偏移量:分区中每条消息都分配偏移量,偏移量是一个递增的数值,唯一标识分区中的消息,消费者保存偏移量,发起消息请求时需要携带偏移量,ISR的数据保存在Zookeeper中;副本完成同步,领导者才会将消息写入装填置为commit,消费者才可以读取该消息;
-
消息持久化策略:根据时间或消息大小保留
-
ack参数:生产者通过设置acks参数指定消息写入成功的界定;acks参数有三个,分布时1、all、0;默认为acks=1,只要领导者副本写入成功,即认为成功,acks=all是所有副本写入成功,acks=0只要生产者将消息发送出去即认为成功;
-
消费者组:一组消费者的集合,每个消费者都有一个消费者组,不指定组名则属于默认组;同组消费者不能消费同一分区消息
- 数据存储机制:一个分区的数据存储于一个单独的文件夹,命令规则是“主题名-分区编号”,编号从0开始,一次递增;分区又分多个segment(段)组成,是kafka数据存储的最小单元;segment文件两部分组成,索引文件和数据文件,索引文件存储元数据,数据文件储存实际数据;
kafka集群搭建
- 安装包下载地址 https://kafka.apache.org/downloads
- 解压
tar -zxvf kafka_2.13-3.4.0.tgz
- 配置文件,config//server.properties
#broker标识符
broker.id=1
#分区数量,默认为1
num.partitions=2
#副本数量,魔人为1
offsets.topic.replication.factor=2
transaction.state.log.replication.factor=2
transaction.state.log.min.isr=2
#监听地址
listeners=PLAINTEXT://192.168.126.134:9092
#数据存储位置
log.dirs=/opt/kafka_2.13-3.4.0/kafka-logs
#zookeeper连接地址
zookeeper.connect=linux00:2181,linux01:2181,linux02:2181
- 分发&linux01,linux02节点config/server.properties修改
#分发安装包
scp -r kafka_2.13-3.4.0 linux01:/home
scp -r kafka_2.13-3.4.0 linux02:/home
#linux01节点
broker.id=2
listeners=PLAINTEXT://192.168.126.135:9092
#linux02节点
broker.id=3
listeners=PLAINTEXT://192.168.126.136:9092
- 三个节点启动Zookeeper和kafka
bin/zkServer.sh start
bin/kafka-server-start.sh -daemon config/server.properties
命令行操作
- 创建主题
bin/kafka-topics.sh \
--create \
--bootstrap-server linux01:9092,linux00:9092,linux01:9092 \
--replication-factor 2 \
--partitions 2 \
--topic topictest
- 查询主题
#查看所有主题
bin/kafka-topics.sh \
--list \
--bootstrap-server linux01:9092
#topictest主题详情
bin/kafka-topics.sh \
--describe \
--bootstrap-server linux01:9092 \
--topic topictest
#创建生产者
bin/kafka-console-producer.sh \
--broker-list linux00:9092,linux01:9092,linux02:9092 \
--topic topictest
#创建消费者
bin/kafka-console-consumer.sh \
--bootstrap-server linux00:9092,linux01:9092,linux02:9092 \
--topic topictest