《Zookeeper 1》--一个分布式应用程序的分布式协调服务

ZooKeeper:分布式应用程序的分布式协调服务

     ZooKeeper是一种用于分布式应用程序的分布式开源协调服务。它公开了一组简单的原语,分布式应用程序可以构建这些原语,
以实现更高级别的服务,以实现同步,配置维护以及组和命名。它被设计为易于编程,并使用在熟悉的文件系统目录树结构之后设计的数据模型。
它在Java中运行,并且具有Java和C的绑定。
ZooKeeper背后的动机是减轻分布式应用程序从头开始实施协调服务的责任。

以一个简单的例子来说明整个选举的过程:

       假设有五台服务器组成的zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,
在存放数据量这一点上,都是一样的.假设这些服务器依序启动,来看看会发生什么.
1) 服务器1启动,此时只有它一台服务器启动了,它发出去的汇报没有任何响应,所以它的选举状态一直是LOOKING状态

2) 服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,
    所以id值较大的服务器2胜出(Leader id:就是我们配置的myid中的值,每个机器一个),
    但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1,2还是继续保持LOOKING状        态.

3) 服务器3启动,根据前面的理论分析,服务器3成为服务器1,2,3中的老大,而与上面不同的是,此时有三台服务器选举了它,
    所以它成为了这次选举的leader.

4) 服务器4启动,根据前面的分析,理论上服务器4应该是服务器1,2,3,4中最大的,但是由于前面已经有半数以上的服务器选举了服务      器3,所以它只能接受当小弟的命了.

5) 服务器5启动,同4一样,当小弟.

集群服务器宕掉的情况:                                                                                                                                                                                     半数以上服务器宕机代表zookeeper服务器宕机
                 例如我们集群服务器有3台, 其中有一台zkServer宕机,那么整个ZK还是可以服务的
                 如果集群服务器只有2台,其中1台宕机,ZK就是不可用的 

案例演示 分别启动zkServer.sh start(master slave1 slave2)
        1.查看选举状态zkServer.sh status(分别三台节点查看)
        2.jps查看leader的状态 kill掉leader所在的节点
        3.再次查看 slave2应该是leader
        4.再次启动slave1的zkServer.sh start 它只能当小弟了

 

zookeeper维护了一份分布式文件系统,每个节点称为“Znode”,  Znode维护数据和与之关联的子节点;     

Znodes维护一个状态结构:

【znode:/根节点stat说明  
        cZxid = 0x0                                                        //create事务ID
        ctime = Wed Dec 31 16:00:00 PST 1969          //当前节点的create时间
        mZxid = 0x0                                                       //当前节点的修改事务ID
        mtime = Wed Dec 31 16:00:00 PST 1969         //当前节点的时间
        pZxid = 0x900000018                                        //最后修改此znode的子项的更改的zxid
        cversion = 4                                                       //此znode的子项的更改数
        dataVersion = 0                                                 //此znode数据的更改次数(版本)
        aclVersion = 0                                                    //ACL(访问控制列表)的版本
        ephemeralOwner = 0x0                                     //表示当前节点是否为临时节点,
                                                                                   如有数据为临时节点;如为0X0,代表当前节点的永久节点;
        dataLength = 0                                                  //表示当前节点的数据长度,
                                                                                   默认情况下,每个Znode节点可存放1M的数据
        numChildren = 2                                               //表示当前节点拥有的子节点数 】

 

 

zookeeper数据模型:

   1.会话 
        $ bin/zkCli.sh -server 127.0.0.1:2181
           创建znode  临时 / 永久
       $ bin/zkCli.sh -server slave1:2181

       $ bin/zkCli.sh -server master:2181,slave1:2181

       关闭当前Zk连接会话:
       $>close
       connect host:port 连接其他的Zookeeper服务端:
       $>connect slave1:2181

1.创建永久节点,不加s和加s的区别:【注意序号】
    [zk: master:2181(CONNECTED) 1] create /aaa1 helloword
    Created /aaa1
    [zk: master:2181(CONNECTED) 2] ls /
    [zookeeper, aaa1, hadoop-ha]
    [zk: master:2181(CONNECTED) 3] create -s /aaa2 helloword2
    Created /aaa20000000023

2.zookeeper当中不能往znode中去追加内容,只能覆盖
    set /aaa20000000023 newwords

3.创建临时znode (临时节点不能有子节点)
    create -e /path  data                                                                                                                                                                                
4.删除znode(删除znode时,不能有子znode,需要先删除子znode再删除父znode)
   delete /path                                                                                                                                                                                             
5.   rmr   删除所有znode,可以包含子路径

 

临时节点与永久节点的概念:

   --按生命周期分类

    ZooKeeper中的节点有两种,分别为临时节点和永久节点。节点的类型在创建时即被确定,并且不能改变。
      ① 临时节点:该节点的生命周期依赖于创建它们的会话。一旦会话(Session)结束,临时节点将被自动删除,
                             当然可以也可以手动删除。虽然每个临时的Znode都会绑定到一个客户端会话,但他们对所有的客户端还是可                               见的。
                            另外,ZooKeeper的临时节点不允许拥有子节点

      ② 永久节点:该节点的生命周期不依赖于会话,并且只有在客户端显式地执行删除操作的时候,他们才能被删除。


顺序节点:

当创建Znode的时候,用户可以请求在ZooKeeper的路径结尾添加一个递增的计数
这个计数对于此节点的父节点来说是唯一的,它的格式为"%10d"(10位数字,没有数值的数位用0补充,例如"0000000001")。
当计数值大于2^32 - 1时,计数器将溢出。


观察:

      客户端可以在节点上设置watch,我们称之为监视器
      当节点状态发生改变(Znode的增、删、改)时,将会触发watch所对应的操作。
      当watch被触发时,ZooKeeper将会向客户端发送且仅发送一条通知,因为watch只能被触发一次,这样可以减少网络流量。

      监听/path下的变化
      stat /path true

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值