ZooKeeper 的节点分 leader、follower、observer,前两个投票,observer 不投票。Learner 又是什么?这篇用 3 个投票节点加 2 个 observer 的集群验证:谁算多数派、observer 怎么写、对延迟有什么影响。
z28-1 myid 1 → follower z28-2 myid 2 → leader z28-3 myid 3 → follower z28-4 myid 4 → observer z28-5 myid 5 → observer 配置里 observer 的写法: ['peerType=observer', 'server.4=127.0.0.1:7403:7503:observer', 'server.5=127.0.0.1:7404:7504:observer'] leader 的 zk_followers = None zk_synced_followers = 2 zk_synced_observers = 2
「learner」是 follower 与 observer 的统称(日志里的 LearnerHandler 就是 leader 为每个 learner 开的处理线程)。
存活节点的 Mode: {'z28-2': '(不服务)', 'z28-4': '(不服务)', 'z28-5': '(不服务)'}
通过 observer 写入: 失败(没有多数派) 各节点 Mode: {'z28-1': 'follower', 'z28-2': 'leader', 'z28-4': 'observer', 'z28-5': 'observer'}
通过 observer 写入:成功(observer 把写请求转给 leader),读回 b'v'各轮(3 轮交替):3 投票 = ['5.95', '5.95', '6.96'] | 3 投票 + 2 observer = ['7.09', '7.75', '7.21'] 中位数:3 个投票节点 5.95 ms;3 投票 + 2 observer 7.21 ms
这个差别在不同环境里可能不同(跨机房时 observer 的作用主要是不让远端节点参与投票),本文只测了单机。