【Zookeeper】Zookeeper集群单节点提供服务

  如下只在特殊状况下使用,不要用在生产环境。html

1、问题背景

  公司的产品使用Zookeeper作为集群支持,可是客户在验收的时候提出了一个很为难人的要求,那就是3台集群服务,中止2台之后,还要求咱们的应用能提供服务,这就有点难为人了。java

  由于用过Zookeeper的人都知道,Zookeeper的leader的选举须要大多数赞成,也就是说三台机器的Zookeeper集群那么选举leader就须要两台,若是只剩下一台Zookeeper那么是没法完成leader选举的,也就是说Zookeeper将不能对外提供服务。算法

  我是在公司研发群里获得别的研发团队的帮助请求,而我正好在研究Zookeeper,因此给出了解决方案,并测试经过。apache

2、解决方案

  解决方法仍是比较简单的,此处再也不讲解Zookeeper的leader选举,后续能够参照个人博客,Zookeeper leader选举测试

2.1 修改源码

  修改org.apache.zookeeper.server.quorum.flexible.QuorumHierarchical类的containsQuorum方法为:flex

public boolean containsQuorum(HashSet<Long> set){
  return true;
}

  修改org.apache.zookeeper.server.quorum.flexible.QuorumMaj类的containsQuorum方法为:spa

public boolean containsQuorum(HashSet<Long> set){
  return true;
}

  这两个方法是关于选举的算法,应用了大多数原则,如今直接去掉。code

2.2 打包

  将这两个类单独打包,命名为_patch-0.1.jar,这么命名的目的就是,加载的时候优先加载我修改的类,下划线优先加载。server

2.3 安装及测试步骤

2.3.1 安装

  首先中止Zookeeper集群。htm

  而后将压缩包解压获得的_patch-0.1.jar放置到每一个节点的:${zkPath}/lib/下。

2.3.2 测试

  1. 在集群未启动时,使用zk客户端链接集群(-server ip:port,ip:port,ip:port),此时客户端会持续报链接异常,而后启动任意一个节点,zk客户端就能正常使用。
  2. 集群彻底启动后,任意中止其中两个,zk依然能够提供服务,客户端能正常使用,
  3. 使用java的zk客户端zkclient-0.8.jar进行测试,测试经过

2.4 注意事项

  测试比较简单,只涉及到单节点提供服务以及leader选举,未通过更深层次的测试,不建议在正式生产环境下使用,因此经过测验之后,建议移除单节点支持。移除方式:依次将每一个节点中止服务->移除补丁包->重启;便可。

相关文章
相关标签/搜索