入门
zk是一个分布式的协调服务框架.
特点
- 分布式集群,一个leader,多个follower
- 半数以上节点存活,就可正常服务
- 每个server的数据一致
- 每次数据更新要么成功,要么失败
数据模型
安装
1. 将zookeeper-3.4.10.tar.gz上传到/root中
2. 解压
[root@mypc01 ~]# tar -zxvf zookeeper-3.4.10.tar.gz -C /usr/local/
3. 更名zookeeper
[root@mypc01 ~]# cd /usr/local/
[root@mypc01 local]# mv zookeeper-3.4.10 zookeeper
4. 配置环境变量
[root@mypc01 local]# vi /etc/profile
.........省略......
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
5. 使当前会话生效
[root@mypc01 local]# source /etc/profile
集群搭建
以三台机器为例
[root@mypc01 local]# cd ./zookeeper/conf/
[root@mypc01 conf]# cp zoo_sample.cfg zoo.cfg #复制出zoo.cfg文件
[root@mypc01 conf]# vi zoo.cfg
tickTime=2000 # 定义的时间单元(单位毫秒),以下两个值都是tickTime的倍数。
initLimit=10 #follower连接并同步leader的初始化连接时间。
syncLimit=5 #心跳机制的时间(正常情况下的请求和应答的时间)
dataDir=/usr/local/zookeeper/zkData #修改zookeeper的存储路径,该目录要提前创建好
clientPort=2181 #客户端连接服务器的port
server.1=mypc01:2888:3888 # 添加三个服务器节点
server.2=mypc02:2888:3888
server.3=mypc03:2888:3888
解析Server.id=ip:port1:port2
id: 服务器的id号,对应zkData/myid文件内的数字
ip: 服务器的ip地址
port1: follower与leader交互的port
port2: 选举期间使用的port
在$ZOOKEEPER_HOME目录下添加myid文件,内容为server的id号
cd $ZOOKEEPER_HOME/zkData
touch myid #内容设为1即可
同理在另外2台机器安装zookeeper,不同之处在于myid,一台内容设为2,另一台设为3.
也可以利用scp命令将在第一台机器上安装好的程序发送到第2,第3台.
启动与停止
查看帮助
Usage: /usr/local/zookeeper/bin/zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
需要3台一起启动
zkServer.sh start
查看状态
[root@mypc01 hadoop]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
查看进程其中QuorumPeerMain为zk的守护进程.
[root@mypc01 hadoop]# jps
5362 Jps
3045 DataNode
2950 NameNode
5290 QuorumPeerMain
3388 ResourceManager
3485 NodeManager
选举制度
zk如何得出leader和follower,配置文件中没有,而是选举出来的.
依据三个参数,
Epoch
投票次数,位于zkData文件夹下,可以查看,比如
[root@mypc01 zkData]# cat version-2/currentEpoch
3
zxid
使得zk节点改变状态的每一个操作都将使得节点接收到一个zxid格式时间戳,并且全局有序.每个节点的改变都产生一个唯一的zxid. zxid越大,表明事件越靠后.zk上有2个zxid
cZxid:节点创建时对应的zxid格式的时间戳
mZxid:节点修改时对应的zxid格式的时间戳
查看节点就可以.需要先登录
zkCli.sh
如下,是一个十六进制的数字
[zk: localhost:2181(CONNECTED) 1] ls2 /
[zookeeper, hbase]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2
ServerID
就是先前myid文件中的1,2 3,等等
选举leader就是依据优先级:Epoch > zxid >serverid.数字大的胜出.
zkCLi客户端用法
zkCli可以查看更改节点啥的
1. ls -- 查看某个目录包含的所有文件
2. ls2 -- 查看某个目录包含的所有文件,与ls不同的是它查看到time、version等信息
3. create -- 创建znode,并设置初始内容,例如:
[zk: 47.0.0.1:2181(CONNECTED) 1] create /test "test"
Created /test
4. get -- 获取znode的数据
5. set -- 修改znode内容
6. delete -- 删除znode
7. quit -- 退出客户端
8. help -- 帮助命令
也可以连接其他机器上的zkCLi
zkCli.sh -server mypc02:2181
zk监听
zk可以监听了节点数目or内容的变化
比如 在mypc01注册监听节点数目变化
ls / watch
然后在mypc02创建新节点
create /newnode "this is new node"
之后mypc01就会收到反馈, 表明监听到/下的子节点发生变化
[zk: localhost:2181(CONNECTED) 1]
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/
同理key注册监听节点内容变化
get /newnode watch
利用set命令可以改变节点的内容.
另外,这种监听是一次性的~.并非持续的.
zk应用
比如,可以和hbase一起应用
[zk: localhost:2181(CONNECTED) 0] ls /hbase
[replication, meta-region-server, rs, splitWAL, backup-masters, table-lock, flush-table-proc, region-in-transition, online-snapshot, running, recovering-regions, draining, namespace, hbaseid, table]
比如,可以记录meta表的位置
[zk: localhost:2181(CONNECTED) 2] get /hbase/meta-region-server
�regionserver:60020���~PBUF
mypc03������.
cZxid = 0x100000040
ctime = Sat Oct 31 17:17:20 CST 2020
mZxid = 0x100000040
mtime = Sat Oct 31 17:17:20 CST 2020
pZxid = 0x100000040
再比如
backup-masters中记录了备用节点的位置,可提高hbase的可靠性.