我有两个程序,fc(failoverController) 和 web(webServer)。我使用zookeeper来确保高可靠性。
fc会部署在两台服务器上,两台fc使用apache-curator LeaderSelector选举master,master会启动一个web进程,web进程提供服务。为了不放弃领导,我在函数 takeLeadership() 的末尾使用了 while(true)。
但是在某种情况下,我们自定义部署zookeeper在三个vmware esxi虚拟机上。他们每天都会对三个虚拟机(快照虚拟机内存)进行快照。
有一天,出现了一个奇怪的现象,fc1成为master,几毫秒,fc2成为master,前后的时间差很短。这在我们的程序中触发了一个错误,我们有两个 master。
为了解决这个问题,我们使用了一个 AtomBoolean var,声明 zk 状态是 LOST 还是 SUSPEND,并使用这个 var 标记是否退出 takeLeadership。
现在我想测试这两个master case,如何构建一个zookeeper jitter导致多次快速选举的场景。
我已经测试了以下操作,但无法重现:
- zk 服务频繁重启。
- 使用 tcpkill 杀死 fc 到 zk 端口之一。