zookeeper笔记
zookeeper 动物园管理员。前几天看到 金蝉脱壳2 台词中出现了这个词。黄教主演技还不错。
其实Zookeeper的作用是用来做HA高可用。hadoop或spark的HA都需要利用到它。
########################### zookeeper 选举机制 ############################ #服务器ID, 编号越大在选举算法中权重越大; #选举状态: Looking,竞选; Following,随从状态,同步leader状态,参与投票. observing, 观察状态,同步leader状态,不参与投票. Leading,领导状态. #数据ID: 服务器中存放的最新数据version,值越大数据越新,在选举中权重越大. #逻辑时钟: 也叫投票次数,同一轮投票过程中逻辑值是相同的,每投完一次票这个数据就增加,如果没参与投票,下一轮就比其它的小. #全新集群选举: 1,每个机器都给自己投票; 2,投票数过半选举结束. 主要参考myid的值. #非全新选举: 运行中有机器当掉时,就需要重新选举,过程就需要加入:数据ID,服务器ID和逻辑时钟. #选举标准变为: 1,逻辑时钟小的选举结果被忽略,重新投票; 2,统一逻辑时钟后,数据ID大的胜出; 3,数据ID相同的情况下,服务器ID大的胜出.根据这些规则选出leader.
安装与配置:
#安装前先要安装好JDK, 配置ssh免密登录. #集群时间同步, 防火墙关闭, 主机名, hosts配置. #下载安装包 http://zookeeper.apache.org tar zxvf zookeeper-3.4.5.tar.gz #配置环境变量 每台zookeeper都要修改. vim /etc/profile #增加两行zookeeper环境变量 export ZOOKEEPER_HOME=/usr/local/src/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin scp -r /etc/profile root@slave1:/etc/ scp -r /etc/profile root@slave2:/etc/ source /etc/profile cd /usr/local/src/zookeeper/ mkdir zkdata vim zookeeper/conf/zoo.cfg #修改配置文件 dataDir=/usr/local/src/zookeeper/zkdata server.1=master:2888:3888 server.2=slave1:2888:3888 server.3=slave2:2888:3888 shift zz cd /usr/local/src/zookeeper/zkdata echo 1 > myid #服务器编号 scp -r /usr/local/src/zookeeper/ root@slave1:/usr/local/src/ scp -r /usr/local/src/zookeeper/ root@slave2:/usr/local/src/ # 一定要修改各台服务器编号 myid /usr/local/src/zookeeper/bin/zkServer.sh start #启动服务. 每台都需要启动 zkServer.sh status #查看状态 也可以jps zkServer.sh stop #停止服务
Shell 的使用:
############################# 开始 shell 使用 ##################################### zkCli.sh -server master:2181 #连接zookeeper服务,省略参数则连接本机 ls / #查看根节点 #创建节点 节点类型: 临时节点、永久节点 #创建后,节点类型不能修改。 create /hellozk 123 #创建节点和数据 create -s /hellozk 456 #创建序列化的节点,容易判断顺序。 create -e /hellozk/a 456 #创建临时节点. 临时节点将在退出连接后自动删除 #读取节点 # dataVersion 数据版本号,每次set都会加1; cversion子节点版本号; cZxid Znode创建的事务id; mZxid Znode被修改的事务id; ephemeralOwner为0表示不是临时节点 get /hellozk #得到节点的数据和属性信息. ls2 /hellozk #得到节点的子节点和属性信息 #更新/删除节点 set /hellozk abcd #更新节点的数据, delete /hellozk #删除节点. 必须没有子节点. rmr /hellozk #递归删除,包含子节点 #事件监听 watch 分布式的事件通知功能 ls /mygirls watch #对一个节点的子节点变化事件注册了监听 get /mygirls watch #对节点的数据内容变化注册了监听 stat /mygirls watch #对节点状态改变注册监听 #监听事件只一次有效,后续需要再注册,或者用脚本完成. ls2, stat 都可以watch #quota setquota -n|-b 2 /test # 限制子节点最大个数, 参数二选一, -b限制数据长度. 软限制.只会有日志警告. cat zookeeper.out #可以看到quota的WARN信息 # > zookeeper.out 可以清空文件. listquota /test # 查看quota delquota -n /test #删除quota #history history #显示命令历史. redo 10 #调用历史ID是10的命令.
Java API方式:简单监听机制实现
package zk.mydemo; import org.apache.zookeeper.*; public class Test { public static void main(String[] args) throws Exception { //构造java zk客户端 ZooKeeper zk = new ZooKeeper("slave2:2181,master:2181", 30000, new Watcher() { //事件通知的回调方法 public void process(WatchedEvent e) { System.out.println(e.getPath()); System.out.println(e.getType()); System.out.println(e.getState()); } }); zk.create("/myDemo","第一个DEMO".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zk.close(); } }