zk理论知识
zk介绍
zk中的三个角色
集群中的 Leader 选举
集群中的zk主机首先都会选择自己成为Leader(不包含Observer)每个zk主机将自己主机的myid和zxid发送给其他的zk主机,其中myid为主机的编号,zxid则为epoch(年号可以理解为每一个leader都会有的唯一标示,集群重启阶段是没有这个ID的)+xid(事务id每次进行写请求,集群中递增的ID)。每一台zk主机收到其他zk主机发来的消息后,对比所有主机的zxid包括自己,选择zxid最大的为leader,若zxid相同则选择myid最大的为leader。
CAP定理
数据同步
当集群中有新的写请求,Leader将该请求封装为Proposal,发送给Follower,Follower接受消息后返回ACK,若Leader收到的ACK超过半数,则通知所有Follower执行commit更新事务,并向所有的observer发送proposal,observer更新事务。Follower和observer同步后向Leader发送ACK,Leader收到ACK后会将follower和observer分别添加到可用的queues中,只有在Queues队列中的Follower和observer才可以对外提供服务,也就是说在ZK同步数据时,不对外提供服务,同步失败的主机也不会对外提供服务,这也就是ZK保持一致性的方法。同样这样做也失去了可用性,因为用户可能在极短的时间内无法得到ZK集群的响应。
zk集群搭建
2 在 http://zookeeper.apache.org 官网下载压缩包,然后解压。请注意zk需要jdk的支持所以请保证虚拟机上有jdk。接下来配置环境变量,记得配置完成后执行命令 source /etc/profile 刷新环境变量。
3 以上两个步骤四个虚拟机的操作完全相同。配置myid就是选举leader时所需要的myid,四台虚拟机中都要配置,注意目录,文件名相同,内容不同。
4 将配置文件zoo_sample.cfg复制,或者重命名为zoo.cfg
修改配置文件,前三个的配置文件完全相同。里边的配置都备注的有。
# The number of milliseconds of each tick
#一个时间单位是两秒
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
#初始化同步最多10个单位
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
#更新同步最多的时间单位
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#快照存储的目录
dataDir=/home/zk/zookeeper-3.4.14/data
# the port at which the clients will connect
#端口
clientPort=2181
#集群ip 第一个端口为集群通信端口,第二个为选举端口
server.1=192.168.31.51:2888:3888
server.2=192.168.31.39:2888:3888
server.3=192.168.31.148:2888:3888
server.4=192.168.31.27:2888:3888:observer
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
第四个observer的配置文件如下,其实只是多了一行配置。
# The number of milliseconds of each tick
#一个时间单位是两秒
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
#初始化同步最多10个单位
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
#更新同步最多的时间单位
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#快照存储的目录
dataDir=/home/zk/zookeeper-3.4.14/data
# the port at which the clients will connect
#端口
clientPort=2181
#集群ip 第一个端口为集群通信端口,第二个为选举端口
server.1=192.168.31.51:2888:3888
server.2=192.168.31.39:2888:3888
server.3=192.168.31.148:2888:3888
server.4=192.168.31.27:2888:3888:observer
#这个节点为observer
peerType=observer
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
zk基本命令
进入客户端
zkCli.sh进入本地客户端,注意虽然连接的是本地zk但是数据内容还是连接的集群。
查看节点
ls /path/path
zk的节点类似于我们的文件目录一级一级往下迭代。当前这个zookeeper节点是zk自带的。
创建节点
永久节点
create /path value
创建永久节点,并且设置节点信息
临时节点
create -e /path value
创建临时节点,并且设置节点信息
临时节点和永久节点的区别
临时节点绑定客户端,客户端一旦关闭,该节点就会被自动删除,临时节点也不能创建子节点
顺序节点
create -s /path value
创建的节点会会自动带有编号,这意味着,我们可以使用zk获取唯一的编号,并且在分布式环境下也是唯一的。
临时顺序节点
create -e -s /path value
查看节点内容
get /path/path/...
获取节点的内容以及节点的详细描述
节点信息描述
删除节点
delete /path/path...
注意如果节点下包含的有子节点,无法删除,必须将子节点全部删除后,才可以删除。
修改节点内容
set /path/path... value
锁定某一个节点然后修改节点内容