一.zookeeper介绍
<强>管理员强>是一个开源的分布式协调服务,由雅虎创建,是<强>谷歌胖乎乎的>强的开源实现。分布式应用程序可以基于<强>管理员>强实现诸如<强>数据发布/订阅强>,<强>负载均衡强>、<>强命名服务强>,<强>分布式协调/通知强>,<强>集群管理强>,<强>大师选举强>,<强>配置维护强>,<强>名字服务强>,<强>分布式同步强>,<强>分布式锁和分布式队列强>等功能。
<强>数据模型强>:<强>管理员强>允许分布式进程通过共享的层次结构命名空间进行相互协调,这与标准文件系统类似。名称空间由<强>管理员强>中的数据寄存器组成,称为<强> Znode >强劲,这些类似于文件和目录。与典型文件系统不同,<强>管理员强>数据保存在内存中,这意味着<强>管理员强>可以<强>实现高吞吐量和低延迟强>。
<强>顺序访问强>:对于来自客户端的每个更新请求,<强>管理员强>都会<强>分配一个全局唯一的递增编号>强。这个编号反应了所有事务操作的先后顺序,应用程序可以使用<强>管理员强>这个特性来实现更高层次的同步原语。这个编号也叫做<强>时间戳强> - <强> zxid 强>(<强>管理员事务Id 强>)。
<强>可构建集群强>:为了保证高可用,最好是以集群形态来部署<强>管理员>强劲,这样只要集群中大部分机器是可用的(能够容忍一定的机器故障),那么<强>管理员强>本身仍然是可用的。客户端在使用<强>管理员强>时,需要知道集群机器列表,通过与集群中的某一台机器建立<强> TCP >强连接来使用服务。客户端使用这个<强> TCP >强链接来发送请求,获取结果,获取监听事件以及发送心跳包。如果这个连接异常断开了,客户端可以连接到另外的机器上。
-
<李>上图中每一个服务器<强> 强>代表一个安装<强>管理员>强服务的服务器。组成<强>管理员>强服务的服务器都会在内存中维护当前的服务器状态,并且每台服务器之间都互相保持着通信。集群间通过<强> Zab 强>协议(<强>管理员原子广播强>)来保持数据的一致性。李>
<李> <>强饲养员>强服务器有三种角色:<强> 强>领袖,<强>追随者>强,<强>观察者>强,集群中的所有机器通过一个<强> 强>选领导人举过程来选定一台称为“<强>领袖”>强的机器。<强>领袖强>既可以为客户端<强>提供写服务>强又能<强>提供读服务>强。除了<强> 强>外领袖,<强>追随者强>和<>强观察者强>都<强>只能提供读服务强>。强>和<强>追随者<强>观察者强>唯一的区别在于<强>观察者>强机器不参与<强> 强>的领袖选举过程,也不参与写操作的“<>强过半写成功强>“策略,因此<强>观察者>强机器可以在不影响写性能的情况下提升集群的读性能。李>
<李>在<强>管理员强>中,主要依赖<强> ZAB 强>协议来实现分布式数据一致性,基于该协议,<强>管理员>强实现了一种<强>主备模式的系统架构强>来保持集群中<强>各个副本之间的数据一致性强>。李>
<>强工作原理强>:
-
<李> <>强饲养员>强的核心是原子广播,这个机制保证了<强>各个服务器之间的同步>强。实现这个机制的协议叫做<强> Zab协议强>。李>
<李> <>强Zab协议有两种模式>强,它们分别是<>强恢复模式强>和<强>广播模式>强。当服务启动或者在领导者崩溃后,<强> Zab >强就进入了恢复模式,当领导者被选举出来,且大多数<强>服务器强>的完成了和<>龙头强>的<>强状态同步强>以后,恢复模式就结束了。状态同步保证了<>龙头强>和<强>服务器强>具有相同的系统状态,一旦<强>领袖强>已经和多数的<强> 强>追随者进行了状态同步后,他就可以开始广播消息了,即进入广播状态。这时候当一个服务器加入<强>管理员>强服务中,它会在恢复模式下启动,发现<强> 强>领袖,并和<>龙头>强进行<强>状态同步>强。待到同步结束,它也参与消息广播。李>
<李> <>强饲养员>强服务一直维持在<强> 强>播出状态,直到<强>领袖崩溃了>强或者<强>领袖失去了大部分的追随者支持强>。李>
<>龙头选举强>:
-
<李>广播模式需要保证<强>建议强>(<强>提议强>)被<强>按顺序处理强>(<强>领袖强>来执行写操作),因此zk <强> >强采用了递增的事务