【ELFK】之zookeeper

目录

一、ZooKeeper

1、介绍 Zookeeper

2、Zookeeper服务集群的条件

3、Zookeeper工作机制

4、Zookeeper数据结构

5、Zookeper特点 

6、Zookeeper选举机制

6.1 第一次启动选举机制

6.2 非第一次启动选举机制

6.3 总结

7、Zookeeper应用场景 

二、Zookeeper集群部署

1、环境部署

1.1 环境架构

2、在节点1安装Zookeeper服务

2.1 安装环境,解压软件

2.2 修改Zookeeper配置配置文件

2.3 设置myid号以及启动脚本


一、ZooKeeper

1、介绍 Zookeeper

ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务。分布式应用可以基于它实现更高级的服务,实现诸如同步服务、配置维护和集群管理或者命名的服务。

2、Zookeeper服务集群的条件

  • Zookeeper服务自身组成集群,2n+1个(奇数)主机。
  • 在集群中,允许n个主机宕机,只要集群中有一半以上的机器可用,zookeeper集群就可用。

#比如:
1、假如zookeeper为3台机器组成的集群,那么就可以允许失效一台,如果失效了2台,就会导致zookeeper集群不可用。
2、所以在搭建zookeeper集群时,主机数需要为奇数。
3、奇数的目的:为了提高容错能允许多损失一台。

3、Zookeeper工作机制

Zookeeper从设计模式角度来理解

是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已在Zookeeper上注册的那些观察者做出相应的反应。
也就是说Zookeeper=文件系统+通知机制。

文件系统: 就是将存储的数据通过zookeeper的文件系统进行存储到各个节点上。
通知机制: 当某个节点出现故障,zookeeper会将信息通知到客户端上。
总结:每个节点服务器都会在zookeeper中进行注册登记,client也获取当前在线服务器的列表,也会在zookeeper上进行注册登记,client在zookeeper集群上存储的数据。都会通过文件系统分布式存储到各个集群节点中,当集群中某个节点出现故障,zookeeper也会通知到client客户端。
【ELFK】之zookeeper_第1张图片

4、Zookeeper数据结构

Zookeeper数据模型的结构与linux文件系统很类似,整体上可以看作时一棵树,每个节点乘坐一个Znode。

每个znode默认能存储1mb的数据,每个znode都可以通过其路径唯一标识。

【ELFK】之zookeeper_第2张图片

5、Zookeper特点 

【ELFK】之zookeeper_第3张图片

Zookeeper: 一个领导者(Leader),多个跟随者(Follower)组成的集群
Zookeeper集群中只有半数以上节点存储,Zookeeper集群就能正常服务,所以Zookeeper适合安装奇数台服务器。
全局数据一致性: 每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的。
更新请求顺序执行: 来自同一个client的更新请求按其发送顺序依次执行,即先进先出。
数据更新原子性: 一次数据更新,要么成功,要么失败。
实时性: 在一定范围内,client能读到最新数据

总结:zookeeper集群中有一个lleader和多个follower,且zookeeper集群具有数据的一致性、原子性、实时性。且数据更新时按照发送顺序进行更新。

6、Zookeeper选举机制

6.1 第一次启动选举机制

【ELFK】之zookeeper_第4张图片

1、服务器1启动,发起一次选举。服务器1投自己一票。

此时服务器1的票数为1票,不够半数以上(5台节点,半数2.5),选举无法完成,服务器1状态保持为LOOKING.
2、服务器2启动,再发起一次选举,服务器1和2分别投自己1票,并交换选票信息。

此时服务器1发现服务器2的myid比自己投票的服务器myid要大,所以将票投给服务器2.
此时服务器1有0票,服务器2有2票,不够半数,选举无法完成,服务器1和2都保持looking状态。
3、服务器3启动,发起一次选举。

