博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Zookeeper学习笔记(三)-- zookeeper集群及集群中的知识点
阅读量:3941 次
发布时间:2019-05-24

本文共 5078 字,大约阅读时间需要 16 分钟。

zookeeper集群搭建

单机环境下,jdk、zookeeper安装完毕,基于一台虚拟机,进行zookeeper伪集群搭建,zookeeper集群中包含3个节点,节点对外提供服务端口号分别为2181、2182、2183。

1.基于zookeeper-3.4.10复制三份zookeeper安装好的服务器文件,目录名称分别为zookeeper2181、zookeeper2182、zookeeper2183

cp -r zookeeper-3.4.10 zookeeper2181cp -r zookeeper-3.4.10 zookeeper2182cp -r zookeeper-3.4.10 zookeeper2183

2.修改zookeeper2181服务器对应配置文件

#服务器对应端口号clientPort=2181#数据快照文件所在路径dataDir=/opt/zookeeper2181/data#集群配置信息#server.A=B:C:D    #A:是一个数字,表示这个是服务器的编号    #B:是这个服务器的ip地址    #C:Zookeeper服务器之间的通信端口    #D:Leader选举的端口    server.1=172.16.114.135:2287:3387server.2=172.16.114.135:2288:3388server.3=172.16.114.135:2289:3389

3.在 上一步 dataDir 指定的目录下,创建 myid 文件,然后在该文件添加上一步server 配置的对应 A 数字。

#zookeeper2181对应的数字为1#/opt/zookeeper2181/data目录下执行命令echo "1" > myid

4.zookeeper2182、zookeeper2183参照步骤2/3进行相应配置

5.分别启动三台服务器,检验集群状态

启动命令:

./zkServer.sh start

登录命令:

./zkCli.sh -server 192.168.188.133:2181./zkCli.sh -server 192.168.188.133:2182./zkCli.sh -server 192.168.188.133:2183

测试,在2181端口,创建一个节点,看2182,2183是否能获取到该节点,如果能获取到,则说明zookeeper集群搭建成功。

2181端口:

在这里插入图片描述
2182端口:
在这里插入图片描述
2183端口:
在这里插入图片描述

可以发现,zookeeper集群已经搭建成功。

一致性协议:zab协议

zab协议 的全称是 Zookeeper Atomic Broadcast (zookeeper原子广播)。zookeeper 是通过 zab协议来保证分布式事务的最终一致性。

基于zab协议,zookeeper集群中的角色主要有以下三类,如下表所示:

在这里插入图片描述
zab广播模式工作原理,通过类似两阶段提交协议的方式解决数据一致性:
在这里插入图片描述

  • leader从客户端收到一个写请求
  • leader生成一个新的事务并为这个事务生成一个唯一的ZXID
  • leader将这个事务提议(propose)发送给所有的follows节点
  • follower节点将收到的事务请求加入到历史队列(history queue)中,并发送ack给leader
  • 当leader收到大多数follower(半数以上节点)的ack消息,leader会发送commit请求
  • 当follower收到commit请求时,从历史队列中将事务请求commit

在我们搭建的环境中,2182是作为领导者节点存在的(leader),2181和2183节点是作为跟随着节点存在的(follower)。如下图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
比如说,我们在2181服务中写数据,2181会发送一个请求给2182,2182会根据上面6个步骤,将数据写入集群中。

zookeeper的leader选举

服务器状态

looking:寻找leader状态。当服务器处于该状态时,它会认为当前集群中没有leader,因此需要进入leader选举状态。

leading: 领导者状态。表明当前服务器角色是leader。

following: 跟随者状态。表明当前服务器角色是follower。

observing:观察者状态。表明当前服务器角色是observer。

服务器启动时期的leader选举

在集群初始化阶段,当有一台服务器server1启动时,其单独无法进行和完成leader选举,当第二台服务器server2启动时,此时两台机器可以相互通信,每台机器都试图找到leader,于是进入leader选举过程。选举过程如下:

  1. 每个server发出一个投票。由于是初始情况,server1和server2都会将自己作为leader服务器来进行投票,每次投票会包含所推举的服务器的myid和zxid,使用(myid,zxid)来表示,此时server1的投票为(1, 0),server2的投票为(2, 0),然后各自将这个投票发给集群中其他机器。
  2. 集群中的每台服务器接收来自集群中各个服务器的投票。
  3. 处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行pk,pk规则如下:
    • 优先检查zxid。zxid比较大的服务器优先作为leader。
    • 如果zxid相同,那么就比较myid。myid较大的服务器作为leader服务器。

对于Server1而言,它的投票是(1, 0),接收Server2的投票为(2, 0),首先会比较两者的zxid,均为0,再比较myid,此时server2的myid最大,于是更新自己的投票为(2, 0),然后重新投票,对于server2而言,其无须更新自己的投票,只是再次向集群中所有机器发出上一次投票信息即可。

  1. 统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息,对于server1、server2而言,都统计出集群中已经有两台机器接受了(2, 0)的投票信息,此时便认为已经选出了leader

  2. 改变服务器状态。一旦确定了leader,每个服务器就会更新自己的状态,如果是follower,那么就变更为following,如果是leader,就变更为leading。

