1.1 Zookepper介绍与安装以及Zookeeper的选举机制

一、为什么要使用Zookepper

1.前言

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

在这里插入图片描述
所以在学习Dubbo框架的时候,在Dubbo中需要一个注册中心,而Zookeeper是Dubbo官方推荐的注册中心。

Dubbo架构
在这里插入图片描述

2.原因

  • 大部分的分布式应用程序都需要一个主控、协调器或者控制器来物理分布的子进程(如资源,内存分配等)
  • 目前大部分应用开大私有的协调程序,缺乏一个通用性
  • 协调程序的反复编写浪费,难以形成通用、伸缩性好的协调器
  • Zookeeper:提供通用的分布式锁服务,用于协调分布式应用

二、Zookeeper概述

1.介绍

Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和HBase的重要组件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等等。
Zookeeper是一个分布式协调服务,就是为用户的分布式应用程序提供协调服务。

功能

  • 为别的分布式程序服务的
  • 本身就是一个分布式程序
  • 主从协调 服务器节点动态上下线 统一配置管理 分布式共享锁 统一名称服务
  • 管理(存储,读取)用户程序提交的数据 并为用户程序提供数据节点监听服务

2.Zookeeper的集群机制

Zookeeper是为其他分布式程序提供服务的,所以本身不能随便就挂了,所以Zookeeper自身的集群机制就非常重要,Zookeeper的集群机制采用的是半数存活机制,也就是整个集群节点中有半数以上的节点存活的话,那么整个集群环境就可用。这也就是说Zookeeper的集群节点最好是奇数个节点

为什么是奇数个节点最好?
在这里插入图片描述
在这里插入图片描述

2.1 Zookeeper集群节点的角色

Leader

Leader服务器是Zookeeper集群工作的核心,其主要工作如下

  • 事务请求的唯一调度和处理者,保证集群事务处理的顺序性。
  • 集群内部各服务的调度者

Follower

Follwer是Zookeeper集群的跟随者,其主要工作如下:

  • 处理客户端非事务性请求(读取数据),转发事务请求给Leader服务器
  • 参与事务请求Proposal的投票
  • 参与Leader选举投票

Observer

Observer充当观察者角色,观察Zookeeper集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给Leader服务器进行处理,Observe不会参与任何形式的投票,包括事务请求Proposal的投票和Leader选举投票。

二、集群环境的准备与搭建

1.集群环境的准备

通过上面的介绍我们可以知道Zookeeper的集群环境应该配置奇数个节点,所以我们这里搭建的Zookeeper环境准备是在3个节点上搭建的。

1.1 准备3个节点和对他们进行网络配置

准备3个CentOS7.0的虚拟机节点,并且安装配置好JDK版本最好是8。
我这里是采取克隆的方法。

可以通过VMware的克隆或者复制文件夹的方式来创建另外两个新节点

ip主机名
192.168.134.129CentOSbiao
192.168.134.131CentOSbiao2
192.168.134.132CentOSbiao3

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

1.2 节点的映射关系

每个节点设置对应的ip和主机名的映射关系,以方便集群环境的部署

修改hosts配置文件中的信息

[root@biao ~]# vim /etc/hosts

在这里插入图片描述
配置好去测试ping每个节点是否成功
在这里插入图片描述

1.3 配置免密登录

在这里插入图片描述

生成公钥和私钥

[root@biao /]# ssh-keygen

在这里插入图片描述
发送公钥和私钥给免密登录的节点

[root@biao /]# ssh-copy-id biao1
[root@biao /]# ssh-copy-id biao2
[root@biao /]# ssh-copy-id biao3

在这里插入图片描述
节点与节点发送文件通过scp命令实现

[root@biao /]# scp -r a.txt biao2:/root/

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

1.4 关闭防火墙

查看防火墙状态

firewall-cmd --state

停止防火墙

systemctl stop firewall.server

禁止开机启动

systemctl disable firewall.service

2.Zookeeper集群环境搭建步骤

2.1 获取安装文件

下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/
注意: apache-zookeeper-3.5.9-bin.tar.gz和apache-zookeeper-3.5.9.tar.gz的区别是-bin是编译后的文件。
在这里插入图片描述
复制链接地址
在这里插入图片描述
利用wget下载安装
安装wget

[root@biao opt]# yum -y install wget

在这里插入图片描述
下载安装包在opt文件夹

[root@biao opt]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz

在这里插入图片描述
我们这里使用的是-bin的
解压缩文件

[root@biao opt]# tar -zxvf apache-zookeeper-3.5.9-bin.tar.gz 

这边因为方便所以改一下名字

[root@biao opt]# mv apache-zookeeper-3.5.9-bin zookeeper

在这里插入图片描述

2.2 修改配置

进入zookeeper

[root@biao opt]# cd zookeeper/

在这里插入图片描述
进入conf
在这里插入图片描述

修改zoo.conf文件,系统默认名称是zoo_smple.conf,我们需要改为zoo.conf

[root@biao conf]# mv zoo_sample.cfg zoo.cfg

在这里插入图片描述

修改zoo.cfg

[root@biao conf]# vim zoo.cfg 

