简单玩一下kafka

背景

这玩意(中间件)虽然常用,但还真没实际玩一玩,今天搞搞,看看基本玩法

简单理解一些概念

  • brocker 一台kafka机器就是一个broker。一个集群包含多个broker。一个brocker包含多个topic
  • 一个topic有多个分区partition。一个topic有消费者和生产者。
  • Consumer消费者。多个消费者组成消费者组Consumer Group
  • offset消费位移

安装

  • 认准下面这两,才是官方镜像。confluentinc就认准这个就对了~~其他镜像不知道谁打包的
    1
    2
    docker pull confluentinc/cp-zookeeper
    docker pull confluentinc/cp-kafka
  • 启动镜像咯
    1
    2
    3
    4
    5
    6
    //注意这样子启动,两个容器无法通信,需要先创建一个新的网络,然后run容器 --net=<network_name>才可以确保两个容器通信。为了简单后面直接docker-compose执行
    docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=/172.20.224.159:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://172.20.224.159:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 confluentinc/cp-kafka


    docker run -d --name zookeeper -e TZ="Asia/Shanghai" -p 2181:2181 -v $PWD/data:/data -e ZOOKEEPER_CLIENT_PORT=2181 confluentinc/cp-zookeeper

  • zookeeper启动解释
  1. -d:以分离模式运行容器,这意味着容器将在后台运行。
  2. –name zookeeper:为容器指定一个名称,以便以后可以更容易地引用它。
  3. -p 2181:2181:将容器的 2181 端口映射到宿主机的 2181 端口
  4. -e ZOOKEEPER_CLIENT_PORT=2181:设置环境变量 ZOOKEEPER_CLIENT_PORT 的值为 2181。这将告诉 Zookeeper 在 2181 端口上监听客户端连接。
  5. -e TZ=”Asia/Shanghai”设置时区
  6. -v $PWD/data:/data 将本地目录(文件)挂载到容器指定目录
  • kafka启动解释
  1. -e KAFKA_BROKER_ID=0:设置环境变量 KAFKA_BROKER_ID 的值为 0。这将指定 Kafka broker 的 ID
  2. -e KAFKA_ZOOKEEPER_CONNECT=192.168.1.1:2181:设置环境变量 KAFKA_ZOOKEEPER_CONNECT 的值为 192.168.1.1:2181。这将指定 Kafka broker 连接的 Zookeeper 地址和端口
  3. -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.1:9092:设置环境变量 KAFKA_ADVERTISED_LISTENERS 的值为 PLAINTEXT://192.168.1.1:9092。这将指定 Kafka broker 对外宣布的监听地址和端口

直接docker compose吧,省事

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '3'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181

kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- 29092:29092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
1
docker-compose -f docker-compose.yml -d up

先简单使用,再看怎么玩其他的

  • 咱先进入kafka容器看看docker exec -it xxxxx bash
1
2
3
4
5
//先看看帮助,太长就不列出来了
kafka-topics --help
kafka-console-consumer --help
kafka-console-producer --help
//注意,根据help,新版kafka已经不用--zookeeper这个命令参数了,改用--bootstrap-server
  • 看看怎么列出所有主题,然后做个简单创建和消费
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //创建一个主题
    kafka-topics --create --topic raintest --bootstrap-server localhost:9092
    //查看主题
    kafka-topics --list --bootstrap-server localhost:9092
    //生产
    kafka-console-producer --broker-list localhost:9092 --topic raintest
    //消费
    kafka-console-consumer --bootstrap-server localhost:9092 --topic raintest --from-beginning
    //--from-beginning是一个命令行选项,用于指定消费者从主题的开始处开始消费消息
    //查看组
    kafka-consumer-groups --bootstrap-server localhost:9092 --list
    //查看消费情况
    kafka-consumer-groups --bootstrap-server localhost:9092 --group group111 --describe

    //还有好多待补充,这里暂不细究了

其他发现

这个docker-compose.yaml用的最新版的kafka,设定了KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181,但是实际上最新版Kafka开始使用自我管理的Quorum代替ZooKeeper来管理元数据。这也意味着新版kafka不需要zookeeper作为必须了。因此查看容器日志发现会有链接失败的信息。但是我尝试创建主题和生产、消费主题并没有问题。而且命令中不需要--zookeeper了。
https://cloud.tencent.com/developer/news/841740
https://www.confluent.io/blog/kafka-without-zookeeper-a-sneak-peek/

后续

回去https://hub.docker.com/r/confluentinc/cp-kafka 看看更详细的介绍
https://docs.confluent.io/platform/current/installation/docker/config-reference.html#confluent-ak-configuration
根据手册,提供了两种mode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/kpaft mode
docker run -d \
--name=kafka-kraft \
-h kafka-kraft \
-p 9101:9101 \
-e KAFKA_NODE_ID=1 \
-e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP='CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT' \
-e KAFKA_ADVERTISED_LISTENERS='PLAINTEXT://kafka-kraft:29092,PLAINTEXT_HOST://localhost:9092' \
-e KAFKA_JMX_PORT=9101 \
-e KAFKA_JMX_HOSTNAME=localhost \
-e KAFKA_PROCESS_ROLES='broker,controller' \
-e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
-e KAFKA_CONTROLLER_QUORUM_VOTERS='1@kafka-kraft:29093' \
-e KAFKA_LISTENERS='PLAINTEXT://kafka-kraft:29092,CONTROLLER://kafka-kraft:29093,PLAINTEXT_HOST://0.0.0.0:9092' \
-e KAFKA_INTER_BROKER_LISTENER_NAME='PLAINTEXT' \
-e KAFKA_CONTROLLER_LISTENER_NAMES='CONTROLLER' \
-e CLUSTER_ID='MkU3OEVBNTcwNTJENDM2Qk' \
confluentinc/cp-kafka:7.5.0


/zookeeper mode
docker run -d \
--net=host \
--name=kafka \
-e KAFKA_ZOOKEEPER_CONNECT=localhost:32181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:29092 \
-e KAFKA_BROKER_ID=2 \
-e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
confluentinc/cp-kafka:7.5.0

本文不再细说。
kraft mode详细参考https://docs.confluent.io/platform/current/kafka-metadata/kraft.html#kraft-overview


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!