【ELFK】之zookeeper

一、Zookeeper是什么?

  • zooleeper是一个分布式服务管理框架。存储业务服务节点元数据及信息,并复制;通知客户端在zookeeper上注册的服务节点状态,通过文件系统+通知机制

1、Zookeeper工作机制

Zookeeper从设计模式角度来理解

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

Zookeeper=文件系统+通知机制

  • 文件系统: 就是将存储的数据通过zookeeper的文件系统进行存储到各个节点上。
  • 通知机制: 当某个节点出现故障,zookeeper会将信息通知到客户端上。

2、Zookeeper服务集群的条件

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

例:

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

总结:每个节点服务器都会在zookeeper中进行注册登记,client也获取当前在线服务器的列表,也会在zookeeper上进行注册登记,client在zookeeper集群上存储的数据。都会通过文件系统分布式存储到各个集群节点中,当集群中某个节点出现故障,zookeeper也会通知到client客户端。

3、Zookeper特点

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

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

4、Zookeeper数据结构

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

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

5、Zookeeper 选举机制

5.1 第一次启动选举机制

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

  • 此时服务器1的票数为1票,不够半数以上(3票),选举无法完成,服务器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。

5.2 非第一次启动选举机制

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都出现故障时,因此又重新开始选举。
cs 复制代码
#选举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时选举方式跟第一次启动方法相同,每投完一次一票,这个数据就会增加。

5.3 总结

第一次启动选举机制

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

非第一次启动选举机制

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

6、Zookeeper应用场景

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

①统一命令服务

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

②统一配置管理

分布式环境下,配置文件同步非常常见,一般要求一个集群中,所有节点的配置信息是一致的,比如kafka集群,对配置文件修改后,希望能快速同步到各个节点上。

配置管理可交由Zookeeper实现,可将配置信息写入Zookeeper上的zonde,各个客户端服务器监听这个znode,一旦znode中的数据被修改,zookeeper将通知各个客户端服务器。

③统一集群管理

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

④服务动态上下线

  • 客户端能时实洞察到服务器上下线的变化。(是否宕机)

⑤软负载均衡

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

二、Zookeper集群部署

1、环境部署

1.1 实验环境

主机名 ip地址 安装软件 系统版本
node1 192.168..247.21 apache-zookeeper-3.5.7-bin.tar.gz centos7.5
node2 192.168..247.22 apache-zookeeper-3.5.7-bin.tar.gz centos7.5
node2 192.168..247.23 apache-zookeeper-3.5.7-bin.tar.gz centos7.5

1.2 安装前环境

cs 复制代码
//关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

//安装 JDK
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
java -version

2.安装 Zookeeper

cs 复制代码
//下载安装包
官方下载地址:https://archive.apache.org/dist/zookeeper/

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

2.1 修改Zookeeper配置配置文件

cs 复制代码
cd /usr/local/zookeeper-3.5.7/conf
cp zoo_sample.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.247.21:3188:3288
server.2=192.168.247.22:3188:3288
server.3=192.168.247.23:3188:3288

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

2.2 设置myid号以及启动脚本

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

cs 复制代码
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上配置

#//配置启动脚本,脚本在开启启动执行的目录中创建
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

chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper

service zookeeper start

service zookeeper status

三台机器都需要执行脚本

启动node1机器(192.168.247.21)

启动node2机器(192.168.247.22)

启动node3机器(20.0.0.57)

相关推荐
AAA小肥杨3 小时前
基于k8s的Python的分布式深度学习训练平台搭建简单实践
人工智能·分布式·python·ai·kubernetes·gpu
爬山算法6 小时前
Redis(73)如何处理Redis分布式锁的死锁问题?
数据库·redis·分布式
祈祷苍天赐我java之术8 小时前
Redis 数据类型与使用场景
java·开发语言·前端·redis·分布式·spring·bootstrap
猫林老师10 小时前
HarmonyOS线程模型与性能优化实战
数据库·分布式·harmonyos
阿里云云原生11 小时前
AI 时代的数据通道:云消息队列 Kafka 的演进与实践
云原生·kafka
阿里云云原生12 小时前
单提交智能评审上线!用云效精准定位复杂 MR 代码问题
云原生
阿里云云原生12 小时前
再看 AI 网关:助力 AI 应用创新的关键基础设施
云原生
阿里云云原生12 小时前
零代码改造 + 全链路追踪!Spring AI 最新可观测性详细解读
spring·云原生
霖.2413 小时前
Docker常见问题
服务器·docker·云原生·容器
在未来等你14 小时前
Elasticsearch面试精讲 Day 26:集群部署与配置最佳实践
大数据·分布式·elasticsearch·搜索引擎·面试