ZooKeeper 集群的「成员」是怎么定义的?配错了会怎样?这篇用静态配置的集群验证几种最常见的成员配置错误:myid 不在列表里、成员列表不一致、名单外的节点自己加入。
z49-1 myid=1:['server.1=127.0.0.1:7400:7500:participant', 'server.2=127.0.0.1:7401:7501:participant', 'server.3=127.0.0.1:7402:7502:participant'] z49-2 myid=2:['server.1=127.0.0.1:7400:7500:participant', 'server.2=127.0.0.1:7401:7501:participant', 'server.3=127.0.0.1:7402:7502:participant'] z49-3 myid=3:['server.1=127.0.0.1:7400:7500:participant', 'server.2=127.0.0.1:7401:7501:participant', 'server.3=127.0.0.1:7402:7502:participant']
退出码: 1 日志: Starting quorum peer, myid=9 日志: Unexpected exception, exiting abnormally 日志: java.lang.RuntimeException: My id 9 not in the peer list 日志: Exiting JVM with code 1
各节点 Mode: {'z49m-1': 'follower', 'z49m-2': 'leader', 'z49m-3': '不服务'}
节点 3 的 conf 成员: []这是我构造的一种不一致(少一个成员);其它的不一致(端口写错、地址不同)没有逐个测。
原 3 个节点 Mode: {'z49n-1': 'follower', 'z49n-2': 'leader', 'z49n-3': 'follower'}
新节点(myid=4)Mode: follower
原节点 leader 的 zk_synced_followers = 3
新节点 conf 里的 server 数: 4 | 原节点 conf 里的 server 数: 3
停掉原来的两个 follower,只剩原 leader + 这个「不在名单里」的新节点(2/3 个名单内成员里只剩 1 个):写入 失败(它没有被算进多数派)
此时各节点 Mode: {'z49n-2': '不服务', 'z49n-4': '不服务'}这是一个值得警惕的现象:它没有破坏一致性(多数派仍只按名单内的节点计算),但意味着配置错误的节点可能静悄悄地连上集群、读到数据。动态配置(第 50 篇)用 reconfig 来管理成员变化,不依赖这种「自己加入」。