• ZooKeeper原理及配置


    ooKeeper实验版本:3.4.6

    ZooKeeper下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/

     

    zookeeper是一个高可用性,高性能的协调服务。

     

    解决哪些问题

    在分布式应用中,经常会出现部分失败的情况,即当节点间传递消息的时候由于网络或者接收者进程死掉等原因,发送者无法知道接收者是否收到消息。

    由于部分失败是分布式系统固有的特征因此zookeeper并不能避免部分失败,但是它可以帮你在部分失败的时候进行正确处理,保证最终正确。

     

    zookeeper具有以下特征

    1:zookeeper提供丰富的构件(building block)来实现很多协调数据结构和协议

    2:访问原子性,客户端要么读到所有数据,要么读取失败,不会出现只读取部分的情况

    3:zookeeper运行在一组机器上,具有高可用性,帮助系统避免单点故障,同时删掉故障服务器

    4:顺序一致性:任意客户端的更新请求会被按照发送顺序提交

    5:单一系统映像:当一台服务器故障,导致它的客户端需要连接其它服务器的时候,所有更新晚于故障服务器的服务器都不会接收请求,一直到更新赶上故障服务器

    6:及时性:任何客户端能看到的滞后都是有限的,不会超过几十秒,且提供sync操作强制客户端所连的服务器与领导者同步

    7:会话:每个客户端连接时会尝试连接到配置列表中的一台服务器,一旦失败会自动连接另一台服务器依次类推,知道成功连接一台服务器,从而创建一个会话,客户端可以位每个会话设置超时时间,一旦会话过期,则所有短暂znode会丢失,因为zookeeper会自动发送心跳包,所以很少发生

    8:约会机制(rendezvous),在交互的过程中,被协调的各方不许要事先彼此了解,甚至不必同时存在

    9:ACL:zookeeper提供了digest(通过用户名密码),host(通过主机名),ip(通过ip地址)3种身份验证模式,依赖与 zookeeper的身份验证机制每个ACL都是一个身份对应一组权限,如果我们要给demo.com的客户端域一个读权限在java语言中可以这样创建:new ACL(Perms.READ, new Id("host", "demo.com"));Ids.OPEN_ACL_UNSAFE是将所有ADMIN之外的权限授予每个人;另zookeeper还可以集成第三方的身份验证系统。

    10:提供关于通用协调模式的开源共享资源库

    11:高性能的(官方数据)对以写为主的工作负载来说使用5台不错的机器基准吞吐量达到10000+

     

    原理

    zookeeper使用zab协议,类似Paxos算法但在操作方面却是不同的,该协议包括2个不断重复的阶段。

    领导者选举:集群所有机器一起选出一台领导者,其它机器成为跟随者,一旦半数以上的跟随者将状态同步,表示这个阶段完成(官方数据这个阶段持续200毫秒)。

    原子广播:所有机器将写操作转发给领导者,领导者再将更新广播给跟随者,只有半数以上的跟随者同步修改之后领导者才会提交更新,客户端才能收到更新成功的信息。

    它的核心是一个精简的文件系统,形成一个树状的数据结构,统一使用节点(znode)的概念,节点可以有子节点,也可以用来保存数据,并且有一个关联的ACL,因为zookeeper被设计来实现协调服务,通常使用小数据文件所以znode能存储的数据限制在1M以内
    zookeeper采用斜杠分割的Unicode字符串来做引用类似文件系统路径,但必须是标准的,不支持./这种特殊字符,使用/zookeeper子树来保存管理信息。

    客户端与服务器通信采用tcp长连接,客户端和服务器通过心跳来保持seesion的连接。当session失效时临时节点会被删除。

    通过监控节点以及节点的变化来实现功能,例如集群管理,配置的集中管理,分布式锁等。

    zookeeper通过复制实现高可用性,只要集群中半数以上的机器可用,就能提供服务,所以一个集群通常要奇数台机器。

    zookeeper的生命周期有以下3个状态:CONNECTION,CONNECTED,CLOSED。

    新产生的zookeeper实例是CONNECTION状态,通过建立连接进入CONNECTED状态,当zookeeper实例断开和重连的时候,zookeeper实例在CONNECTED和COONECTION之间转换,调用close方法或者会话超时会进入到CLOSE状态且不能恢复。

     

    znode特性

    znode有2种,短暂node和持久node,在创建时确定,并且不能修改,短暂node在客户端session结束的时候会被移除,且不可以创建任何类型的子节点。如果在创建znode的时候设置了顺序标识,那么此znode会通过父节点维护的一个单调递增的计数器来添加一个顺序号,这个顺序号可以被用来进行全局排序。watch机制可以让客户端得到znode的变化,观察只能触发一次,为了能多次收到通知,客户端需要重新注册所需的观察。

     

    安装配置:

     

    一、单机模式

    单机安装非常简单,只要获取到 Zookeeper 的压缩包并解压到某个目录如:C:zookeeper-3.4.6下,Zookeeper 的启动脚本在 bin 目录下,Windows 下的启动脚本是 zkServer.cmd。

    在你执行启动脚本之前,还有几个基本的配置项需要配置一下,Zookeeper 的配置文件在 conf 目录下,这个目录下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是将 zoo_sample.cfg 改名为 zoo.cfg,因为 Zookeeper 在启动时会找这个文件作为默认配置文件。下面详细介绍一下,这个配置文件中各个配置项的意义。

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. # The number of milliseconds of each tick  
    2. tickTime=2000  
    3. # The number of ticks that the initial   
    4. # synchronization phase can take  
    5. initLimit=10  
    6. # The number of ticks that can pass between   
    7. # sending a request and getting an acknowledgement  
    8. syncLimit=5  
    9. # the directory where the snapshot is stored.  
    10. # do not use /tmp for storage, /tmp here is just   
    11. # example sakes.  
    12. dataDir=D:\ZooKeeper\server3\data  
    13. dataLogDir=D:\ZooKeeper\server3\dataLog  
    14. # the port at which the clients will connect  
    15. clientPort=2181  
    16. # the maximum number of client connections.  
    17. # increase this if you need to handle more clients  
    18. #maxClientCnxns=60  
    19. #  
    20. # Be sure to read the maintenance section of the   
    21. # administrator guide before turning on autopurge.  
    22. #  
    23. # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance  
    24. #  
    25. # The number of snapshots to retain in dataDir  
    26. #autopurge.snapRetainCount=3  
    27. # Purge task interval in hours  
    28. # Set to "0" to disable auto purge feature  
    29. #autopurge.purgeInterval=1  


    tickTime:这个时间是作为Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。

    dataDir:顾名思义就是Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。

    dataLogDir:顾名思义就是Zookeeper 保存日志文件的目录

    clientPort:这个端口就是客户端连接Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

    当这些配置项配置好后,你现在就可以启动 Zookeeper 了,启动后要检查 Zookeeper 是否已经在服务,可以通过 netstat – ano 命令查看是否有你配置的 clientPort 端口号在监听服务。

     

    二、集群模式

    Zookeeper 不仅可以单机提供服务,同时也支持多机组成集群来提供服务。实际上 Zookeeper 还支持另外一种伪集群的方式,也就是可以在一台物理机上运行多个 Zookeeper 实例,下面将介绍集群模式的安装和配置。

    Zookeeper 的集群模式的安装和配置也不是很复杂,所要做的就是增加几个配置项。集群模式除了上面的三个配置项还要增加下面几个配置项:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. initLimit=5    
    2. syncLimit=2    
    3. server.1=127.0.0.1:2888:3888  
    4. server.2=127.0.0.1:2889:3889  
    5. server.3=127.0.0.1:2890:3890  

    initLimit:这个配置项是用来配置Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒。

    syncLimit:这个配置项标识Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒。

    server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

    除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。

     

     

     

    参考文献:

    http://blog.csdn.net/larrylgq/article/details/7205082

    http://www.cnblogs.com/shanyou/p/3221990.html

  • 相关阅读:
    将现有MySQL数据库改为大小写不敏感
    在Windows中玩转Docker Toolbox
    使用ABP EntityFramework连接MySQL数据库
    数据库设计范式2——BC范式和第四范式
    让OData和NHibernate结合进行动态查询
    文档在线预览的实现
    有哪些老鸟程序员知道而新手不知道的小技巧?自我感受
    EEPROM的概念接口类型及软件实例
    flash的几种模式Normal Mode、DUAL Mode、Quad Mode的概念和区别
    ESP8266 打造一款物联网产品---搭建环境编译及烧录
  • 原文地址:https://www.cnblogs.com/duyinqiang/p/5696713.html
Copyright © 2020-2023  润新知