修改两处:一处是Zookeeper中存储数据的文件夹,还有就是Zookeeper集群环境节点信息。

dataDir=/opt/zookeeper/data

server.1=biao1:2888:3888
server.2=biao2:2888:3888
server.3=biao3:2888:3888

在这里插入图片描述
配置myid文件
我们需要在Zookeeper的数据存储的目录中创建一个myid文件,文件中只有一行信息,即表示我们集群节点的标识,范围是1-255,每个节点的myid的数字和我们在zoo.conf中配置的server.数字是对应的。

[root@biao zookeeper]# mkdir data
[root@biao zookeeper]# cd data/
[root@biao data]# vim myid

在这里插入图片描述

2.3 分发文件

当我们配置好一个Zookeeper节点后,我们可以将Zookeeper文件夹分发给其他几个节点

[root@biao opt]# scp -r zookeeper biao2:`pwd`
[root@biao opt]# scp -r zookeeper biao3:`pwd`

在这里插入图片描述
在这里插入图片描述
分发成功之后我们需要修改各个节点的myid的信息为配置文件中的对应的数字
在这里插入图片描述
在这里插入图片描述

2.4 启动测试

整个集群环境都配置好之后我们就可以测试启动了

启动的命令

[root@biao zookeeper]# ./bin/zkServer.sh start

查看状态的命令

[root@biao zookeeper]# ./bin/zkServer.sh status

当我们仅仅启动一个节点的时候,因为半数存活机制,3个节点只启动一个节点是没有效果的
在这里插入图片描述
但是当我们启动第二个节点后就可以发现集群环境可以使用了
在这里插入图片描述
这时候回去看第一个节点的状态就出现了变化
在这里插入图片描述
第三个节点启动
在这里插入图片描述

三、Zookeeper的选举机制

在上面的例子中,难免会好奇到为什么节点1是先开启的,再开启节点2的,但是为什么节点2是Leader,而节点1却是Follower呢?这其中就涉及到了Zookeeper的选举机制了

1.为什么要进行Leader的选举呢?

Leader的主要作用:保证分布式数据一致性,即每个节点的存储的数据同步。
在这里插入图片描述

2.哪个情况下需要进行Zookeeper的Leader选举

  • 服务器初始化启动
  • 服务器运行期间无法和Leader保持连接,Leader节点崩溃,逻辑时钟崩溃。

3.服务器初始化时的Leader选举

Zookeeper由于自身的半性质,一般建议选取奇数个节点进行搭建分布式服务器集群。

这里主要以3个节点组成的服务器集群为例,去说明服务器初始化时的选举过程。当启动第一个Zookeeper的节点时,无法单独进行选举,当启动第二台时,两个节点之间进行通信,并开始选举Leader。

  1. 每个Server都投出一票。两个Server节点这时候都选自己为Leader,投票的内容为(SID,ZXID)。
    SID:Server的id,就是安装Zookeeper的时候配置文件中所配置的myid;
    ZXID:事务id,为节点的更新程度,ZXID越大,则代表Server对Znode的操作越新。

    由于服务器初始化,每个Server上Znode为0,所以Server1为自己投的票为(1,0),Server2为自己投的票为(2,0)
    在这里插入图片描述
  2. 每个Server接受来自其他Server的投票。集群中每个Server先判断投票的有效性,如检查是不是本轮的投票,是不是来Looking状态的服务器投的票
    在这里插入图片描述
  3. 对投票结果进行处理。

处理规则:

  • 首先比较ZXID,ZXID大的服务器优先作为Leader
  • 若ZXID相同,比如初始化的时候,每个Server的ZXID都为0。这种情况下,就比较myid,myid大的选出来做Leader

所以对于Server1而言,他接受的投票为(2,0),自身的投票为(1,0),ZXID是相等的,就比较myid,所以此时他会选举Server2作为Leader,将自己的投票更新为(2,0)。而Server2接收到的投票是Server1的(1,0),Server2自己为(2,0),比较之后自己的投票没有变化。Server1和Server2这时候将自己的投票再次投出,投出的票都为(2,0)。
在这里插入图片描述

  1. 统计投票。每次投票之后,服务器都会统计投票信息,如果判定某个Server有过半的票数投他,那么该Server将会作为Leader。
    对于Server1和Server2而言,统计出已经有两台机器接受了(2,0)的投票信息,所以此时选举Server2为Leader。
  2. 改变服务器状态。当确定了Leader之后,每个Server更新自己的状态,Leader将状态更新为Leading,Follower将状态更新为Following

4.服务器运行期间的Leader选举

Zookeeper运行期间,如果有新的Server加入,或者非Leader的Server宕机,那么Leader将会同步数据到新的Server或者去寻找其他备用Server代替宕机的Server。若Leader宕机,此时集群暂停对外服务,开始在内部选举新的Leader,由于意外情况,Server2宕机了,便开始进入选举状态

过程:

  1. 变更状态。其他的非Observe服务器将自己的状态改变为Looking,开始进入Leader选举
  2. 每个Server发出一个投票(myid,ZXID),由于此集群已经运行过,所以每个Server上的ZXID可能不同。
  3. 每个Server接受来自其他Server的投票,接下来的步骤与初始化相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值