服务器1和2发现服务器3的myid最大,就将选票信息投给服务器3.
此时服务器1和2都有0票。服务器3有3票,超过半数,服务器3称为leader,服务器1和2更换状态为following。
4、服务器4启动,发起一次选举,此时服务器1,2,3已不是looking状态,不会更改选票信息。

此时服务器3为3票,服务器4为1票,此时服务器服从多数,更改修选票信息为服务器3,并更改状态为following。
5、服务器5启动,情况和4一样,状态为following。

6.2 非第一次启动选举机制

【ELFK】之zookeeper_第5张图片

1、当zookeerper集群中一台服务器出现一下两种请款之一时,就会开始进行leader选举

服务器初始化启动(第一次启动选举机制)
服务器运行期间无法和leader保持连接(不知道leader是否已经产生了,或者leader宕机)

2、当一台机器进入leader选举流程时,当前集群也可能处于一下两种状态。

①集群中本来就已经存储一个leader

对于已存在leader的情况,机器试图去选举时,被会告知当前服务器的leader信息,对于该机器来说,仅仅需要和leader机器建立连接,并进行状态同步即可。
②集群中leader宕机了。

假设zookeeper由5台服务器组成,SID分别为1,2,3,4,5。ZXID分别为:8,8,8,7.并且此时SID为3的服务器时leader。
某一时刻,当3和5都出现故障时,因此又重新开始选举。

#选举leader的规则
1、EPOCH大的直接胜出。
2、EPOCH相同,事务ID(ZXID)大的胜出.
3、ZXID相同,服务器ID大的胜出

----------------名词解释-----------------------
#1、SID:
服务器ID,用来标识一台Zookeeper集群中的机器,每台机器不能重复,和myid一致。

#2、ZXID
事务ID,ZXID是一个事务ID,用来标识一次服务器状态的变更,在某一时刻,集群中的每台机器的ZXID值不一定完全一致,这和Zookeeper服务器对于客户端“更新请求”的处理逻辑速度有关。

#2、Epoch
每个leader任期的代号,没有leader时选举方式跟第一次启动方法相同,每投完一次一票,这个数据就会增加。

6.3 总结

第一次启动选举机制

主要需要看启动顺序,再看他的myid,只要选举票数超过半数,就会选举出一个leader。新加的机器都会指向这个leader。
非第一次启动选举机制

假如存在leader,新加入的机器会获取到leader的信息,然后进行连接。
假如没有leader,会先比较Epoch(任期数),再比较ZXID(事务ID),再比较SID(服务id)。

7、Zookeeper应用场景 

提供的服务包括:统一命令服务,统一配置管理,统一集群管理,服务节点动态上下线,软负载均衡等,

①统一命令服务

在分布式环境下,经常需要对应用/服务进行统一命令,便于识别,例如:IP容易记住,而域名容易记住。
②统一配置管理

分布式环境下,配置文件同步非常常见,一般要求一个集群中,所有节点的配置信息是一致的,比如kafka集群,对配置文件修改后,希望能快速同步到各个节点上。
配置管理可交由Zookeeper实现,可将配置信息写入Zookeeper上的zonde,各个客户端服务器监听这个znode,一旦znode中的数据被修改,zookeeper将通知各个客户端服务器。
③统一集群管理

分布式环境中,时实掌握每个节点的状态是必要的,可根据节点时实状态制作出一些调整,
zookeeper可以实现时实监控节点状态变化,可将节点信息写入zookeeper上的Znode。监听这个Znode可以获取它的时实状态变化。
④服务动态上下线

客户端能时实洞察到服务器上下线的变化。(是否宕机)
⑤软负载均衡

在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。

二、Zookeeper集群部署

1、环境部署

1.1 环境架构

主机名            ip地址  安装软件 系统版本
node1      192.168.100.20 apache-zookeeper-3.5.7-bin.tar.gz     centos7
node2  192.168.100.30 apache-zookeeper-3.5.7-bin.tar.gz     centos7
node3 192.168.100.40 apache-zookeeper-3.5.7-bin.tar.gz     centos7

