前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ZooKeeper安装、基本使用以及选举机制

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

作者头像
阿年、嗯啊
发布2021-04-29 18:00:09
3460
发布2021-04-29 18:00:09
举报
文章被收录于专栏:阿年的数据梦

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。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 使用
    • 节点类型
      • JavaAPI操作zookeeper
      • Zookeeper选举机制
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档