kafka理论和集群实现

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:

在这里插入图片描述

  1. 首先是用二分查找确定它是在哪个LogSegment中,自然是在第一个Segment中。
  2. 打开这个Segment的index文件,也是用二分查找找到offset小于或者等于指定offset的索引条目中最大的那个offset。自然offset为6的那个索引是我们要找的,通过索引文件我们知道offset为6的Message在数据文件中的位置为9807。
  3. 打开数据文件,从位置为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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值