场景
安装及配置
解压
tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz
重命名
mv apache-zookeeper-3.6.0-bin zookeeper
在/opt/zookeeper/这个目录上创建zkData和zkLog目录
mkdir zkData
mkdir zkLog
进入/opt/zookeeper/conf这个路径,复制一份 zoo_sample.cfg 文件并命名为 zoo.cfg
cd conf
cp zoo_sample.cfg zoo.cfg
编辑zoo.cfg文件,修改dataDir路径:
dataDir=/opt/zookeeper/zkData
dataLogDir=/opt/zookeeper/zkLog
zoo.cfg配置文件中的参数详解
```shell tickTime =2000:通信心跳数,Zookeeper服务器与客户端心跳时间,单位毫秒Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。
initLimit =10:LF初始通信时限,集群中的Follower跟随者服务器与Leader领导者服务器之间,启动时能容忍的最多心跳数 10 * tickTime(10个心跳时间)如果领导和跟随者没有发出心跳通信,就视为失效的连接,领导和跟随者彻底断开。
syncLimit =5:LF同步通信时限,集群启动后,Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime->10秒,Leader就认为Follwer已经死掉,会将Follwer从服务器列表中删除。
dataDir:数据文件目录+数据持久化路径,主要用于保存Zookeeper中的数据。
dataLogDir:日志文件目录。
clientPort =2181:客户端连接端口,监听客户端连接的端口。
<a name="0dfbe902"></a>
## 常用命令
1. 启动Zookeeper
```shell
./zkServer.sh start
查看进程是否启动(QuorumPeerMain:是zookeeper集群的启动入口类,是用来加载配置启动QuorumPeer线程的)
jps
查看状态
./zkServer.sh status
启动客户端
./zkCli.sh
退出客户端
quit
查看根节点下的一级节点
ls /
查看节点的详细数据
老版本:ls2 /
新版本:ls -s /
- cZxid:创建节点的事务
每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。
事务ID是ZooKeeper中所有修改总的次序。
每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。 - ctime:被创建的毫秒数(从1970年开始)
- mZxid:最后更新的事务zxid
- mtime:最后修改的毫秒数(从1970年开始)
- pZxid:最后更新的子节点zxid
- cversion:创建版本号,子节点修改次数
- dataVersion:数据变化版本号
- aclVersion:权限版本号
- ephemeralOwner:如果是临时节点,这个是znode拥有者的session id。如果不是临时节点
则是0。 - dataLength:数据长度
- numChildren:子节点数
创建节点
创建节点:create /xx
创建节点并赋值:create /xx xxx
创建多级节点:create /xx/xx
创建短暂节点:create -e /xx
创建排序节点:create -s /xx
创建短暂并排序节点:create -e -s /xx
查看节点的值
get /xx
修改节点的值
set /xx xxx
删除节点
删除节点:delete /xx
递归删除存在子节点的节点:deleteall /xx
监听节点变化
addwatch /xxx
如果被监听的节点修改内容后则:WatchedEvent state:SyncConnected type:NodeDataChanged path:/xxx
如果被监听的节点创建子节点后则:WatchedEvent state:SyncConnected type:NodeCreated path:/xxx/yyy
集群部署
假设有三台服务器,集群部署Zookeeper(先搞定一台,再克隆两台)
在/zkData目录下创建myid文件
vim myid
1(编号,其余两台机器分别写2和3)
配置zoo.cfg文件
vim zoo.cfg
#######################cluster##########################
server.1=192.168.126.134:2888:3888
server.2=192.168.126.137:2888:3888
server.3=192.168.126.131:2888:3888
- 解读配置的内容 server.A=B:C:D
- A:一个数字,表示第几号服务器
集群模式下配置的/opt/zookeeper/zkData/myid文件里面的数据就是A的值 - B:服务器的ip地址
- C:与集群中Leader服务器交换信息的端口
- D:选举时专用端口,万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选
出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口
- A:一个数字,表示第几号服务器
- 克隆其余两台服务器
- 在虚拟机数据目录vms下,创建zk02
- 将本台服务器数据目录下的.vmx文件和所有的.vmdk文件分别拷贝zk02下
- 虚拟机->文件->打开 (选择zk02下的.vmx文件)
- 开启此虚拟机,弹出对话框,选择“我已复制该虚拟机”
- 进入系统后,修改linux中的ip,修改/opt/zookeeper/zkData/myid中的数值为2
- 第三台服务器重复如上步骤 - 关闭每台机器的防火墙
临时关闭
systemctl stop firewalld.service
- 启动第一台并检查状态
./zkServer.sh start
./zkServer.sh status
得到结果:
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Error contacting service. It is probably not running.
因为没有超过半数以上的服务器,所以集群失败 (防火墙没有关闭也会导致失败)
- 当启动第2台服务器时
查看第1台的状态:Mode: follower
查看第2台的状态:Mode: leader
关联Java
生产者消费者模型
分布式锁
安装
tar
命名
zoo.cfg
配置
zoo.cfg
端口
指定Dir和Log
mkDir
pid 序号
mkLog
bin
./zkServer.sh start
./zkServer.sh status
./zkServer.sh stop
./zkCli.sh
jps
运行命令
ls /
ls /某某
ls /某某/某某某
create /某某
create -e /某某
create -? /某某
delete
deleteAll
get
set
exists
关联Java