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

曲则全,枉则直,洼则盈,敝则新,少则得,多则惑🎆

ZooKeeper是一个分布式应用程序协调服务,它本身就是一个分布式程序

zookeeper集群节点数量一般是奇数台,只要有半数以上的节点存活,zookeeper就能为程序正常提供服务。它里面存的是描述信息的数据,不是业务数据

安装

  1. 下载并解压ZooKeeper压缩包
    下载地址

     [root@bogon servers]# ls
     zookeeper-3.4.12
     [root@bogon servers]# mv zookeeper-3.4.12 zookeeper
     [root@bogon servers]# ls
     zookeeper
    
  2. 配置集群映射IP

    1. 进入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后面的内容如下:

       dataDir=/home/hadoop/storage/zookeeper
       # 指定zookeeper将数据保存在哪个目录下
      

      在文件最末尾加上如下内容:

       server.1=IP:2888:3888
       server.2=IP:2888:3888
       server.3=IP:2888:3888
       ......
      

      ZooKeeper集群有几个节点就配置几个server
      其中IP地址也可以换成主机名,前提是在/etc/hosts文件中配置了IP和主机名的映射。
      ZooKeeper默认端口号为2888和3888,2888为原子广播端口,也是leader和follower之间通信的端口,3888为选举端口。

  3. 创建ZooKeeper数据存放目录(每台都要创建):

     mkdir -p /home/hadoop/storage/zookeeper
    
  4. 远程复制分发安装文件

     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,以此类推,每台机器都要配置。

     [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服务(每一台都要单独启动):

     ./zkServer.sh start
    

    启动完成后可以查看每台机器的状态,同样在bin目录下执行如下命令:

     ./zkServer.sh status	
    

    jps会看到进程:QuorumPeerMain

使用

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

		/**
		 * 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。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿年、嗯啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值