带你理清kafka术语

767 阅读4分钟

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_LISTENERSKAFKA_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选举

topiccreate-orderpartition0在未停掉brokerid:2的情况下,分区leader分配在brokerid2的机器上

topiccreate-orderpartition0在停掉brokerid:2的情况下,分区leader分配在brokerid1的机器上

topiccreate-orderpartition1在未停掉brokerid:0的情况下,分区leader分配在brokerid0的机器上

topiccreate-orderpartition1在停掉brokerid:0的情况下,分区leader分配在brokerid2的机器上

由此可见,分区的leader的选举首选要保证在Isr列表中,按照Replicas列表的顺序选举

4.zookeeper中存储的信息

5.参考文献

Kafka 科普

本文正在参加「金石计划 . 瓜分6万现金大奖」