1、安装步骤
1.1、下载最新的zookeeper版本
zookeeper下载地址
可以通过wget
命令下载,也可以由外部下载通过scp
命令传入例如:
scp apache-zookeeper-3.8.0-bin.tar.gz root@192.168.2.128:/usr/local/soft
1.2、解压到指定目录
tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz -C /usr/local/
修改文件名称
mv apache-zookeeper-3.6.0-bin zookeeper-server01
1.3、修改配置文件
配置文件所在的目录:
zookeeper-server01/conf
在该目录下创建配置文件zoo.cfg
,如下命令
cat zoo_sample.cfg |grep -v "#" |grep -v "^$" > zoo.cfg
在配置文件中添加如下内容
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-server-01/data
clientPort-2181
server.1=192.168.2.128:2887:3887
server.2=192.168.2.128:2888:3888
server.3=192.168.2.128:2889:3889
tickTime=2000
# 心跳的时间单位 毫秒值
initLimit=10
# 启动集群的初始化的事件 10个心跳单位 20s
syncLimit=5
# 集群服务器同步数据的事件5个心跳单位, 10s钟
dataDir=/usr/local/zookeeper-server-01/data
#数据的快照存储目录
clientPort=2181
#服务端提供客户端访问的连接接口
1.4、创建存储数据目录
1、在/zookeeper-server-01/
下创建data目录
mkdir -p /usr/local/zookeeper-server-01/data
2、在/data/
目录下创建一个标志文件myid
cd /usr/local/zookeeper-server-01/data/
echo 1 > myid
1.5、创建同样的zookeeper
资源
同时在创建两份
cp -R zookeeper-server01 zookeeper-server02
cp -R zookeeper-server01 zookeeper-server03
重复以上步骤,同步修改zookeeper-server02
、zookeeper-server03
的zoo.cfg
文件和myid
zookeeper-server02
:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-server-02/data
clientPort-2182
server.1=192.168.2.128:2887:3887
server.2=192.168.2.128:2888:3888
server.3=192.168.2.128:2889:3889
cd /usr/local/zookeeper-server-02/data/
echo 2 > myid
zookeeper-server03
:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-server-03/data
clientPort-2183
server.1=192.168.2.128:2887:3887
server.2=192.168.2.128:2888:3888
server.3=192.168.2.128:2889:3889
cd /usr/local/zookeeper-server-03/data/
echo 3 > myid
1.6、启动服务
zkServer.sh start
# 启动命令
zkServer.sh status
# 查看状态命令
zkServer.sh stop
# 停止服务命令
zkServer.sh restart
# 停止服务命令
2、Zookeeper的核心工作机制
2.1、zookeeper的核心工作机制
1、Zookeeper
:一个leader
,多个follower
组成的集群(3个节点 最佳实践)
2、全局数据一致:每个server
保存一份相同的数据副本,client
无论连接到哪个server
,数据都是一致的
3、分布式读写,更新请求转发,由leader
实施
4、更新请求顺序进行,来自同一个client
的更新请求按其发送顺序依次执行
5、数据更新原子性,一次数据更新要么成功(半数以上节点成功),要么失败
6、实时性,在一定时间范围内,client能读到最新数据(毫秒级别) 1M
2.2、zookeeper数据结构
1、层次化的目录结构,命名符合常规文件系统规范(见下图)
2、每个节点在zookeeper
中叫做znode
,并且其有一个唯一的路径标识
3、节点Znode
可以包含数据(只能存储很小量的数据,<1M)和子节点(但是EPHEMERAL
类型的节点不能有子节点,下一页详细讲解)
4、客户端应用可以在节点上设置监视器
2.3、节点类型
Znode
有四种形式的目录节点
PERSISTENT
持久化节点
PERSISTENT_SEQUENTIAL
持久化顺序节点
EPHEMERAL
临时节点
EPHEMERAL_SEQUENTIAL
临时节点顺序节点
创建znode
时设置顺序标识,znode
名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护
在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序
3、创建节点
3.1、服务器的启动和监控
zkServer.sh start | stop | restart | status
jps
查看java进程 QuorumPeerMain
netstat -natl
netstat -ntpl
3.2、客户端连接
zkCli.sh -server 192.168.2.128:2181
如果是连接当前本机地址, 可以使用 zkCli.sh
3.3、创建节点
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
命令创建节点
-s
: 顺序节点 默认为否
-e
: 临时节点 默认为否
-c
: 创建一个容器节点
-t ttl
创建一个持久化节点或者一个持久化顺序节点的时候, 指定存活时间
path
: 路径|目录
data
: 设置路径下存放的数据
1、创建持久化节点
create /pNod pNode
2、创建临时节点
create -e /eNode eNode
临时节点在会话关闭以后, 会自动删除
临时节点不允许有子节点
3、创建顺序节点
create /lock
create -s /lock/getId
create -e -s /lock/getId2
对于顺序节点, 是允许进行节点重复创建, 默认会在节点后面添加一个全局唯一的顺序ID
4、创建容器节点
容器节点: 可以用来一个节点, 下面存放多个子节点, 当子节点删除完以后, 容器节点会自动删除
create -c /cnode cnode
create -c /cnode/child01 child01
create -c /cnode/child02 child02
delete /cnode/child01
delete /cnode/child02
get /cnode
会通过定时器, 在一分钟没有子节点, 直接删除改节点znode.container.checkIntervalMs
3.4、查看节点
ls [-s] [-w] [-R] path
[-s] : 显示统计信息
[-w]: 查看事件信息
[-R]: 显示递归目录
例如:
ls -R /
/
/pNode
/tempNode
/zookeeper
/pNode/node01
/zookeeper/config
/zookeeper/quota
3.5、获取节点
get [-s] [-w] path
-s
: 显示统计信息
-w
: 获取事件信息
get -s /pNode
pNode
# 获取到的节点数据
cZxid
= 0x600000010 # 创建节点的事务Id
ctime
= Tue Apr 21 16:23:31 CST 2020 #创建时间
mZxid
= 0x600000010 # 修改的事务ID
mtime
= Tue Apr 21 16:23:31 CST 2020 #修改时间
pZxid
= 0x600000010
cversion
= 0 # 当前版本信息
dataVersion
= 0 #数据版本信息
aclVersion
= 0 #权限版本信息
ephemeralOwner
= 0x0 #临时节点的会话ID
dataLength
= 5 # 数据长度
numChildren
= 0 # 子节点个数
3.6、修改节点数据
set [-s] [-v version] path data
-s
设置过程显示节点的状态信息
-v
: 使用CAS设置数据, 使用国歌声, 可以使用stat从dataVersion中找到版本
set -v 0 /node2 node3
set /node2 node3
3.7、删除节点
1、删除单个节点
delete [-v version] path
-v
: 在并发的时候, 使用乐观锁进行删除
delete /node2
2、删除所有节点(递归删除)
deleteall /pNod