背景:使用zookeeper3.4.8 的 c api写了一个客户端来测试zookeeper集群
在测试到其中一个点的时候,遇到一些困惑:
假如zookeeper集群启动了三个zookeeper实例,对应ip端口分别是:host1:port1,host2:port2,host3:port3
然后在客户端侧,调用zookeeper_init的时候,也需要提供一个ip列表。
问题就在如何配置这个ip列表:
1,假如我配置这个IP列表为host1:port1,host2:port2,host3:port3, 那么启动多个客户端,整个跑起来都正常。各个客户端会根据某个负载均衡的算法连接到不同的zookeeper实例上面。并且停掉某一个zookeeper服务,客户端能继续正常运行(切换连接到其它zookeeper服务)。
2,假如我配置这个ip列表为:host1:port1。 那么当我将host1:port1对应的zookeeper服务停到(这时还有两个zookeeper服务在正常运行),客户端就会断开连接,并且不会自动切换连接到其它zookeeper服务。客户端就会进入异常状态。
上面的问题可以总结为:在zookeeper3.4.8版本里面,客户端必须要静态配置所有zookeeper服务节点ip端口, 客户端才能更好地做容灾服务。
但是这个静态配置就破坏了分布式的思维,例如假如我现在需要对zookeeper集群扩容(从三个实例扩容到五个实例)。那么我需要更改所有客户端的ip端口静态配置并且重启客户端。
对于客户端而言,最理想的状态是,不需要关心集群里面的实现细节,也不需要关心集群的实例个数。
不过对于上面问题,在zookeeper3.5版本后,已经有提供相关api实现了。详细见https://issues.apache.org/jira/browse/ZOOKEEPER-762
收集的其它一些相关文章:
http://tech.uc.cn/?p=1189
http://tech.uc.cn/?p=974