前言

在分布式场景中,分布式协调组件是必不可少的,它能协助我们解决分布式环境下产生的一系列问题。zookeeper就是其中的一个重要组件。在使用zookeeper之前,我们先了解它到底是什么?能做什么?怎么做?

zookeeper简介

了解zookeeper之前,我们先了解它是什么,能做什么。
ZooKeeper最主要的使用场景,是作为分布式系统的分布式协同服务。当然,他也能作为配置中心使用,还能实现分布式锁等功能。这里我们主要探讨zookeeper作为分布式协同服务的作用。其他功能会在后续文章中讨论。

说到分布式协调服务,首先我们先了解一下分布式环境下面临的问题。

分布式系统定义及面临的问题

我们将分布式系统定义为:分布式系统是同时跨越多个物理机,独立运行的多个软件所组成的系统。类比一下,分布式系统就是一群人干活。人多力量大,每个服务器的运算能力都是有限的,但是通过分布式系统,由N个服务器组成起来的群,运算能力是可以无限扩张的。

优点显而易见,人多干活快,并且互为备份。但是缺点也很明显。我们可以想象一下,以一个小研发团队开发软件为例,假设我们有一个5人的项目组,要开始开发一个系统,项目组将面临如下问题:

ZooKeeper分布式集群部署的实训总结_svn


图中举例的就是项目组将要面临到的问题,这些问题我们日常工作中也是天天发生,并没有感觉有多复杂,但是这是因为我们人类的大脑是个超级计算机,能够灵活的应对这些问题,而且现实中信息的交换不依赖于网络,不会因为网路延迟和中断,出现信息不对等,而且现实中对以上问题的处理其实并不严谨,从而引发一系列问题。想一想,项目中是不是出现过沟通不到位,造成任务分配有歧义?是否由于人员离职造成任务进行不下去,甚至要联系离职人员协助?是不是出现过任务分配不合理?类似这样的各种问题,肯定会发生于你的项目组中。在现实世界,我们可以人为的去协调,即使出错了,人工去补错,加加班搞定就好了。但在计算机的世界,这样做是行不通的,一切都要保证严谨,以上问题要做到尽可能不发生。因此,分布式系统必须采用合理的方式解决掉以上问题。

实际上,要解决以上问题并没有那么复杂,我们仅需要做一件事就ok了:让信息在项目组成员中同步。如果信息能做到同步,那么每个人干什么,大家都是清楚的,干到什么程度也是清晰的,无论谁离职也不会产生问题。分配的工作,能够及时清晰的同步给每个成员,确保成员间收到的任务没有冲突。

分布式协调的工作就是通过某种方式,让每个节点的信息能够同步和共享。这依赖于服务进程之间的通信。通信的方式有两种:

  • 通过网络进行信息共享

这就像现实中,开发leader在会上把任务传达下去,组员通过听leader命令或者看leader的邮件知道自己要干什么。当任务分配有变化时,leader会单独告诉组员,或者每次召开会议。信息通过人与人之间的直接沟通,完成传递。

  • 通过共享存储

这就好比开发leader按照约定的时间和路径。把任务分配表放到svn上,组员每天上去拉取最新的任务分配表,然后干活。其中,svn就是共享存储。更好一点的做法是,当svn把文件版本更新是,触发邮件通知,每个组员再去拉取最新的任务分配表。这样做更好,因为每次更新,组员都能第一时间得到消息,从而让自己手中的分配表永远是最新的。此种方式依赖于共享存储。整个过程如下图所示:

ZooKeeper分布式集群部署的实训总结_java_02


zookeeper对分布式系统的协调,使用的是第二种方式,共享存储,分布式应用也需要和存储进行网络通信。

实际上,通过zookeeper实现分布式协同的原理,和项目组通过svn同步工作任务的例子是一样的。zookeeper就像是svn,存储了任务的分配、完成情况等共享信息。每个分布式应用的节点就是组员,订阅这些共享信息。当主节点(leader),对某个从节点的分工信息作出改变是,相关订阅的从节点得到zookeeper通知,取得自己最新的分配任务。完成工作后,把完成情况存储到zookeeper。主节点订阅了该任务的完成情况信息,所以讲得到zookeeper完工的通知,参考下图,是不是和前面项目通过svn分配工作的例子一模一样?仅仅将svn和邮件系统合二为一,以zookeeper代替。

ZooKeeper分布式集群部署的实训总结_java_03


大多数分布式系统中出现的问题,都源于信息的共享出现了问题。如果各个节点间信息不能及时共享和同步,那么就会在写作过程中产生各种问题。zookeeper解决协同问题的关键,就在于保证分布式系统信息的一致性。

小结

本章我们对zookeeper作为分布式协调服务,有了 一个初步的印象,它解决的还是分布式一致性问题。那么回到文章开始的三个问题:

  • zookeeper是什么?
    它是一个分布式协调组件。
  • zookeeper能做什么?
    保证分布式系统一致性。
  • 怎么做?
    这个我们后面来讲。

下一章,我们讲一下zookeeper中有哪些对象。