ZooKeeper安装、基本使用以及选举机制

2021-04-29 18:00:09 浏览数 (1)

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

  1. 进入ZooKeeper安装目录
代码语言:javascript复制
 [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参数指定创建短暂节点,客户端断开连接后再次登录时,节点消失 。例如:

代码语言:javascript复制
create -e /znode01 666

-s参数指定创建序号节点,所以又会有短暂的序号节点,持久的序号节点:

代码语言:javascript复制
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集群五台机器为例: 每台机器依次按顺序启动

  1. 第一个节点启动,投一票给自己,票数不超过一半,不能是Leader,进入looking状态。
  2. 第二个节点启动,投一票给自己,由于第二个节点的id为2,权重大于第一个节点,此时,第一个节点投一票给第二个节点,第二个节点获得两票,票数不过半,不能当选为Leader,进入looking状态。
  3. 第三个节点启动,投一票给自己,由于第三个节点的id为3,权重大于第一、二个节点,此时,第一、二个节点各投一票给第三个节点,第三个节点获得三票,票数过半,当选为Leader,此时,前面的两个节点状态由looking变为为Follower,集群开始正常工作。
  4. 第四个节点启动,投一票给自己,它一看,此时集群中已经有Leader了,直接变为Follower。
  5. 第五个节点启动,仍然投一票给自己,然后变为Follower。

0 人点赞