zookeeper(三)zk集群应该怎么实现

为什么要搭建zookeeper集群?

这个一般都没啥好说的,就是因为可能一台zookeeper可能会出现宕机的情况,为了提升系统的稳定性,就要多部署到几台机器上,还有一点就是在量很大的情况下一台机器撑不住只有多扩几台机器去分担压力。但是就会存在一个问题:如果要多部署几台,那么不同的机器接到了不同的请求就会做不一样的事,导致每台服务器都不一样。
有人会说就不能像业务系统那样吗?比如把多台服务器对应到同一个数据库中,其中一台发生了改变其它自动更新?
请想一想如果数据库连不上了呢?有人说那我可以把数据库做成集群啊。要是这样做的话你想想你想写一个集群却使用了数据库的集群技术,而且数据库使用的分布式锁效率都不高,zookeeper正是因为数据库的效率的问题才产生的。而且当多台服务器从数据库读的话,那一瞬间的压力会不会很大,最终的压力全都压在了数据库上了,不要扯使用redis缓存之类的。redis存在的问题用过的都知道。而且重点是zookeeper是为了解决分布式的一致性问题,redis使用存在缺陷。

zookeeper集群是怎么做的?

首先回顾一下前面zookeeper单机的情景。它的启动的确很简单,无非就是把配置读到类中,读取一下快照和事务,然后做一个调用链就行了。
假设你来设计一个zookeeper集群,因为你是为了解决上面数据库和redis的分布式锁的缺点而设计的,你会怎么做?
首先肯定大体逻辑跟单机是一样的。最重要的是要保证一致性。
1、假设我们每次做了修改就通告给所有的zookeeper。
那么如果有的zookeeper没有启动怎么办呢?作为集群,不可能挂掉一台就不工作了吧,你说没有启动我就保存到本地,直到那台启动了在传给它,那么如果这台机器漏掉了或者出现了大故障导致以前的数据也不在了怎么办呢?难道你会想数据库一样全量拷贝一份吗?或者你想加一台机器进去是不是要手动同步?你现在同步应该以哪一台机器为准?因为是其中一台做了修改通告其它的对吧?所以如果数据保存本地的话,这种方法问题太多了。
2、选择一台作为主,其它的作为从(跟数据库类似)。
一般都是这么做的。所有有关写的操作都由主来确定,其它从服务器来从主这边同步数据对吧,那么选主应该怎么选呢?数据应该怎么同步呢?有关写的操作连接到从了怎么办呢?怎么保证zookeeper中多个数据的一致性呢?这些就是zookeeper重要的实现方式,后面会一一的开始讲。先放一张总体流程图。
zookeeper(三)zk集群应该怎么实现
这个还只是一个大概的,要是细写流程图的话恐怕会特别特别大。最重要的一点就是zookeeper使用的是多线程,多线程的调试远比普通的调试要麻烦,不信的话可以自行去尝试。这个现在肯定看起很懵。后面的文章来慢慢的讲解。