服务器运行时期的Leader选举

在zookeeper运行期间,leader与非leader服务器各司其职,即便当有非leader服务器宕机或新加入,此时也不会影响leader,但是一旦leader服务器挂了,那么整个集群将暂停对外服务,进入新一轮leader选举,其过程和启动时期的Leader选举过程基本一致。

​  假设正在运行的有server1、server2、server3三台服务器,当前leader是server2,若某一时刻leader挂了,此时便开始Leader选举。选举过程如下:

  1. 变更状态。leader挂后,余下的服务器都会将自己的服务器状态变更为looking,然后开始进入leader选举过程。
  2. 每个server会发出一个投票。在运行期间,每个服务器上的zxid可能不同,此时假定server1的zxid为122,server3的zxid为122,在第一轮投票中,server1和server3都会投自己,产生投票(1,122),(3, 122),然后各自将投票发送给集群中所有机器。
  3. 接收来自各个服务器的投票。与启动时过程相同
  4. 处理投票。与启动时过程相同,此时,server3将会成为leader。
  5. 统计投票。与启动时过程相同。
  6. 改变服务器的状态。与启动时过程相同。

observer角色及其配置

observer角色特点:

  • 不参与集群的leader选举
  • 不参与集群中写数据时的ack反馈

除了这种简单的区别之外,观察者的功能与跟随者的功能完全相同-客户端可以连接到观察者,并向其发送读写请求。观察者像追随者一样将这些请求转发给领导者,但是他们只是等待听取投票结果。因此,我们可以在不影响投票效果的情况下尽可能增加观察员的数量。

观察者还有其他优点。因为他们不投票,所以它们不是ZooKeeper选举中的关键部分。因此,它们可以在不损害ZooKeeper服务可用性的情况下发生故障或与群集断开连接。给用户带来的好处是,观察者可以通过比跟随者更不可靠的网络链接进行连接。实际上,观察者可用于与另一个数据中心的ZooKeeper服务器进行对话。观察者的客户端将看到快速读取,因为所有读取均在本地提供,并且由于缺少表决协议而需要的消息数量较小,因此写入会导致网络流量最小。

为了使用observer角色,在任何想变成observer角色的配置文件中加入如下配置:

peerType=observer

​  并在所有server的配置文件中,配置成observer模式的server的那行配置追加:observer,例如:

server.3=172.16.114.135:2289:3389:observer

zookeeperAPI连接集群

ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)
  • connectionString - zooKeeper集合主机。
  • sessionTimeout - 会话超时(以毫秒为单位)。
  • watcher - 实现“监视器”界面的对象。ZooKeeper集合通过监视器对象返回连接状态。

代码如下:

public class ZookeeperConnection {
public static void main(String[] args) {
try {
//计数器对象 CountDownLatch countDownLatch = new CountDownLatch(1); //参数1:服务器的ip和端口 //参数2:客户端与服务器之间的会话超时时间,以毫秒为单位的 //参数3:监视器对象 //Zookeeper对象是以异步的方式创建的 ZooKeeper zooKeeper = new ZooKeeper("172.16.114.135:2181,172.16.114.135:2182,172.16.114.135:2183", 5000, new Watcher() {
@Override public void process(WatchedEvent event) {
if(event.getState() == Event.KeeperState.SyncConnected){
//说明客户端与服务端连接对象创建成功了 System.out.println("连接创建成功"); //通知计数器对象不要再阻塞主线程了,可以继续往下执行了。 countDownLatch.countDown(); } } }); //主线程阻塞等待连接对象的创建成功 countDownLatch.await(); //打印客户端和服务器的会话ID System.out.println(zooKeeper.getSessionId()); //释放资源 zooKeeper.close(); }catch (Exception e){
e.printStackTrace(); } }}

转载地址:http://spiwi.baihongyu.com/

你可能感兴趣的文章
python的collections
查看>>
管理书架 0803
查看>>
管理书架 0804
查看>>
管理书架 0805
查看>>
管理书架 0806
查看>>
新一代手机ATM机即将面世 用户无需带卡
查看>>
ARM中国总裁谭军:手机已经进入卖软件的阶段
查看>>
WAP网关服务器应用介绍
查看>>
WAP网关服务器应用介绍
查看>>
C/C++内存问题检查利器——Purify
查看>>
Windows环境利用Vmware7.1.3 搭建iPhone开发环境
查看>>
处理相同号码以+7和8开头,接收到短信需要显示在同一条里面
查看>>
如何去掉短信中联系人输入框dropdown list里面“mobile” “home”等字段的显示
查看>>
在信息收件人里输入号码,不要匹配到电话本里的服务号码
查看>>
由于Email参数SMTP_APPID不同,导致Omacp配置email失败的修改方法
查看>>
如何在android4.4版本上支持蓝牙发送APK文件
查看>>
Omacp收到network Pin之后,会要求输入Pin码
查看>>
android 4.4 滑动锁屏界面,按menu键可以解锁
查看>>
android 4.4上chromium介绍
查看>>
回调函数
查看>>