1. kafka基础概念
- Producer :消息生产者,就是向kafka broker发消息的客户端
- Consumer :消息消费者,向kafka broker取消息的客户端
- Topic :可以理解为一个队列
- Consumer Group (CG):消费者组,消费者以消费者组的形式订阅kafka的消息,如下图
- Broker :一台kafka服务器就是一个broker,一个集群由多个broker组成,一个broker可以容纳多个topic
- Partition:分区。一个topic的数据可以分成不同的部分在不同的节点上进行存储,这个不同的部分就叫分区
- Offset:偏移量,用来记录消费者消费消息的进度
2. kafka各部分具体说明
关于producer和consumer
在Kafka中向topic发送消息者称为Producer,从topic获取数据者称为Consumer,Consumer被定义到一个Consumer Group中,整个Kafka集群通过Zookeeper进行协调
关于分区和副本
Kafka集群由多个broker实例组成,消息按照topic进行分类存储,每个topic被分为多个分区,每个分区又存在多个副本,保证数据对可用性
关于偏移量
Partition内顺序存储,写入对消息采用追加的方式,消费者采用FIFO的方式进行拉去,一个topic由多个分区组成,分区内的数据有序,但kafka并不保证topic中的数据整体有序(只是单个分区内的数据是有序的)。
关于消费者组
为了加快读取,多个Consumer被划分为一个Consumer Group并行的消费topic中的数据,一个topic可以由多个Consumer Group订阅,多个Conser Group之间互补影响,可以同时消费同一条数据,但组内但Consumer ,同一条消息只能被一个Consumer处理,
3. kafka存储原理和稀疏索引机制
Topic的每个Partition副本对应一个物理上的目录,存储当前Partition数据,Partition中的数据以Segment为单位存储,每个segment存储一段数据,这里的segment可以理解为对数据的分段存储,也可以理解为分片。
Kafka为了提高读取效率,为每个segment创建一个数据文件和一个索引文件
下图是四个segment
要注意的是: 索引文件里的偏移量是稀疏存储的 不是连续的 下边举例说明这种稀疏索引的方式为什么比较高效
比如:要查找绝对offset为7的Message:
- 首先是用二分查找确定它是在哪个LogSegment中,自然是在第一个Segment中。
- 打开这个Segment的index文件,也是用二分查找找到offset小于或者等于指定offset的索引条目中最大的那个offset。自然offset为6的那个索引是我们要找的,通过索引文件我们知道offset为6的Message在数据文件中的位置为9807。
- 打开数据文件,从位置为9807的那个地方开始顺序扫描直到找到offset为7的那条Message。
Kafka的Message存储采用了分区(partition),分段(Segment)和稀疏索引这几个手段来达到了高效性
4. kafka集群实现
kafka依赖于zookeeper集群 首先需要搭建zookeeper集群 这里不再赘述
这里以三个主机为例进行操作
host1 host2 host3 安装kafka
[root@localhost ~]# tar -zxf kafka_2.12-2.1.0.tgz
[root@localhost ~]# mv kafka_2.12-2.1.0 /usr/local/kafka
[root@localhost ~]# cd /usr/local/kafka/config/
[root@localhost config]# vim server.properties
21 broker.id=1 #跟自己的myid对应
31 listeners=PLAINTEXT://192.168.20.104:9092 #监听的ip和端口 写本主机的IP和端口
65 num.partitions=2#分区数量 建议几个节点就设置几个分区
123 zookeeper.connect=zk1:2181,zk2:2181,zk3:2181#(三个zookeeper的IP和端口)
[root@localhost ~]# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
[root@localhost ~]# netstat -anput | grep LISTEN | grep 9092
tcp6 0 0 192.168.20.104:9092 :::* LISTEN 5933/java
集群部署完成 可以创建topic 严重kafka的可用性
模拟生产者和消费者,检验kafka集群可用性
host1上创建话题并生产消息
[root@localhost ~]# /usr/local/kafka/bin/kafka-topics.sh --create \
> --zookeeper 本主机IP:2181 \
> --replication-factor 2 --partitions 3 \
> --topic kafkatest
Created topic "kafkatest".
[root@localhost ~]# /usr/local/kafka/bin/kafka-console-producer.sh \
> --broker-list 本主机IP:9092 --topic kafkatest
>hello world
host2模拟消费者,看是否可以收到消息
[root@localhost ~]# /usr/local/kafka/bin/kafka-console-consumer.sh \
> --bootstrap-server 本主机IP:9092 \
> --topic kafkatest --from-beginning
hello world
参考资料
https://www.jianshu.com/p/255de4d3874b
https://blog.csdn.net/zhangdong2012/article/details/80316882