为什么需要 Zookeeper

为什么需要 Zookeeper

很多中间件,比如 Kafka、Hadoop、HBase,都用到了 Zookeeper,于是很多人就会去了解这个 Zookeeper 到底是什么,为什么它在分布式系统里有着如此无可替代的地位。

在踩了很多坑之后,我决定来回答下这个问题。

其实学任何一项技术,首先都要弄明白,为什么需要这项技术。

为什么需要 Zookeeper

正经点来回答,就是我们需要一个用起来像单机但是又比单机更可靠的东西。

下面开始不正经的回答。

一个团队里面,需要一个 leader,leader 是干嘛用的?管理什么的咱不说,就说如果外面的人,想问关于这个团队的一切事情,首先就会去找这个 leader,因为他知道的最多,而且他的回答最靠谱。

比如产品经理小饼过来要人,作为 leader,老吕发现小耀最近没有项目安排,于是把小耀安排给了小饼的项目;

过了一会,另一个产品小西也过来要人,老吕发现刚刚把小耀安排走了,已经没人,于是就跟小西说,人都被你们产品要走了,你们产品自己去协调去。

img

如果老吕这时候忘了小耀已经被安排走了,把小耀也分配给小西,那到时两个产品就要打架了。

这就是 leader 在团队里的协调作用

同样的,在分布式系统中,也需要这样的协调者,来回答系统下各个节点的提问。

比如我们搭建了一个数据库集群,里面有一个 Master,多个 Slave,Master 负责写,Slave 只读,我们需要一个系统,来告诉客户端,哪个是 Master。

有人说,很简单,我们把这个信息写到一个 Java 服务器的内存就好了,用一个 map,key:master,value:master 机器对应的 ip

img

但是别忘了,这是个单机,一旦这个机器挂了,就完蛋了,客户端将无法知道到底哪个是 Master。

于是开始进行拓展,拓展成三台服务器的集群。

img

这下问题来了,如果我在其中一台机器修改了 Master 的 ip,数据还没同步到其他两台,这时候客户端过来查询,如果查询走的是另外两台还没有同步到的机器,就会拿到旧的数据,往已经不是 master 的机器写数据。

所以我们需要这个存储 master 信息的服务器集群,做到当信息还没同步完成时,不对外提供服务,阻塞住查询请求,等待信息同步完成,再给查询请求返回信息。

这样一来,请求就会变慢,变慢的时间取决于什么时候这个集群认为数据同步完成了。

假设这个数据同步时间无限短,比如是 1 微妙,可以忽略不计,那么其实这个分布式系统,就和我们之前单机的系统一样,既可以保证数据的一致,又让外界感知不到请求阻塞,同时,又不会有 SPOF(Single Point of Failure)的风险,即不会因为一台机器的宕机,导致整个系统不可用。

这样的系统,就叫分布式协调系统。谁能把这个数据同步的时间压缩的更短,谁的请求响应就更快,谁就更出色,Zookeeper 就是其中的佼佼者。

它用起来像单机一样,能够提供数据强一致性,但是其实背后是多台机器构成的集群,不会有 SPOF。

其实就是 CAP 理论中,满足 CP,不满足 A 的那类分布式系统。

如果把各个节点比作各种小动物,那协调者,就是动物园管理员,这也就是 Zookeeper 名称的由来了,从名字就可以看出来它的雄心勃勃。

讲完了上面这些,现在再来看官网这句话,就很能理解了:

ZooKeeper: A Distributed Coordination Service for Distributed Applications

当然还有这句:

img

而以往的很多 ZK 教程,上来就是 “Zookeeper 是开源的分布式应用协调系统”blabla,很多像我这样的小年轻看到就会很费解,到底什么是分布式协调,为什么分布式就需要协调 …

上面只是回答了我自己提出的问题,为什么需要 Zookeeper,或者说,为什么需要分布式协调系统,如果想进一步学习 ZK,你还需要了解下 Zookeeper 的内部实现原理。

比如 ZK 的宏观结构:

img

到 ZK 的微观:

img

再到 ZK 是如何实现高性能的强一致的,即 ZAB 协议的原理,很多教程上来就开始介绍 ZAB 协议,很容易让人一头雾水,不知道为什么需要这样一个分布式一致性协议,有了上述介绍的背景,就好懂许多。

当然你还可以比较一下最近几年很火的 etcd 跟 ZK 的差别。

最后推荐两份 ZK 的学习资源:

== updated on 2019/06/14 ==

看完这篇文章之后,读者可能还有疑问,为什么就一定要用 Zookeeper,我用其他的也可以呀。

这点是我的锅,在写这篇文章时,我还是把 Zookeeper 等价成了分布式协调服务,把为什么需要 Zookeeper 这个问题,等价成了 「为什么需要分布式协调服务」,其实这样是有问题的,因为想做分布式协调服务,不一定需要 ZK 这种 CP 的中间件,用 AP 也可以。

而到底是用 AP 还是 CP,是由业务决定的。

比如你是一个文件上传的服务器,用户可能上传几个 g 的文件,那么如果用一个 AP 的系统,拿到的可能是不可用的节点,这样返回给客户端重试,客户端肯定得疯掉,这时候就需要用 CP。

