在几十年前,一个独立的计算机上往往部署着一套完整的应用系统。当时因为网络稳定性及速度的限制,将相关联的服务部署在一台机器上,让它们使用系统机制通信——比如管道,文件等,往往是最稳定和最高效的。然而随着网络技术的发展,特别是“云计算”和“大数据”的盛行,我们越来越多的谈到“分布式系统”——建立在网络上的软件系统。这样部署在不同机器上的关联服务就依赖于网络以及它们自定义的“协议”和“机制”来构建出更加健壮和系统。之前在单机时代,“机制”是受限于操作系统;而网络时代,“机制”将变得更加自由——不同厂商可以定义自己的“机制”以让分布式系统运转起来。(转载请指明出于breaksoftware的csdn博客)

我们先闭眼冥想下:如果我们去构建分布式系统,需要考虑些什么问题?

  1. 网络通信协议。这个难度相对低些,我们忽略。
  2. 异常处理方案。这个就非常复杂了,异常有来自网络的,有来自系统的,有来自用户错误的使用……
  3. 分布式系统维护方案。如果系统内部发生机器增删行为,怎么处理?如果某台机器变得不稳定了,怎么办?……
  4. CAP。除了上述,我们还会遇到CAP定律(https://en.wikipedia.org/wiki/CAP_theorem):一致性(Consistency),可用性(Availability)和分区容错性(Partition Tolerance)最多只能同时满足两个。

简单的说,就是在一个分布式系统中,如果发生网络故障,我们无法同时满足强一致性和可用性:

  • 如果要满足强一致性。请求落在故障机器上时,要一直等待该机器和其他机器同步完最新数据后才能返回。这就牺牲了可用性。
  • 如果要满足可用性。请求落在故障机器上后立即返回该机器上的数据,但是其数据可能不是最新的。这就牺牲了强一致性。

可见设计一套分布式系统还是要面临很多问题,而且我们设计往往会结合自身业务特征,从而增加了重用的难度。如果每个公司都设计出自己的一套,其场景就像动物园里的动物:琳琅满目。虽然这对看客来说是件好事,但是增加动物园的管理负担——比如喂养老虎的饲养员可能不会喂养兔子,需要雇佣更多的员工或者培训现有的员工。这个时候,一个超级饲养员出现了——zookeeper——动物园(zoo)饲养员(keeper)。

zookeeper设计了一套通用“机制”,提供了少量简单的API,可以让我们便捷的构建分布式协作系统。依然以动物饲养为例,一个饲养员如果是要给兔子去做饭,就可以用zookeeper提供的切割机去切草——多切几次变得比较细;他要是去给老虎做饭,还可以使用zookeeper提供的切割机去切肉——只切一次让老虎可以大口吃肉。

zookeeper为什么大受欢迎?我觉得除了方案具有通用性外,还和其设计特点有关——将复杂的问题简单化,把抽象的问题实例化。

zookeeper并没有让各种信息逻辑糅杂在一个服务中。设想下,如果我们将业务逻辑、分布式系统维护逻辑都放在下面一台机器上,则要求每台机器互联,而且一旦发生某台机器断网,其他机器都将要处理这样的异常。这样看似服务部署变得简单,但是会导致服务内部比较杂乱。

zookeeper则采用“分角色”的方案。在一个经典的zookeeper系统中,业务代码只在Zookeeper Client中,这样开发者只要专心于Client上的业务逻辑实现就行了,而分布式系统中大部分异常可以交由zookeeper提供的Zookeeper Server服务去解决。

那么Client和Server间交互的是什么信息呢? 我们称这样的信息叫做“元信息”。元信息存在于Server上,而Client端通过网络向Server端进行读写,从而达到“分布式协同”的功能。于是元信息的设计关系了整个系统的复杂程度。

zookeeper设计的元信息结构和我们日常使用的文件目录系统很像。这样我们在遇到“分布式协同难题”时,可对照着“文件目录系统”这样“老知识”去梳理和解决,这无疑大大降低了理解的难度。

不同的Client可以同时读写同一个节点信息。Zookeeper Server可以保证信息要么被全部写入,要么写失败。而信息读取方,也只能一次性读到全部数据,而不可以读取部分数据。所以这种类似“原子性”的特性,可以让Client设计者不用去关心脏数据的问题。

Client还可以向Server端注册对节点变动的监视。这样就免除了Client端采用轮训这种低效的模式。这和操作系统提供的监控文件变动功能也很像。当然Zookeeper设计的这套结构自然有自己的特点,比如临时节点、有序节点、节点版本等,这些我们在之后的章节会介绍。

跳出这些微观的设计,我们再看下基于zookeeper的分布式系统整体结构,发现Zookeeper Server之间的并非相互连接的。如果我们让不同Server之间相互连接,会使得每个Server的设计变得非常复杂,因为它要兼顾到每个和其他Server的连接信息。

zookeeper做了一个这样的设计:选举“领导”(leader)。这就像我们选举领导一样,一个集群里有选举权的员工可以相互交流推选出一个领导,落选的自然成为“追随者”(follower)。被推选为“领导”的服务负责维护各个Zookeeper Server的一致性和可用性。比如一个连接到“追随者”的Client提交了一个修改信息的请求,“追随者”会将“修改”提交给“领导”,“领导”要将这个修改同步给其他“追随者”。这样就达到整个系统的信息的一致性。为了让“领导”可以专心做自己的事,所以不太建议Client端直接连接到Leader服务。

在大部分场景下,只有“领导”和“追随者”是足够的。但是如果这个集群的需要承载比较大的请求量,我们就需要增加机器,也就是增加“追随者”。这样虽然解决了问题,但是会带来另外一个问题——太多的“追随者”需要更多的时间去选举“领导”,而且这个耗时会导致系统一段时间内部分功能不可用,最最关键的是这个时耗可能很长。于是我们就剥夺了一些“追随者”的选举权,让它们成为“观察员”。这样在Leader失效时,只有少部分Follower进行投票选举,从而降低了系统不可用的时间。

zookeeper快速入门——简介相关推荐

  1. zookeeper快速入门——应用(两种分布式锁)

    在<zookeeper快速入门--简介>一文中,我们介绍了zookeeper的机制.但是还是比较抽象,没有直观感受到它在分布式系统中的应用.本文我们使用一个例子,三次迭代演进,来说明Zoo ...

  2. python 操作 zookeeper 快速入门

    python 操作 zookeeper 快速入门 文章目录 python 操作 zookeeper 快速入门 什么是zookeeper python 操作 zk 快速入门 zk节点 创建节点 查询节点 ...

  3. zookeeper快速入门——部署

    zookeeper有两种运行模式:独立模式和仲裁模式.独立模式就是只运行一个Zookeeper Server,这自然没法解决服务崩溃导致系统不可用的问题.仲裁模式就是以集群的方式运行Zookeeper ...

  4. zookeeper快速入门,配置虚拟机ip、mac、虚拟机免密,jdk的安装与卸载

    zookeeper里的每一个节点叫znode,他们既是目录的功能也有自己的文本信息. 下面进行的集群配置并没有实现高可用效果(内存空间有限) 此次搭建要准备三台虚拟机,准备必备jar包. 虚拟机 ip ...

  5. ZooKeeper快速入门

    1. 概述 Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务. 名字服务.分布式同步.组服务等. 它有如下的一些特点: 简单 Zookeeper的 ...

  6. 1分钟 Zookeeper 快速入门_windows环境

    下载zookeeper 官网链接:https://zookeeper.apache.org/ 修改conf/zoo.cfg 文件名

  7. 软件架构-zookeeper快速入门

    上次在配置zookeeper分布式的时候,有个很重要的文件zoo.cfg,里面重点配置了几个信息clientPort,server.1的端口号.实际用到了2个端口号2181,2888,还有个2888这 ...

  8. AngularJS快速入门简介

    AngularJS[1] 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性 ...

  9. 转:Zookeeper快速入门

    转自: http://www.cnblogs.com/sunddenly/category/620563.html 转载于:https://www.cnblogs.com/gscq073240/art ...

最新文章

  1. 剪切粘贴时总是上次的内容_Quicker 1.4版本更新内容
  2. html 和 body标签的 css 设置
  3. 解决Winform程序在不同分辨率系统下界面混乱问题
  4. 计算机函数公式中怎么合并合并,Excel用函数和公式瞬间实现把表格全部合并到一个表中去...
  5. NetBeans Java EE技巧3:数据库中的RESTful Web服务
  6. 使用Terraform创建托管版Kubernetes
  7. [原]简述Field,Attribute,Property的区别
  8. 门面设计模式php,学习php设计模式 php实现门面模式(Facade)
  9. python html解析对比_python htmlparse页面解析示例
  10. PHP中self和static的区别,php面向对象程序设计中self与static的区别分析
  11. 通达信波段王指标公式主图_通达信股票波段王+精准买卖提示主图指标源码公式_通达信指标公式_指标公式网...
  12. 【U8】用友U8一张A4纸打印一张凭证设置
  13. 微信小程序——拼图游戏案例
  14. YouTube广告 || 一次性让你了解个够
  15. win10 小娜搜索没法用(语音能用 搜索框不能用)
  16. Pandas 面板Panel
  17. 动手| 一个人脸识别的K8s部署实践
  18. 中标麒麟mysql 安装_在中标麒麟上安装达梦数据库V8
  19. project标签爆红:“unexpected markup <!d (position: START_DOCUMENT seen \r\n<!d... @2:4) maven依赖报错
  20. 小学计算机课标教学大纲的依据,《中小学课程标准与教学大纲有什么区别和联系》...

热门文章

  1. 力扣(LeetCode)刷题,简单题(第25期)
  2. 力扣(LeetCode)刷题,简单题(第5期)
  3. E:By Elevator or Stairs? CF595 DP最短路
  4. SemSegMap :基于3D点云语义信息的定位
  5. 数字太大了,计算加法、减法会报错,结果不正确?怎么办?用JavaScript实现大数据(超过20位的数字)相加减运算。
  6. CentOS 6.3 64bit上升级系统默认Python 2.6.6到2.7.10版本
  7. C语言的单链表逆序和指定范围逆序
  8. BZOJ 2957楼房重建
  9. 词法作用域和动态作用域
  10. Linux cp命令如何拷贝整个目录下所有文件