1.前言
kafka
服务端存在相当多的术语,只有了解这些术语具体的含义,我们才能对kafka
有一个粗略的认识。本文将带着你去了解以及理清相关术语,让你不再对其感到陌生以及恐惧。
2.集群搭建
工欲善其事必先利其器
,在正式开始前,我们需要搭建一个kafka集群
集群搭建选择使用docker-compose
方式,使用该方式的好处就是:在docker-compose.yml
文件编写完成的情况下,只需要一条命令即可实现集群的运行
与停止
2.1 编写docker-compose.yml
version: "3"
services:
zookeeper:
image: 'zookeeper:latest'
ports:
- '2181:2181'
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
kafka0:
image: 'bitnami/kafka:latest'
ports:
- '9092:9092'
environment:
- KAFKA_BROKER_ID=0
- KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.0.101:9092
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
depends_on:
- zookeeper
kafka1:
image: 'bitnami/kafka:latest'
ports:
- '9093:9093'
environment:
- KAFKA_BROKER_ID=1
- KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.0.101:9093
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
depends_on:
- zookeeper
kafka2:
image: 'bitnami/kafka:latest'
ports:
- '9094:9094'
environment:
- KAFKA_BROKER_ID=2
- KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9094
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.0.101:9094
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
depends_on:
- zookeeper
注意:如果希望通过宿主机连接kafka集群,需要添加
KAFKA_CFG_LISTENERS
和KAFKA_CFG_ADVERTISED_LISTENERS
配置并且KAFKA_CFG_ADVERTISED_LISTENERS
配置地址为宿主机对应ip
KAFKA_CFG_ADVERTISED_LISTENERS
为暴露给客户端的监听地址
2.2 运行集群
在编写完docker-compose.yml
文件后,只需下面的一条命令即可完成集群的运行
docker-compose up -d
集群运行正常,你将看到如下内容输出
Creating network "kafka_default" with the default driver
Creating kafka_zookeeper_1 ... done
Creating kafka_kafka0_1 ... done
Creating kafka_kafka2_1 ... done
Creating kafka_kafka1_1 ... done
2.3 停止集群
如果你想停止集群,那么同样可以使用一条命令来实现
docker-compose down
3.概念
3.1 主题
主题(topic)
作为一个逻辑概念,在系统中主要用于区分业务场景,比如可以为下单场景创建一个topic:create-order
,为加入购物车场景创建一个topic:add-cart
3.1.1 创建主题
bin/kafka-topics.sh --create --topic create-order --bootstrap-server 127.0.0.1:9092 --partitions 3 --replication-factor 3
--partitions:用于指定主题对应分区数量
--replication-factor:用于指定分区对应副本数量
3.1.2 查看主题信息
bin/kafka-topics.sh --describe --topic create-order --bootstrap-server localhost:9092
通过如上命令可以查看主题详细信息,包括:分区数量、分区leader、分区副本数、AR以及ISR
3.2 分区
在3.1
创建主题部分我们通过--partitions
参数指定了主题对应分区数
分区
作为一个物理概念,分散在各个broker
中,可以提升并发能力以及服务性能
3.3 副本
副本
的存在是为了提升分区
数据可靠性,副本分为leader
副本和flower
副本,leader
副本负责处理客户端的读写请求
,flower
副本只负责从leader
副本同步数据
3.4 AR
AR(Assigned Replicas)
:分区所有副本集合
topic
:create-order,partition0
对应AR:1,2,0
topic
:create-order,partition1
对应AR:0,1,2
topic
:create-order,partition2
对应AR:2,0,1
3.5 ISR
ISR(In-Sync Replicas)
:保持正常同步的副本集合(包含leader
副本)
topic
:create-order,partition0
对应ISR:1,2,0
topic
:create-order,partition1
对应ISR:0,1,2
topic
:create-order,partition2
对应ISR:2,0,1
3.6 OSR
OSR(Out-Of-Sync Replicas)
:与leader
副本同步滞后过多的flower
副本集合
当OSR为空时,AR = ISR,否则,AR = ISR + OSR
3.7 LE0
LEO(Log End Offset)
:分区待写入消息对应偏移量
3.8 HW
HW(High Water)
:分区所有副本都会维护自己的LEO
,副本中最小的LEO
即为HW
注意:消费者只能拉取到
HW
之前的消息进行消费
3.9 Controller
Controller
:集群协调器,负责
- 创建、删除主题,增加分区并分配leader分区;
- 集群Broker管理(新增 Broker、Broker 主动关闭、Broker 故障)
- preferred leader选举
- 分区重分配
从Controller
作用可以看到其重要性,那么Controller
是如何选举出来的呢?
在集群
启动的过程中,节点会在zookeeper
中创建controller
节点,谁先创建成功谁就是Controller
通过重启集群,可以看到
controller
节点下brokerid
对应的值也在变化
3.10 leader选举
topic
:create-order
,partition
:0
在未停掉brokerid:2的情况下,分区leader
分配在brokerid
为2
的机器上
topic
:create-order
,partition
:0
在停掉brokerid:2的情况下,分区leader
分配在brokerid
为1
的机器上
topic
:create-order
,partition
:1
在未停掉brokerid:0的情况下,分区leader
分配在brokerid
为0
的机器上
topic
:create-order
,partition
:1
在停掉brokerid:0的情况下,分区leader
分配在brokerid
为2
的机器上
由此可见,分区的
leader
的选举首选要保证在Isr
列表中,按照Replicas
列表的顺序选举
4.zookeeper中存储的信息
5.参考文献
本文正在参加「金石计划 . 瓜分6万现金大奖」