ZooKeeper是一个分布式应用程序协调服务,它本身就是一个分布式程序
zookeeper集群节点数量一般是奇数台,只要有半数以上的节点存活,zookeeper就能为程序正常提供服务。它里面存的是描述信息的数据,不是业务数据
安装
下载并解压ZooKeeper压缩包
下载地址
代码语言:javascript复制 [root@bogon servers]# ls
zookeeper-3.4.12
[root@bogon servers]# mv zookeeper-3.4.12 zookeeper
[root@bogon servers]# ls
zookeeper
配置集群映射IP
- 进入ZooKeeper安装目录
[root@bogon servers]# cd zookeeper/
[root@bogon zookeeper]# ls
bin dist-maven lib README_packaging.txt zookeeper-3.4.12.jar.asc
build.xml docs LICENSE.txt recipes zookeeper-3.4.12.jar.md5
conf ivysettings.xml NOTICE.txt src zookeeper-3.4.12.jar.sha1
contrib ivy.xml README.md zookeeper-3.4.12.jar
[root@bogon zookeeper]# cd conf
[root@bogon conf]# ls
configuration.xsl log4j.properties zoo_sample.cfg
[root@bogon conf]# mv zoo_sample.cfg zoo.cfg
[root@bogon conf]# ls
configuration.xsl log4j.properties zoo.cfg
[root@bogon conf]# vi zoo.cfg
按i键进入编辑模式,修改dataDir后面的内容如下:
代码语言:javascript复制 dataDir=/home/hadoop/storage/zookeeper
# 指定zookeeper将数据保存在哪个目录下
2.在文件最末尾加上如下内容:
代码语言:javascript复制 server.1=IP:2888:3888
server.2=IP:2888:3888
server.3=IP:2888:3888
......
ZooKeeper集群有几个节点就配置几个serve
其中IP地址也可以换成主机名,前提是在/etc/hosts文件中配置了IP和主机名的映射。
ZooKeeper默认端口号为2888和3888,2888为原子广播端口,也是leader和follower之间通信的端口,3888为选举端口。
3.创建ZooKeeper数据存放目录(每台都要创建):
代码语言:javascript复制 mkdir -p /home/hadoop/storage/zookeeper
4.远程复制分发安装文件
代码语言:javascript复制 scp -r zookeeper slave1:$PWD
5.设置myid
在dataDir指定的目录下创建一个myid文件,文件内容为该机器的编号,也就是在zoo.cfg中server.x的x ,例如,添加的配置为:server.1=192.168.200.6:2888:3888,那么在IP为192.168.200.6这台机器中的myid文件内容为1,以此类推,每台机器都要配置。
代码语言:javascript复制 [root@bogon conf]# mkdir -p /home/hadoop/storage/zookeeper
[root@bogon conf]# echo "1" > /home/hadoop/storage/zookeeper/myid
[root@bogon conf]# cat /home/hadoop/storage/zookeeper/myid # 查看是否添加成功
1
[root@bogon conf]#
6.启动zookeeper
在zookeeper安装目录下的bin目录中执行如下命令启动zookeeper服务(每一台都要单独启动):
代码语言:javascript复制 ./zkServer.sh start
启动完成后可以查看每台机器的状态,同样在bin目录下执行如下命令:
代码语言:javascript复制 ./zkServer.sh status
使用
zookeeper启动后可以通过客户端命令行操作,也可以用JavaAPI操作。
命令 | 含义 |
---|---|
./zkCli.sh | 进入客户端的命令行(在bin目录下执行) |
connect host:2181 | 连接指定的客户端(在zookeeper命令行中) |
create path data acl | 创建节点,acl是权限,暂时不用管 |
ls path [watch] | 查看节点 |
get path [watch] | 获取节点数据,查看节点信息 |
set path data [version] | 设置节点数据 |
delete path | 删除节点 |
rmr path | 删除节点及其所有子节点 |
节点类型
Znode有两种类型: 短暂(ephemeral):创建了之后,客户端如果断开连接,会自动删除节点。 持久(persistent):创建了不会自己删除
如果不指定参数默认创建的节点类型是持久节点。
-e
参数指定创建短暂节点,客户端断开连接后再次登录时,节点消失 。例如:
create -e /znode01 666
-s
参数指定创建序号节点,所以又会有短暂的序号节点,持久的序号节点:
create -s /znode02 123 #创建持久带序号的节点
create -e -s /znode03 123 # 创建临时序号节点
get path [watch]
选上watch的意思是:获取值的时候注册监听,并且只生效一次。由于是获取数据的时候注册监听,所以这个只监听数据的变化,添加节点信息不会监听到。
ls path watch
这个时候在path下添加新节点就可以被监听到。
JavaAPI操作zookeeper
代码语言:javascript复制 /**
* new 出ZooKeeper后,有三个参数:
* connectString:ZooKeeper集合主机,可以写多个,用逗号隔开 。例如: IP:2181 或者 主机名:2181
* sessionTimeout:会话超时时间,以毫秒为单位
* watcher:实现“监视器”界面的对象,通过该对象返回连接状态
*/
zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent event) {
// 收到事件通知后的回调函数(这里因该写自己的业务处理逻辑),一定要开启事件监听
System.out.println("监听到的事件类型为:" event.getType() ",事件发生的地址(路径)为:" event.getPath());
try {
// 监听根下的子节点变化
zkClient.getChildren("/", true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
方法 | 说明 |
---|---|
zkClient.create(path,byth [] data, acl ,createMode) | acl一般用Ids.OPEN_ACL_UNSAFE,createMode就是四种节点类型,临时,临时有序号,永久,永久有序号 |
zkClient.exists(path,watcher) | 返回值是一个Stat,也就是命令行中get后的元数据信息,如果这个节点不存在,则返回值Stat为null |
zkClient.getChiledren(path,watcher) | 获取子节点 返回值是一个list |
zkClient.getDate(path,wathcer,stat) | 获取znode数据,返回值为byte[] , stat 给null就可以了 |
zkClient.delete(path,version) | 参数version是指定要删除的版本,-1 表示删除所有的版本 |
zkClient.setData(path,data,version) | 获取的数据记得要转换成为byte类型,version为-1,表示设置所有版本的数据 |
Zookeeper选举机制
以ZooKeeper集群五台机器为例: 每台机器依次按顺序启动
- 第一个节点启动,投一票给自己,票数不超过一半,不能是Leader,进入looking状态。
- 第二个节点启动,投一票给自己,由于第二个节点的id为2,权重大于第一个节点,此时,第一个节点投一票给第二个节点,第二个节点获得两票,票数不过半,不能当选为Leader,进入looking状态。
- 第三个节点启动,投一票给自己,由于第三个节点的id为3,权重大于第一、二个节点,此时,第一、二个节点各投一票给第三个节点,第三个节点获得三票,票数过半,当选为Leader,此时,前面的两个节点状态由looking变为为Follower,集群开始正常工作。
- 第四个节点启动,投一票给自己,它一看,此时集群中已经有Leader了,直接变为Follower。
- 第五个节点启动,仍然投一票给自己,然后变为Follower。