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万现金大奖」