三、Zookeeper集群特点和选举机制、客户端命令

一、特点

  1. ZooKeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群;
  2. Leader负责进行投票的发起和决议,更新系统状态;
  3. Follower用于接收客户端请求并相应结果给客户端,在选举Leader时参与投票;
  4. 集群中只要半数以上的节点存活,ZooKeeper集群就能正常工作;
  5. 全局数据一致:每个server保存相同的一个副本,client无论连接到哪个server,数据都是一致的;
  6. 更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行;
  7. 数据原子性,一次数据的更新要么都成功,要么失败;
  8. 实时性,在一定时间范围内,client能读取最新的数据。

二、选举机制

1、 半数机制:集群中半数以上的节点存活,集群可用。所以ZooKeeper集群适合存在奇数个;
2、 ZooKeeper虽然在配置文件上并没有指定Master和Slave。但是ZooKeeper集群工作时,有一个节点被选举为Leader,其它的节点为Follower,Leader是通过内部的选举机制临时产生的;
3、 选举过程:
假设由五台服务器组成ZooKeeper集群,它们的id从1~5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上都是一样的。假设这些服务器依次启动:
在这里插入图片描述

  • 1、服务器1启动,此时就只有它这一台服务器启动,它发出去的报没有任何响应,所以它的选举状态一直时LOOKING状态;
  • 2、服务器2启动,它与服务器1进行通信,互相交互自己的选举结果,由于两者都没有历史数据,所以id较大的服务器2胜出,但是由于没有达到半数以上的服务器都同意选举服务器2,所以服务器1、2都是LOOKING状态;
  • 3、服务器3启动,同上的原理分析,服务器3的id是服务器1、2、3中最大的,所以服务器1、2都选举服务器3,此时服务器已经超过了半数,所以服务器3被选举为Leader;
  • 4、服务器4启动,同行的原理分析,服务4的id是服务器1、2、3、4中最大, 理应选举服务器4为Leader,但是前面服务器3已经被选举为Leader,所以服务器4只能是小弟(Follower);
  • 5、服务器5启动,也只能跟服务器4一样是Follower。

三、常用命令

使用在zookeeper目录下使用命令 bin/zkServer.sh start 启动ZooKeeper服务,然后使用命令 bin/zkCli.sh 进入客户端,输入help命令显示所有客户端的操作命令:
在这里插入图片描述 在这里插入图片描述

1、查看当前znode中所包含的内容
[zk: localhost:2181(CONNECTED) 13] ls /
[zookeeper]
2、查看当前节点数据并能看到更新次数等数据
[zk: localhost:2181(CONNECTED) 14] ls2 /
[zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x300000093
cversion = 17
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
3、创建普通节点

(/hello:/ 表示根目录;create /hello:表示在根目录下创建hello子节点;“hello world”:创建节点时必须指定值)

[zk: localhost:2181(CONNECTED) 16] create /hello "hello world"
Created /hello
[zk: localhost:2181(CONNECTED) 17] ls /
[hello, zookeeper]
4、获取节点值
[zk: localhost:2181(CONNECTED) 21] get /hello
hello world
cZxid = 0x300000094
ctime = Mon Jul 01 11:41:26 CST 2019
mZxid = 0x300000094
mtime = Mon Jul 01 11:41:26 CST 2019
pZxid = 0x300000094
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0

第一行hello world就是该节点的值,其余的数据在【数据结构和节点类型】中已经介绍。

5、创建短暂节点
1、创建:(在当前客户端是能看到的)
[zk: localhost:2181(CONNECTED) 1] create -e /emphemeral-node "e node"
Created /emphemeral-node
[zk: localhost:2181(CONNECTED) 2] ls /
[hello, zookeeper, emphemeral-node]
[zk: localhost:2181(CONNECTED) 3]
2、退出当前客户端重新启动客户端

退出

[zk: localhost:2181(CONNECTED) 3] quit

重新启动客户端

[root@admin zookeeper-3.4.14]# bin/zkCli.sh

再次查看根目录下的短暂节点已经被删除

[zk: localhost:2181(CONNECTED) 0] ls /
[hello, zookeeper]
6、创建带序号的节点

先创建一个普通的根节点app2

[zk: localhost:2181(CONNECTED) 11] create /test1 "test1"

创建带序号的节点

[zk: localhost:2181(CONNECTED) 13] create -s /test1/aa "aa"
Created /test1/aa0000000000
[zk: localhost:2181(CONNECTED) 14] create -s /test1/bb "bb"
Created /test1/bb0000000001
[zk: localhost:2181(CONNECTED) 15] create -s /test1/cc 123
Created /test1/cc0000000002

如果原节点下有1个节点,则再排序时从1开始,以此类推。

[zk: localhost:2181(CONNECTED) 16] create -s /test1/aa 111
Created /test1/aa0000000001
7、修改节点的值
[zk: localhost:2181(CONNECTED) 3] set /hello "hello"
8、监听节点值变化

在 130 这台机器上注册节点/hello的数据变化监听

[zk: localhost:2181(CONNECTED) 2] get /hello watch

在 129 这台机器上修改节点 /hello 的值

[zk: localhost:2181(CONNECTED) 1] set /hello "hello world"

在 130 这台机器上可以看到节点数据变化信息

WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/hello
9、删除一级节点
[zk: localhost:2181(CONNECTED) 7] delete /test1/aa
10、删除多级节点(递归删除)
[zk: localhost:2181(CONNECTED) 8] rmr /test1
11、查看节点状态
[zk: localhost:2181(CONNECTED) 9] stat /hello
cZxid = 0x300000094
ctime = Mon Jul 01 11:41:26 CST 2019
mZxid = 0x400000003
mtime = Mon Jul 01 15:19:06 CST 2019
pZxid = 0x300000094
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0

公众号二维码:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值