1、准备工作
涉及4台主机 docker :
主机名称 | IP地址 | 部署服务 |
---|---|---|
master | 192.168.67.200 | zookeepr + kafka |
cluster1 | 192.168.67.201 | zookeepr + kafka |
cluster2 | 192.168.67.202 | zookeepr + kafka |
cluster3 | 192.168.67.203 | zookeepr + kafka |
2、关闭防火墙
集群所有节点都需要改。
查看防火墙状态:
systemctl status firewalld
停止防火墙:
sudo systemctl stop firewalld
禁用防火墙:
sudo systemctl disable firewalld
当然,也可以防火墙对指定端口放行。
3、拉取 zookeeper 镜像
集群节点机器分别拉取,版本为:3.7.0
docker pull zookeeper
4、运行 zookeeper 容器
master 执行启动容器命令:
docker run -d --restart=always \
--name zookeeper-master \
--network host \
-e ZOO_MY_ID=1 \
-p 2181:2181 \
-p 2888:2888 \
-p 3888:3888 \
-e ZOO_SERVERS="clientPort=2181 server.1=192.168.67.200:2888:3888 server.2=192.168.67.201:2888:3888 server.3=192.168.67.202:2888:3888 server.4=192.168.67.203:2888:3888" \
-t zookeeper
cluster1 启动容器命令:
docker run -d --restart=always \
--name zookeeper-cluster1 \
--network host \
-e ZOO_MY_ID=2 \
-p 2181:2181 \
-p 2888:2888 \
-p 3888:3888 \
-e ZOO_SERVERS="clientPort=2181 server.1=192.168.67.200:2888:3888 server.2=192.168.67.201:2888:3888 server.3=192.168.67.202:2888:3888 server.4=192.168.67.203:2888:3888" \
-t zookeeper
cluster2 启动容器命令:
docker run -d --restart=always \
--name zookeeper-cluster2 \
--network host \
-e ZOO_MY_ID=3 \
-p 2181:2181 \
-p 2888:2888 \
-p 3888:3888 \
-e ZOO_SERVERS="clientPort=2181 server.1=192.168.67.200:2888:3888 server.2=192.168.67.201:2888:3888 server.3=192.168.67.202:2888:3888 server.4=192.168.67.203:2888:3888" \
-t zookeeper
cluster3 启动容器命令:
docker run -d --restart=always \
--name zookeeper-cluster3 \
--network host \
-e ZOO_MY_ID=4 \
-p 2181:2181 \
-p 2888:2888 \
-p 3888:3888 \
-e ZOO_SERVERS="clientPort=2181 server.1=192.168.67.200:2888:3888 server.2=192.168.67.201:2888:3888 server.3=192.168.67.202:2888:3888 server.4=192.168.67.203:2888:3888" \
-t zookeeper
参数解释:
-e ZOO_MY_ID:集群中每个节点的唯一标识
-e ZOO_SERVERS:zookeeper 集群的连接信息,其中的clientPort=2181为指定监听端口,zookeeper 为集群时,用空格分隔且用半角双引号""包裹
由以上命令创建的 zoo.cfg 配置如下:
进入容器,查看状态
docker exec -it 容器id bash
进入 bin 目录:
cd bin/
查看状态:
./zkServer.sh status
注意:
如果出现这种错误提示:Error contacting service. It is probably not running。说明目前集群只是单节点模式,因为只启动了一台集群节点,需要3台以上节点才可以形成集群。
正常集群效果:
通过8080访问状态:
http://192.168.67.200:8080/commands/stat
6、运行 kafka 容器
master 启动容器命令:
docker run -d --restart=always \
--name kafka-master \
--network host \
-p 9092:9092 \
-e KAFKA_BROKER_ID=1 \
-e KAFKA_ZOOKEEPER_CONNECT="192.168.67.200:2181,192.168.67.201:2181,192.168.67.202:2181,192.168.67.203:2181" \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.67.200:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-e KAFKA_CFG_NUM_PARTITIONS=3 \
-e KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3 \
-t wurstmeister/kafka
cluster1 启动容器命令:
docker run -d --restart=always \
--name kafka-cluster1 \
--network host \
-p 9092:9092 \
-e KAFKA_BROKER_ID=2 \
-e KAFKA_ZOOKEEPER_CONNECT="192.168.67.200:2181,192.168.67.201:2181,192.168.67.202:2181,192.168.67.203:2181" \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.67.201:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-e KAFKA_CFG_NUM_PARTITIONS=3 \
-e KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3 \
-t wurstmeister/kafka
cluster2 启动容器命令:
docker run -d --restart=always \
--name kafka-cluster2 \
--network host \
-p 9092:9092 \
-e KAFKA_BROKER_ID=3 \
-e KAFKA_ZOOKEEPER_CONNECT="192.168.67.200:2181,192.168.67.201:2181,192.168.67.202:2181,192.168.67.203:2181" \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.67.202:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-e KAFKA_CFG_NUM_PARTITIONS=3 \
-e KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3 \
-t wurstmeister/kafka
cluster3 启动容器命令:
docker run -d --restart=always \
--name kafka-cluster3 \
--network host \
-p 9092:9092 \
-e KAFKA_BROKER_ID=4 \
-e KAFKA_ZOOKEEPER_CONNECT="192.168.67.200:2181,192.168.67.201:2181,192.168.67.202:2181,192.168.67.203:2181" \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.67.203:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-e KAFKA_CFG_NUM_PARTITIONS=3 \
-e KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3 \
-t wurstmeister/kafka
参数解释:
-e KAFKA_BROKER_ID=0:Broker 集群中每个节点的唯一标识
-e KAFKA_ZOOKEEPER_CONNECT:zookeeper 集群的连接信息,Kafka 使用 zookeeper 管理集群元数据,zookeeper 为集群时,用逗号分隔且用半角双引号""包裹
-e ALLOW_PLAINTEXT_LISTENER:允许明文监听
-e KAFKA_ADVERTISED_LISTENERS:告监听器地址,用于外部访问
-e KAFKA_LISTENERS:节点监听的地址和端口,用于接收客户端连接
-e KAFKA_CFG_NUM_PARTITIONS:如果创建topic时没有给出划分partitions个数,这个数字将是topic下partitions数目的默认数值。默认1
-e KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR:默认备份份数,仅指自动创建的topics。默认1
7、验证 kafka
Ⅰ.进入 master kafka容器:
docker exec -it 容器id bash
Ⅱ.进入 kafka bin目录,opt 目录下有俩kafka,随便进入其中一个的 bin 目录都可以。
cd /opt/kafka/bin
Ⅲ.创建 topic
./kafka-topics.sh --create --zookeeper 192.168.67.200:2181 --replication-factor 3 --partitions 5 --topic testTopic
或
./kafka-topics.sh --create --bootstrap-server 192.168.67.200:9092 --replication-factor 3 --partitions 5 --topic testTopic
Ⅳ.集群其他节点查看 topic,执行Ⅰ、Ⅱ步进入到 bin 目录。
./kafka-topics.sh --list --zookeeper 192.168.67.200:2181
或
./kafka-topics.sh --list --bootstrap-server 192.168.67.200:9092
Ⅴ.查看 topic 详情,执行Ⅰ、Ⅱ步进入到 bin 目录。
./kafka-topics.sh --describe --zookeeper 192.168.67.200:2181 --topic testTopic
或
./kafka-topics.sh --describe --bootstrap-server 192.168.67.200:9092 --topic testTopic
结果说明:
Topic: TestTopic 主题名
TopicId:主题编号
PartitionCount: 5 表示有5个分区
ReplicationFactor:3 表示有3个副本节点
Leader:主题节点号,
Replicas:表示主题副本节点有 BrokerId=1、3、4(包括Leader Replica和Follower Replica,且不管是否存活)
Isr:表示存活并且同步Leader节点的副本有BrokerId=1、3、4
Ⅵ.删除 topic,执行Ⅰ、Ⅱ步进入到 bin 目录。
./kafka-topics.sh --zookeeper 192.168.67.200:2181--delete --topic testTopic
或
./kafka-topics.sh --bootstrap-server 192.168.67.200:9092 --delete --topic testTopic
Ⅶ.生产者和消费者测试,执行Ⅰ、Ⅱ步进入到 bin 目录。
1.在 master 节点创建生产者
./kafka-console-producer.sh --broker-list 192.168.67.200:9092 --topic testTopic
2.在其他集群节点创建消费者
./kafka-console-consumer.sh --bootstrap-server 192.168.67.200:9092 --topic testTopic --from-beginning
文章评论