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();
    }
}

DOCX版本的zookeeper笔记

原文地址:https://www.cnblogs.com/frx9527/p/zookeeper.html