集群的福音—ZooKeeper

    集群中的服务器如果动态扩充或宕机,就需要更新所有客户端主机的主机列表,为避免集群主机和客户端主机的直接访问,需要引入第三方协调控制工具,动态取得服务器端的信息列表。而ZooKeeper就实现了这样的功能,它可以在节点出现问题后及时进行切换处理操作 。(不同于一般协调组件,ZooKeeper实现了Paxos算法,避免了拜占庭将军问题,它不再受网络、硬件等的制约)

简介:

    ZooKeeper是一个免费的开源组件,是Google的Chubby一个开源实现,也是Hadoop和Hbase的重要组件 。下载地址:http://zookeeper.apache.org/

    而在ZooKeeper里面主要是由若干个进程以及简单的数据存储功能所组成,它采用树状结构:

    

    ZooKeeper表现为一个分层的文件系统目录树结构,但不同于文件系统的是,节点可以有自己的数据,而文件系统中的目录节点只有子节点,zookeeper每一个子节点可以设置一个所需要的数据,大小一般在1M左右,不能存放过多的信息内容。基本上每一个组件所保存的内容都是简单的字符串标记信息 。

 

特点:

顺序一致性:按照客户端发送请求的顺序更新数据

原子性:更新要么成功,要么失败,不会出现部分更新

单一性:无论客户端连接哪个Server,都会看到同一个视图

可靠性:一旦数据更新成功,将一直保持,直到新的更新

及时性:客户端会在一个确定的时间内得到最新的数据 

 

Paxos算法:

    Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致

    Google的Chubby与Apache的Zookeeper都是基于此理论实现的

    Poxos只有在一个可信的计算机环境中才能成立,这个环境是不会被入侵破坏的 。

Paxos分析:

    假设有一个叫做Paxos的小岛,上面住了一批居民,岛上所有的事情由一些特殊的人决定,他们叫做议员,议员总数是确定的,不能更改 。

    岛上每次环境事务的变更都需要通过一个提议(Proposal),每个提议都有一个编号(PID),这个编号是一直增长的,不能倒退,每个提议都需要超过半数的议员同意才能生效 。

    每个议员只会同意大于当前编号的提议,包括已失效的和未生效的。如果议员收到小于等于当前编号的提议,他会拒绝,并告知对方:你的提议已经有人提过了。这里的当前编号是每个议员在自己记事本上面记录的编号,他不断更新这个编号。整个议会不能保证所有议员记事本上的编号总是相同的。现在议会有一个目标:保证所有的议员对于提议都能达成一致的看法 。


 

当提议N次时:

 

Paxos与Zookeeper:

    小岛——ZK Server Cluster

    议员——ZK Server

    提议——ZNode Change(Create/Delete/SetData)

    提议编号——Zxid(ZooKeeper Transaction Id)

    正式法令——所有ZNode及其数据

小岛总统:ZK Server Leader  

    在所有议员中 设立一个总统,只有总统有权发出提议,如果议员有自己的提议,必须发给总统并由总统来提出 。

    而协调一致的操作中所有的数据同步处理一定交由Leader完成,Leader不是固定的,是通过选举产生的,如果某一个Leader不在了,会自动选举出新的Leader

Leader的处理:

    1.Client找某个议员询问(Get)某个法令的情况(ZNode数据),议员拿出记事本查阅并告诉他结果,并声明它的数据不一定是最新的,要想要最新的数据,他去找总统同步一下再来

    2.Client找某个议员要求政府归还欠他的钱,议员将问题反映给总统,总统询问所有议员的意见,超过半数议员表示归还,于是总统从国库中拿钱还钱,国库资产减少,Client函数返回

    3.总统挂了,议员都联系不上总统,于是开始推选新的Leader,在此期间拒绝Client请求 。

安装配置略

ZooKeeper使用:

    用zkServer.sh start启动Zookeeper进程之后,zkServer.sh status查看各个进程状态会返回两类信息:leader(自动选举的领导)、follower(跟随者)

    服务器端运行正常之后,用zkCli.sh -server 命令连接集群中的主机

    进入Zookeeper客户端之后,ls / 查看根节点信息,其中包含了所有的节点

创建一个节点,名字为/data,对应节点内容为hello:

    create /data hello   成功后返回“Created /data” 信息

取得节点数据

    get /data  会返回如下数据

                       【节点中真正保存的数据】hello

                       【节点最后一次发生更新的标志的id】cZxid = 0x300000002

                       【节点创建的时间戳】ctime = Tue Nov 01 15:54:11 CST 2016 mZxid = 0x300000002

                       【节点最后一次更新的时间戳】mtime = Tue Nov 01 15:54:11 CST 2016 pZxid = 0x300000002

                       【子节点的更新次数】cversion = 0

                       【子节点数据更新次数】dataVersion = 0

                       【子节点ACL更新次数】aclVersion = 0 ephemeralOwner = 0x0 dataLength = 4

                       【子节点的个数】numChildren = 0

监听控制:

    在多台主机操作时,可以针对于数据的变化进行监听操作,但是只能够监听一次

    【第一台客户端】创建一个节点:create /data hello; ·

    【第一台客户端】取得节点,并且设置监听:get /data watch ·

    【第二台客户端】重新设置节点数据:set /data java

这个时候由于第一台主机设置了监听,所以一旦节点的数据发生了改变,那么将理解触发监听操作,得到如下的信息

WatchedEvent state:SyncConnected type:NodeDataChanged path:/data

猜你喜欢

转载自monstermzy.iteye.com/blog/2334728
今日推荐