而像 rpc 调用,调用失败了重试就好,成本代价都不大,这时候,用 AP 可能会更合适。

公众号:柳树的絮叨叨,欢迎关注!

img

柳树的絮叨叨

写下你的评论...

nginx 这些 reverse proxy 不可以做同样的事情吗?nginx 也可以告诉 client 哪个是 master,哪个是 slave,为什么还需要 zookeeper 呢?

很好的问题,其实分布式协调服务,很多中间件都可以做,但是有的是 AP 的,有的是 CP 的,ZK 属于 CP,而到底是用 AP 还是 CP,是由业务决定的,比如你是一个文件上传的服务器,用户可能上传几个 g 的文件,那么如果用一个 AP 的系统,拿到的可能是不可用的节点,这样返回给客户端重试,客户端肯定得疯掉,这时候就需要用 CP;而像 rpc 调用,调用失败了重试就好,成本代价都不大,这时候,用 AP 可能会更合适。

什么是 AP 什么是 CP

我觉得(个人观点),zk 也就是它的树形结构可以让它获取子节点,还有点用处,其他的,几乎被后来者秒杀(这个说的严重了点,但总之比 zk 好点)!

比如你是一个文件上传的服务器,用户可能上传几个 g 的文件,那么如果用一个 AP 的系统,拿到的可能是不可用的节点,这样返回给客户端重试,客户端肯定得疯掉,这时候就需要用 CP。

这个场景是不是举错例子了,节点不可用所以更需要 AP 啊,数据不一致才需要 CP 啊。

比如现在 zk 里存的两个节点的 ip,分别是 ipA ipB,现在 zk 发现 ipB 不可用了,于是把 ipB 删掉,假设 ZK 是 AP 的,无法保存数据一致性,并且有两台 ZK 的机器,其中一台已经把 ipB 删掉了,另一台没删,这时候客户端过来拿 ip,有可能拿到不可用的 ipB. 这里的节点不可用里的不可用,和 AP 的 A 可用性,指的不是一个对象。

所以你说的 zk 的 AP 还是 CP 是吧,我理解成服务的 CAP 了。

我觉得这个科普可以再深入一丢丢。

比如 ZK 在每次重新选举后通过 generation 进行的类版本控制。

在有 ZK 小宝宝挂掉之后的重新选举的通信和将 topic 和 slave 等信息给新 Leader 的再分配这些都可以讲一讲,不然这个看下来没有什么干货。

BTW:我了解的 ZK 的起名故事比你讲的多个了前因的样纸。

img

制造问题,希望不必解决问题多吧

答主再总结下 etcd 和 ZK 的区别?为啥 k8s 现在都用 etcd 管理各种状态相关的?

还没仔细研究,只知道在性能测试上 etcd 已经超过了 ZK,最主要的应该是一致性算法的优势,zk 基于从 paxos 改进而来的 zab,而 etcd 基于和 paxos 十分不同的 raft,这两个算法的细节我还没研究过,不过 zk 的成功说明了站在巨人(paxos)的肩膀上,可以看的更远,而 etcd 的成功,则说明了有时打破固定思维,另辟蹊径的创新也能带来成功。另外 etcd 采用没有垃圾回收机制的 go 语言来实现,相比 zk 用的 java,也可能给性能带来一些优势吧 ps: 有赞现在也在全面用 etcd 取代 zk

etcd 是 k8s 的官方用的,但是 golang 也有 GC:https://blog.golang.org/ismmkeynote,只不过相对而言 golang 的各种 goroutine 和内存开销比起 Java 好很多。不过 raft 和 paxos 的区别确实值得好好研究

网络天然的有延迟 客户端重试这个坑怎么都绕不过去的

如此简单入门的一篇文章解决了我多年的疑惑!

都说 zk 是一个处理分布式一致性的解决方案,那他是如何解决一致性问题的呢?你的文章强调了它协调的功能的吧

AP 最终一致性? CP 强一致性?

AP 不是可用吗?为啥会出现不可用的节点?

但 zookeeper 是遵循的 CP 啊。。。强调一致性的话会产生不可用的节点

写的好,通俗易懂!

解释得非常到位,学习了。
最后一部分应该有点问题。文件服务器应该就是遵循 AP 才对,不然文件传着传着服务就挂了,又要重新传,岂不是要崩溃。

我的关注点比较奇怪,mysql 集群中需要使用到 zookeeper 吗

我从 zk 的未授权访问漏洞,来看 zk 是个啥东西,看了那么多评论 感觉做安全的知道这是个啥就行,至于与 etcd 相比 我就不看了 哈哈 感谢作者的分享

正如作者所说,当我想学习一种从未了解过的知识或者技术时,首先会想去了解我们为什么需要它?它到底解决了什么样的课题?痛点?

相信很多人都有过这种感受,很大比例的书籍或文档,都没有这样的说明,包括大学让我挂科的高等数学,我曾经就不知道为什么要学它 [捂脸]

感谢作者带来的简单易懂的啰嗦文 [调皮]

posted @ 2020-07-28 19:43  别再闹了  阅读(111)  评论(0)    收藏  举报