¶分布式安装部署
官网首页:https://zookeeper.apache.org/
下载地址:http://mirror.bit.edu.cn/apache/zookeeper/
¶集群规划
在node1,node2和node3三个节点上部署zookeeper,三个节点都已安装jdk。
IP | 节点名称 | zookeeper |
---|---|---|
192.168.100.21 | spark-node1 | |
192.168.100.22 | spark-node2 | |
192.168.100.23 | spark-node3 |
¶解压安装
- 解压zookeeper按转包到
/opt/
目录下
1 | sudo tar -zxvf zookeeper-3.4.12.tar.gz -C /opt/ |
- 在
/opt/
创建软连接
1 | sudo ln -s /opt/zookeeper-3.4.12 /opt/zookeeper |
- 在
/opt/zookeeper
目录下创建data
1 | mkdir /opt/zookeeper/data |
- 覆盖zookeeper的安装配置
1 | mv /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg |
¶配置zoo.cfg文件
具体配置,修改dateDir,添加日志存放目录
1 | dataDir=/opt/zookeeper/data |
末尾增加如下配置
1 | server.1=spark-node1:2888:3888 |
¶集群配置
- 在
/opt/zookeeper/data
目录下创建一个myid的文件
1 | touch myid |
- 编辑myid文件,在文件中添加与server对应的编号:如 1
1 | vim myid |
- 拷贝配置好的zookeeper到其它机器上
1 | scp -r zookeeper*/ xxx@spark-node2:/opt/ |
并修改spark-node2,spark-node3中myid文件中内容为2、3
1 | echo 2 > myid |
¶启动集群
- 分别启动zookeeper
1 | bin/zkServer.sh start |
- 查看状态
1 | bin/zkServer.sh status |
- 停止zookeeper
1 | bin/zkServer.sh stop |
¶加入Systemd管理
1 | vim /usr/lib/systemd/system/zookeeper.service |
¶配置环境变量
1 | sudo vim /etc/profile |
¶zoo.cfg配置参数解读
Server.A=B:C:D。
A是一个数字,表示这个是第几号服务器;
B是这个服务器的ip地址;
C是这个服务器与集群中的Leader服务器交换信息的端口;
D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
- tickTime=2000:通信心跳数
tickTime:通信心跳数,Zookeeper服务器心跳时间,单位毫秒
Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。
它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超时时间是2 x tickTime)
2)initLimit=10:LF初始通信时限
集群中的follower跟随者服务器(F)与leader领导者服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。
投票选举新leader的初始化时间
Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。
Leader允许F在initLimit时间内完成这个工作。
3)syncLimit=5:LF同步通信时限
集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit x tickTime,
Leader认为Follwer死掉,从服务器列表中删除Follwer。
在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。
如果L发出心跳包在syncLimit之后,还没有从F那收到响应,那么就认为这个F已经不在线了。
4)dataDir:数据文件目录+数据持久化路径
保存内存数据库快照信息的位置,如果没有其他说明,更新的事务日志也保存到数据库。
5)clientPort=2181:客户端连接端口
监听客户端连接的端口
¶客户端命令行操作
- 启动客户端
1 | zkCli.sh |
- 显示所有操作命令
1 | [zk: localhost:2181(CONNECTED) 0] help |
- 查看当前znode中所包含的内容
1 | [zk: localhost:2181(CONNECTED) 1] ls / |
- 查看当前节点数据并能看到更新次数等数据
1 | [zk: localhost:2181(CONNECTED) 2] ls2 / |
- 创建普通节点
1 | [zk: localhost:2181(CONNECTED) 3] create /opt "aa" |
- 获取节点值
1 | [zk: localhost:2181(CONNECTED) 5] get /opt |
- 创建短暂节点
1 | [zk: localhost:2181(CONNECTED) 7] create -e /app 8888 |
在当前客户端是能查看到的
1 | [zk: localhost:2181(CONNECTED) 8] ls / |
退出当前客户端然后再重启客户端
1 | [zk: localhost:2181(CONNECTED) 9] quit |
再次查看根目录下短暂节点已经删除
1 | [zk: localhost:2181(CONNECTED) 0] ls / |
- 创建带序号的节点
先创建一个普通的根节点app
1 | [zk: localhost:2181(CONNECTED) 1] create /app "app" |
创建带序号的节点
1 | [zk: localhost:2181(CONNECTED) 2] create -s /app/aa 888 |
如果原节点下有1个节点,则在排序时从1开始,以此类推。
1 | [zk: localhost:2181(CONNECTED) 5] create -s /opt/aa 888 |
- 修改节点数据值
1 | [zk: localhost:2181(CONNECTED) 6] set /opt 999 |
- 节点的值变化监听
在spark-node2主机上注册监听/opt节点数据变化
1 | zkCli.sh |
在spark-node1主机上修改/opt节点的数据
1 | [zk: localhost:2181(CONNECTED) 7] set /opt 777 |
观察spark-node2主机收到数据变化的监听
1 | [zk: localhost:2181(CONNECTED) 1] |
- 节点的子节点变化监听(路径变化)
在spark-node2主机上注册监听/opt节点的子节点变化
1 | [zk: localhost:2181(CONNECTED) 2] ls /opt watch |
在spark-node2主机/opt节点上创建子节点
1 | [zk: localhost:2181(CONNECTED) 8] create /opt/bb 666 |
观察spark-node2主机收到子节点变化的监听
1 | [zk: localhost:2181(CONNECTED) 3] |
- 删除节点
1 | [zk: localhost:2181(CONNECTED) 9] delete /opt/bb |
- 递归删除节点
1 | [zk: localhost:2181(CONNECTED) 10] rmr /opt |
- 查看节点状态
1 | [zk: localhost:2181(CONNECTED) 14] stat /app |
- 退出客户端
1 | [zk: localhost:2181(CONNECTED) 17] quit |