server.1=192.168.1.131:2888:3888
server.2=192.168.1.129:2888:3888
server.3=192.168.1.134:2888:3888
server.4=192.168.1.135:2888:3888
server.5=192.168.1.136:2888:3888
docker exec -it zookeeper cat /conf/zoo.cfg
docker run --network host -d --name zookeeper --restart always -e ZOO_SERVERS="clientPort=2181 server.1=192.168.1.131:2888:3888 server.2=192.168.1.129:2888:3888 server.3=192.168.1.134:2888:3888" -e ZOO_MY_ID=1 docker.io/zookeeper:3.5.5
docker run --network host -d --name zookeeper --restart always -e ZOO_SERVERS="clientPort=2181 server.1=192.168.1.131:2888:3888 server.2=192.168.1.129:2888:3888 server.3=192.168.1.134:2888:3888 server.4=192.168.1.135:2888:3888 server.5=192.168.1.136:2888:3888" -e ZOO_MY_ID=1 docker.io/zookeeper:3.5.5
docker run --restart always -d --name kafka3 --network host -e KAFKA_ZOOKEEPER_CONNECT='192.168.1.131:2181,192.168.1.129:2181,192.168.1.134:2181' -e KAFKA_LISTENERS='PLAINTEXT://0.0.0.0:9092' -e KAFKA_BROKER_ID='2' -e KAFKA_ADVERTISED_LISTENERS='PLAINTEXT://192.168.1.129:9092' docker.io/wurstmeister/kafka:2.12-2.2.1
zookeeper节点扩展
一、启动两个zookeeper
配置文件
server.1=192.168.1.131:2888:3888
server.2=192.168.1.129:2888:3888
watch -n 0.5 -c "curl 127.0.0.1:8080/commands/mntr" #查看node02为leader
二、启动第三个节点
配置文件
server.1=192.168.1.131:2888:3888
server.2=192.168.1.129:2888:3888
server.3=192.168.1.134:2888:3888
此时node02为leader followers两个
三、可以直接修改node01、02的容器里的配置、因为此镜像的docker-entrypoint.sh会判断zoo.cfg存在就不重建,所以不用改系统变量
配置文件
server.1=192.168.1.131:2888:3888
server.2=192.168.1.129:2888:3888
server.3=192.168.1.134:2888:3888
此时leader为node03,但是停掉node01、02任何一个还是会down,所以还要重启下node03
重启顺序为:要先 stop掉 再start 顺序为: ZOO_MY_ID从大到小
这样随便停掉一个节点zookeeper集群都正常
在迁移kafka的时候。zookeeper的迁移时,一定要先同步下zookeeper的数据(让新的节点先为就集群的follower)
验证:一、旧集群node01 和node02 node02为leader
创建新集群node04和node05
让kafka集群连接新集群,则kafka数据丢失
二、旧集群node01 和node02 node02为leader
让node05 为旧集群的follower,先同步zookeeper的数据 配置为:01 02 05
stop掉所有zookeeper,
修改node05的配置 04 05
添加node04 配置04 05
启动 node05 和node04 此时05为leader
让kafka集群连接新集群。kafka数据正常
以下是kafka常用命令行总结:
0.查看有哪些主题: ./kafka-topics.sh --list --zookeeper 192.168.0.201:12181
1.查看topic的详细信息
./kafka-topics.sh -zookeeper 127.0.0.1:2181 -describe -topic testKJ1
2、为topic增加副本
./kafka-reassign-partitions.sh -zookeeper 127.0.0.1:2181 -reassignment-json-file json/partitions-to-move.json -execute
3、创建topic
./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic testKJ1
4、为topic增加partition
kafka-topics.sh --zookeeper 127.0.0.1:2181 --alter --partitions 2 --topic topic
修改位移
kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --reset-offsets --group sale_log_kaetl_group --topic topicname:1 --to-offset 3 --execute #topicname:1数字是分区
5、kafka生产者客户端命令
./kafka-console-producer.sh --broker-list localhost:9092 --topic testKJ1
6、kafka消费者客户端命令
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic testKJ1
kafka-console-consumer.sh --bootstrap-server 172.18.72.163:9092 --offset 106553 --partition 0 --topic vm_replenish_log --max-messages 1 #此处的offset是编号,从0开始
7、kafka服务启动
./kafka-server-start.sh -daemon ../config/server.properties
8、下线broker
./kafka-run-class.sh kafka.admin.ShutdownBroker --zookeeper 127.0.0.1:2181 --broker #brokerId# --num.retries 3 --retry.interval.ms 60
shutdown broker
9、删除topic
./kafka-run-class.sh kafka.admin.DeleteTopicCommand --topic testKJ1 --zookeeper 127.0.0.1:2181
./kafka-topics.sh --zookeeper localhost:2181 --delete --topic testKJ1
10、查看consumer组内消费的offset
kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --offsets --describe --group reduce_group #显示的是offset的位置 从1开始,
单节点kafka和zookeeper扩展为双节点步骤及问题
原主机node01,扩展主机node02
node01:
docker run --network host -d --name zookeeper --restart always -e ZOO_SERVERS="clientPort=2181 server.1=10.201.5.14:2888:3888" -e ZOO_MY_ID=1 docker.io/zookeeper:3.5.5
docker run --restart always -d --name kafka --network host -e KAFKA_ZOOKEEPER_CONNECT='10.201.5.14:2181' -e KAFKA_LISTENERS='PLAINTEXT://0.0.0.0:9092' -e KAFKA_BROKER_ID='1' -e KAFKA_ADVERTISED_LISTENERS='PLAINTEXT://10.201.5.14:9092' docker.io/wurstmeister/kafka:2.12-2.2.1
此时node01 zookeeper为tandalone
node02:扩展
docker run -d --name zookeeper --restart always --network host -e ZOO_SERVERS="clientPort=2181 server.1=10.201.5.14:2888:3888 server.2=10.201.5.15:2888:3888" -e ZOO_MY_ID=2 docker.io/zookeeper:3.5.5
修改node01 zookeeper配置文件
server.1=10.201.5.14:2888:3888
server.2=10.201.5.15:2888:3888
并重启node01,此时集群已建立,node01为leader,node02会同步node01的数据。(集群扩展式,必须要同步数据。不能把旧zookeeper删除新建,这样kafka的数据会丢失。kafka的元数据存在zookeeper里)按道理会从ZOO_MY_ID大的节点选举leader,但是node01上面已经有数据了。
docker run --restart always -d --name kafka002 --network host -e KAFKA_ZOOKEEPER_CONNECT='10.201.5.14:2181,10.201.5.15:2181' -e KAFKA_LISTENERS='PLAINTEXT://0.0.0.0:9092' -e KAFKA_BROKER_ID='2' -e KAFKA_ADVERTISED_LISTENERS='PLAINTEXT://10.201.5.15:9092' wurstmeister/kafka:2.12-2.2.1
验证kafk双节点高可用
kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
kafka-topics.sh -zookeeper 127.0.0.1:2181 -describe -topic test
会显示副本为1,数据在哪个节点上,leader是谁。
kafka-console-producer.sh --broker-list 192.168.1.131:9092 --topic test
发消息
kafka-console-consumer.sh --bootstrap-server 192.168.1.129:9092 --from-beginning --topic test
收消息
收发消息正常
此时,windows客户端连接kafka,无论连接哪个节点,都能看到消息。
但是关闭掉存数据的kafka后,windows客户端连接kafka就看不到消息了。再次启动刚刚关闭的kafka,恢复
所以需要要备份数据,使ReplicationFactor等于2
kafka-reassign-partitions.sh --zookeeper 127.0.0.1:2181 --reassignment-json-file json.json --execute
文件内容实例:
{
"version": 1,
"partitions": [
{
"topic": "zerg.hydra",
"partition": 0,
"replicas": [
1,
2
]
},
{
"topic": "zerg.hydra",
"partition": 1,
"replicas": [
1,
2
]
},
{
"topic": "zerg.hydra",
"partition": 2,
"replicas": [
1,
2
]
}
]
}
此时,windows客户端连接kafka,无论连接哪个节点,都能看到消息。随便停掉一个kafka也可以看到。
但是,消费消息时失败。leader节点停掉后,kafka的leader成功切换了也不行
原因是消费消息时跟这个topic: __consumer_offsets 有关。但是__consumer_offsets只有一个节点只有数据。
所以也要备份__consumer_offsets。
kafka-reassign-partitions.sh --zookeeper 127.0.0.1:2181 --reassignment-json-file json.json --execute
因为它的partition有很多,一下为生成文件脚本
#!/bin/bash
for i in {0..49}
do
echo """{
"topic": "zerg.hydra",
"partition": $i,
"replicas": [
1,
2
]
},""" >> test.txt
done
生成后,再补充下
这样kafka就高可用了
如果还不行,有可能是kafka的元数据没更新leader。kafka的元数据在zookeeper里存着
zookeeper shell命令 修改元数据
zkCli.sh -server localhost:2181
>> ls /
>> ls /brokers/topics/test08/partitions/0/state
>> get /brokers/topics/test08/partitions/0/state
>> {"controller_epoch":14,"leader":2,"version":1,"leader_epoch":2,"isr":[1,2]}
删除元数据
https://www.cnblogs.com/xiaodf/p/6289383.html
https://blog.csdn.net/jiaotongqu6470/article/details/78495147
kafka配置文件:如果一下数值改为2、则当只启动一个kafka,也会消费失败的,因为__consumer_offsets 主题会创建失败。
############################# Internal Topic Settings #############################
# The replication factor for the group metadata internal topics "__consumer_offsets" and "__transaction_state"
# For anything other than development testing, a value greater than 1 is recommended for to ensure availability such as 3.
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
kafka基本原理及leader,replica,isr介绍
https://www.cnblogs.com/answerThe/p/11267454.html
更改replicas和isr数量:kafka-reassign-partitions.sh --zookeeper 127.0.0.1:2181 --reassignment-json-file json.json --execute
json文件:
{
"version": 1,
"partitions": [
{
"topic": "test",
"partition": 0,
"replicas": [
1,
2
],
"isr":[1,2]
}
]
}