Zookeeper学习使用

本文介绍了Zookeeper的安装、单机版分布式配置中心实现、集群部署以及核心面试问题。通过案例演示如何在ABCD集群中使用Zookeeper存储配置,探讨了与mq、redis的区别,以及Zookeeper的选举机制、权限管理和主从节点操作原理。
摘要由CSDN通过智能技术生成

2019年zookeeper实战视频教程合集20集

补充案例一:zookeeper实现分布式锁

补充案例二:springboot集成zookeeper

补充笔记文档一: 尚硅谷大数据技术之Zookeeper

一、zookeeper的安装

1、Linux下安装安装启动

在这里插入图片描述

2、基本使用命令

在这里插入图片描述

ls create get delete set…

二、java使用zookeeper单机版

1、案例一:单机版实现分布式配置中心

案例背景:假设一个web项目,在四个服务器A、B、C、D上集群部署,现需要修改web项目的配置文件中,默认访问的用户名,按照传统做法,是需要分别去四个服务器分别修改application.yml的配置。

zookeeper解决:在zookeeper里新增一个目录节点,如:username,并把配置信息存储在这里,不再写入application.yml里,同时让ABCD监听此节点。修改配置时可以只修改zookeeper里的配置即可

结构图
在这里插入图片描述

(1)引入依赖

在这里插入图片描述

(2)监听节点java代码

在这里插入图片描述
代码:

package org.springblade.modules.datatrans.config;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.springblade.modules.datatrans.service.IProtocolService;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * zookeeper
 * 
 * @author Eric
 * @time 2021年2月1日
 */
public class ZookeeperConfig implements Watcher {

	@Autowired
	NodeConfig nodeConfig;

	@Autowired
	IProtocolService protocolService;

	private CountDownLatch countDownLatch = new CountDownLatch(1);

	private ZooKeeper zk = null;

	private Stat stat = new Stat();

	public void connZookeeper() throws IOException, InterruptedException {
		zk = new ZooKeeper(nodeConfig.getZkAddress(), 5000, new ZookeeperConfig());
		countDownLatch.await();
		// Thread.sleep(Integer.MAX_VALUE);
	}

	@Override
	public void process(WatchedEvent event) {
		if (KeeperState.SyncConnected == event.getState()) {
			if (EventType.None == event.getType() && null == event.getPath()) {
				countDownLatch.countDown();
			} else if (event.getType() == EventType.NodeDataChanged) {
				try {
					String zkMessage = new String(zk.getData(nodeConfig.getRoot(), true, stat));
					protocolService.updateByZookeeper(zkMessage);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

}

(3)将上面的代码启动四次,模拟ABCD集群部署

2、总结案例一:

和消息队列mq、redis的订阅功能一样,就是监听某节点数据的变化,目测在某些简单的场景下mq、redis的订阅发布都能实现此功能。

(1)注意重点!!!和mq和redis的区别!!!:

一、zookeeper监听到变化只会把事件告诉客户端,并不会直接把数据给客户端,需要在匹配到需要的事件类型后,自己手动获取一次数据,如上图40—42行代码
二、zookeeper设置监听后只会监听一次,成功监听到修改事件,获取修改后值后需要重新监听一次,如上图42行代码,zk.getData()后需要再次传入true

三、java使用zookeeper集群版

1、Linux搭建启动集群

在这里插入图片描述

2、连接集群java代码

按照第一步搭建成功后,就是将多个ip用逗号连接
在这里插入图片描述

四、zookeeper的相关面试题

1、 zookeeper集群启动时的选举机制是什么?

1)半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
2)Zookeeper虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。
3)以一个简单的例子来说明整个选举的过程。
假设有五台服务器组成的Zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。假设这些服务器依序启动,来看看会发生什么,如图所示。

在这里插入图片描述
图 Zookeeper的选举机制步骤分析

(1)服务器1启动,此时只有它一台服务器启动了,它发出去的报文没有任何响应,所以它的选举状态一直是LOOKING状态。
(2)服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1、2还是继续保持LOOKING状态。
(3)服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的Leader。
(4)服务器4启动,根据前面的分析,理论上服务器4应该是服务器1、2、3、4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以它只能接收当小弟的命了。
(5)服务器5启动,同4一样当小弟。

2、主从节点的读写权限是怎样的?

(答:)主节点可读、写,从节点只能读 ;

3、为什么我在从节点上做写操作也能成功?

(答:)在从节点中进行写操作也可成功,原因是从节点把写请求交给了主节点,主节点进行写操作的;

4、把写请求交给主节点后,主节点具体是怎么处理的?这么做的目的是什么?

(1)主节点接到写请求后,会根据请求事务生成一个唯一的全局的严格保证顺序的zxid
(2)根据zxid唯一标识将所有写请求发给所有从节点,从节点收到后告诉主节点已收到,
(3)当从节点有半数以上接到zxid后,主节点就开始进行commit提交事务,同时也通知所有从节点都开始commit

目的:目的就是为了写操作后,保持数据的一致性!

5、主节点宕机后怎么办?就不能做写操作了?

(答:)主节点宕机后会在从节点中重新选举一个从节点,选举原理也叫ZAB原子广播协议,具体分析如下:

假设有三个节点,主节点2,从节点1、3,当主节点2宕机后开始投票选举,投票规则(myid,zxid)myid为自己的标识id在myid文件中配置,zxid为自己当前接收到的最大写请求的zxid

(1)开始投票,从节点1发出选票(1,102)到从节点3,从节点3发出选票(3,101)到从节点1,

(2)在从节点1中比较zxid,102>101,则继续使用自己的(1,102),选票无变更

(3)在从节点3中比较zxid,102>101,则将自己的(3,101)作废,使用收到的(1,102),选票有变更,节点3要把新选票(1,102)发给节点1,

(4)当从节点1或3发现自己手里的选票个数大于总数/2时,就将此从节点作为新的主节点,所以(1,102)就成为了主节点

(5)之所以选zxid大的,是为了新的主节点在做数据同步时能少做点同步操作,也保证了数据完整性,如果是小的zxid作为主节点,同步时就会有数据丢失,也会出现数据不一致

6、监听器原理

在这里插入图片描述

7、ZooKeeper的部署方式有哪几种?集群中的角色有哪些?集群最少需要几台机器?

(1)部署方式单机模式、集群模式
(2)角色:Leader和Follower
(3)集群最少需要机器数:3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值