Confluent平台3节点部署Kafka启动失败:ZooKeeper myid文件缺失
我之前在搭建多节点Confluent Kafka集群时也碰到过一模一样的问题,这个错误的根源很明确——ZooKeeper集群模式要求每个节点必须有一个唯一的myid文件来标识自己,而你的环境里这个文件没生成或者丢失了。
问题复现
你执行confluent start时遇到的错误:
java.lang.IllegalArgumentException: /tmp/confluent.PVghAKRg/zookeeper/data/myid文件缺失
同时伴随的日志信息:
[2018-04-09 10:54:25,995] INFO Reading configuration from: /tmp/confluent.SVNfiLFU/zookeeper/zookeeper.properties (org.apache.zookeeper.server.quorum.QuorumPeerConfig)
[2018-04-09 10:54:26,011] INFO Resolved hostname: 0.0.0.0 to address: /0.0.0.0 (org.apache.zookeeper.server.quorum.QuorumPeer)
[2018-04-09 10:54:26,011] INFO Resolved hostname: 192.168.0.36 to address: /192.168.0.36 (org.apache...
解决方案
1. 定位ZooKeeper的数据目录
从日志里找到ZooKeeper的配置文件路径/tmp/confluent.SVNfiLFU/zookeeper/zookeeper.properties,打开这个文件找到dataDir配置项,它的值就是需要存放myid文件的目录(比如你错误里的/tmp/confluent.PVghAKRg/zookeeper/data/)。
2. 为每个节点创建唯一的myid文件
ZooKeeper集群的每个节点需要一个1-255之间的唯一整数作为标识,写入myid文件中:
- 第一个节点执行:
echo 1 > /tmp/confluent.PVghAKRg/zookeeper/data/myid - 第二个节点执行:
echo 2 > /tmp/confluent.PVghAKRg/zookeeper/data/myid - 第三个节点执行:
echo 3 > /tmp/confluent.PVghAKRg/zookeeper/data/myid
⚠️ 注意:三个节点的数字必须完全唯一,不能重复。
3. 重新启动Confluent平台
先停止所有残留的Confluent进程(如果有的话):
confluent stop all
然后重新启动:
confluent start
4. (可选)规避临时目录的坑
Confluent默认会把ZooKeeper的数据目录放在临时文件夹(/tmp/开头的目录),系统重启后临时目录会被清理,下次启动又会碰到同样的问题。建议修改ZooKeeper配置文件里的dataDir到一个永久目录,比如:
dataDir=/var/lib/zookeeper/data
修改后,在每个节点的/var/lib/zookeeper/data目录下创建对应的myid文件,并确保目录有ZooKeeper进程的读写权限。
额外检查点
确保你的ZooKeeper配置文件中已经正确配置了集群节点信息,比如:
server.1=192.168.0.34:2888:3888 server.2=192.168.0.35:2888:3888 server.3=192.168.0.36:2888:3888
这里的server.X中的X要和对应节点myid文件里的数字完全一致,后面的端口分别是ZooKeeper的同步端口和选举端口。
内容的提问来源于stack exchange,提问作者Alihossein shahabi