systemctl stop firewalld

systemctl disable firewalld

setenforce 0

关闭防火墙

2、在节点1安装Zookeeper服务

因为三台主机都要安装,这边只演示一台的安装方法,以node1为例。

2.1 安装环境,解压软件

yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel  #安装JDK环境
#这里yum安装JDK环境。方便。

java -version  查看java版本

#获取软件包
cd /opt
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz

#或者直接将软件包上传到/opt目录下。

tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz
mv apache-zookeeper-3.5.7-bin /usr/local/zookeeper-3.5.7 #将解压的目录剪切到/usr/local/

2.2 修改Zookeeper配置配置文件

cd /usr/local/zookeeper-3.5.7/conf    #进入zookeeper配置文件汇总

ls 后可以看到zoo_sample.cfg模板配置文件

cp zoo_sample.cfg zoo.cfg 复制模板配置文件为zoo.cfg

vim zoo.cfg
tickTime=2000     
#通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒
initLimit=10      
#Leader和Follower初始连接时能容忍的最多心跳数( tickTime的数量),这里表示为10*2s 
syncLimit=5     
#Leader和Follower之间同步通信的超时时间,这里表示如果超过5*2s,Leader认为Follwer死掉,并从服务器列表中删除Follwer
dataDir=/usr/local/zookeeper-3.5.7/data       
#●修改,指定保存Zookeeper中的数据的目录,目录需要单独创建
dataLogDir=/usr/local/zookeeper-3.5.7/1ogs    
#●添加,指定存放日志的目录,目录需要单独创建
clientPort=2181      #客户端连接端口

#添加集群信息
server.1=192.168.100.20:3188:3288
server.2=192.168.100.30:3188:3288
server.3=192.168.100.40:3188:3288

创建数据目录和日志目录

mkdir /usr/local/zookeeper-3.5.7/data
mkdir /usr/local/zookeeper-3.5.7/logs

ls /usr/local/zookeeper-3.5.7/ 查看是否创建

2.3 设置myid号以及启动脚本

到这里就不要设置同步了,下面的操作,做好一台机器一台机器的配置。

echo 1 >/usr/local/zookeeper-3.5.7/data/myid
# node1上配置

echo 2 >/usr/local/zookeeper-3.5.7/data/myid
#node2上配置

echo 3 >/usr/local/zookeeper-3.5.7/data/myid
#node3上配置

3台节点需要执行的脚本

#//配置启动脚本,脚本在开启启动执行的目录中创建
vim /etc/init.d/zookeeper
#!/bin/bash
#chkconfig:2345 20 90
#description:Zookeeper Service Control Script
ZK_HOME='/usr/local/zookeeper-3.5.7'
case $1 in
start)
    echo "----------zookeeper启动----------"
    $ZK_HOME/bin/zkServer.sh start
;;
stop)
    echo "---------- zookeeper停止-----------"
    $ZK_HOME/bin/zkServer.sh stop
;;
restart)
    echo "---------- zookeeper 重启------------"
    $ZK_HOME/bin/zkServer.sh restart
;;
status)
    echo "---------- zookeeper 状态------------"
    $ZK_HOME/bin/zkServer.sh status
;;
*)
    echo "Usage: $0 {start|stop|restart|status}"
esac

在节点1服务操作

chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper   #加入到系统管理

service zookeeper start  启动服务

service zookeeper status  查看状态后 是 follower
在节点2服务操作

chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper   #加入到系统管理

service zookeeper start  启动服务

service zookeeper status  查看状态后 是 leader     第二台启动的,他是leader

在节点3服务操作

chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper   #加入到系统管理

service zookeeper start  启动服务

service zookeeper status  查看状态后 是 follower

你可能感兴趣的:(zookeeper,分布式,云原生)