目录
二次启动遇到的问题:
+++++++++++++++++++++++++++++++++++++++++++++++++
问题1:
问题2:
问题3:
问题4:
+++++++++++++++++++++++++++++++++++++++++++++++++
过程
1. 环境:
2. 虚拟机3台:
3. 拉取镜像:
4. 推送镜像:(将镜像推送到其他服务器,要比再下载一次快很多)
测试:
猜想:
springboot 与 kafka 继承测试,到生产环境的时候怎么进行kakfa配置文件的配置,怎么在项目中进行配置
-------------------------------------------------------------------
二次启动遇到的问题:
在将虚拟机关闭之后,再次开启 kafka 镜像服务的时候,会出现立即关闭的情况,这个时候,应该是zookeeper 集群没有正常的工作,通过
docker logs 容器名称
进到 zookeeper 容器里面查看,发现集群确实没有正常的工作。
因为在配置zookeeper 集群的时候,由于防火墙的问题,端口之间不能正常的进行通信,造成集群不能相互的识别对方,以至于不能正常的工作。
再次查看发现该节点变为zookeeper 的从节点
然后开启防火墙,启动 kafak 容器,正常的工作
其他的节点,也需要同样的操作,
关闭防火墙
等待zookeeper 集群关系建立
开启防火墙
开启kakfa 容器
脚本:
fireStart=`systemctl start firewalld.service`
if [ $? -eq 0 ];then
echo '防火墙启动成功。。。。。。。'
else
echo '防火墙启动失败!!!!!'
exit 1
fi
kafkaStart=`docker start wurstmeister-kafka`
if [ $? -eq 0 ];then
echo 'kafka容器启动成功。。。。。。。'
else
echo 'kafka容器启动失败!!!!!'
exit 1
fi
fireStop=`systemctl stop firewalld.service`
if [ $? -eq 0 ];then
echo '防火墙关闭成功。。。。。。。'
else
echo '防火墙关闭失败!!!!!'
exit 1
fi
先修改为可执行文件,然后通过scp 将 文件拷贝到 其他服务器上面
+++++++++++++++++++++++++++++++++++++++++++++++++
问题1:
仔细检查发现是,ip地址写错了,因为命令是从网上复制下来,然后进行修改的,修改的过程中可能是手误写错了。
ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTING
at kafka.zookeeper.ZooKeeperClient.$anonfun$waitUntilConnected$3(ZooKeeperClient.scala:259)
at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:253)
at kafka.zookeeper.ZooKeeperClient.waitUntilConnected(ZooKeeperClient.scala:255)
at kafka.zookeeper.ZooKeeperClient.<init>(ZooKeeperClient.scala:113)
at kafka.zk.KafkaZkClient$.apply(KafkaZkClient.scala:1858)
at kafka.server.KafkaServer.createZkClient$1(KafkaServer.scala:375)
at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:399)
at kafka.server.KafkaServer.startup(KafkaServer.scala:207)
at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:44)
at kafka.Kafka$.main(Kafka.scala:84)
at kafka.Kafka.main(Kafka.scala)
出现这个问题导致kafka容器在启动之后,无法连接到zookeeper集群,导致连接超时自动停止。
docker run -i -t -d --network host --name wurstmeister-kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.44.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.44.100:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka
仔细检查,发现是ip地址写错了,修改后的情况是:
docker run -i -t -d --network host --name wurstmeister-kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.232.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.100:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka
问题2:
WARNING: Published ports are discarded when using host network mode
因为同时指定了,docker容器的网络模式,又指定了 -p 的参数,导致冲突。容器在创建成功后,同样是自动关闭。
将 -p 参数去掉,或者使用brige桥接模式。
问题3:
ERROR Error while creating ephemeral at /brokers/ids/0, node already exists and owner '4840915402754' does not match current session '4840915402755' (kafka.zk.KafkaZkClient$CheckedEphemeral)
ERROR [KafkaServer id=0] Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
org.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode = NodeExists
修改创建容器的时候-e KAFKA_BROKER_ID=0 参数0修改为其他的值
问题4:
ERROR [KafkaServer id=2] Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
java.lang.IllegalArgumentException: requirement failed: Configured end points 192.168.232.100:9092 in advertised listeners are already registered by broker 0
说的是192.168.232.100:9092 这台机器已经有 broker 0 注册,并且正在监听
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.102:9092
修改该参数的 ip地址 为集群中的其他服务器的 IP地址
+++++++++++++++++++++++++++++++++++++++++++++++++
过程
1. 环境:
zookeeper服务器的搭建,搭建kafka实在zookeeper集群的基础上进行的,使用的内容基本上一致,不过这边搭建的时候没有写脚本进行简单的搭建。过程稍微有点麻烦。
在创建kafka 集群的时候发现,我的防火墙一直是关闭的,但是kafka容器创建成功了,(一般情况下,防火墙关闭容器是无法创建成功,在给容器分配ip地址的时候是需要防火墙进行分配的。)这个我在后面验证了一下是什么原因。(没有找到,只是进行了猜想),有兴趣的话本页面,搜索(猜想)
2. 虚拟机3台:
192.168.232.100,192.168.232.101,192.168.232.102(使用静态的ip地址)
3. 拉取镜像:
docker pull wurstmeister/kafka
(在网上查找资料发现,不用非得使用wurstmeister/zookeeper,这个zookeeper镜像,我两个都下载了,发现wurstmeister/zookeeper镜像要比 zookeeper大很多,目前搭建kafka集群是没有发现连个镜像有什么区别,在网上查找资料也没有明确的说明)
4. 推送镜像:(将镜像推送到其他服务器,要比再下载一次快很多)
docker save -o kafka.tar wurstmeister/kafka (打包镜像)
scp kafka.tar root@192.168.232.101:~ (推送镜像)(示范,这个是推送到101机器的root用户根目录下)
docker load -i kafka.tar (导入镜像)(在 root用户的根目录下进行操作)
5. 创建容器:
docker run -i -t -d --network host --name wurstmeister-kafka -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.232.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.100:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka
docker run -i -t -d --network host --name wurstmeister-kafka -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=192.168.232.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.101:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka
docker run -i -t -d --network host --name wurstmeister-kafka -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=192.168.232.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.102:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka
保证KAFKA_BROKER_ID=0 ,broker的值都不一样
KAFKA_ZOOKEEPER_CONNECT=192.168.232.100:2181,ip地址是集群中任意一个ip就行,端口2181根据自己集群的设置内容进行配置
监听的地址KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.100:9092,ip地址是集群中任意一个就行,端口9092根据实际情况进行配置。
测试:
在kafka容器里面运行命令: 使用 find / -name *.sh 查看脚本在哪个文件夹,在文件内才能执行
生产:
kafka-console-producer.sh --broker-list 192.168.232.100:9092 --topic firstTopic
查询上传的数据
kafka-console-consumer.sh --bootstrap-server 192.168.232.100:9092 --topic firstTopic --from-beginning
查看集群中所有的topic
kafka-topics.sh --bootstrap-server 192.168.232.100:9092 --list
查看topic状态
kafka-topics.sh --bootstrap-server 192.168.232.100:9092 --describe --topic firstTopic
查看group 列表
kafka-consumer-groups.sh --bootstrap-server 192.168.232.100:9092 --list
查看消费group 的消费记录
kafka-consumer-groups.sh --bootstrap-server 192.168.232.100:9092 --describe --group firstGroup
-- 对topic的操作,必须使用的是 --zookeeper
修改topic的partion个数
kafka-topics.sh --zookeeper 192.168.232.100:2181 -alter --topic firstTopic --partition 6
删除topic
kafka-topics.sh --zookeeper 192.168.232.100:2181 --delete --topic firstTopic
手动创建,studentTopic,拥有两个备份,6个分区
kafka-topics.sh --zookeeper 192.168.232.100:2181 --create --replication-factor 2 --partition 6 --topic studentTopic
producer生产消息的数量,最大位置
kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 192.168.232.100:9092 --topic firstTopic --time -1
从101,102向topic 发送数据,在100成功监听到数据,可以正常使用
++++++++++++++++++++++++++++++++++++++++++++++++++++++
猜想:
首先怀疑的是 --network host 设置的网络方式,
容器起来之后,马上停止了
查看容器的详细信息,发现没有分配ip地址
查看 wurstmeister-kafka 日志 docker logs wurstmeister-kafka
ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTING
发现是连接zookeeper 超时,导致,kakfa容器自动停止运行,
1、可能是kakfa在创建的时候不需要分配 ip 地址,
2、如果不指定容器的网络模式,会导致容器之间无法进行通信。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
可以看到,这里是通过 -e 参数直接对配置文件的修改,这种方式还没有做文件夹的映射,
1.对配置文件的修改不方便容器中只能是用vi 对文件进行编辑,
2.数据文件的存储不安全,容器删掉了数据就丢失了。
docker run -i -t -d --network host --name wurstmeister-kafka -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=192.168.232.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.101:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka
-e 参数是对 /opt/kafka/config 的文件进行了配置。
升级版,通过 文件映射 方式创建容器:
包含kafka 部分高可用调优,与消费速度提升优化