【企业级分布式系统】ZooKeeper集群

文章目录

  • [Zookeeper 概述](#Zookeeper 概述)
    • [Zookeeper 定义](#Zookeeper 定义)
    • [Zookeeper 工作机制](#Zookeeper 工作机制)
      • [Zookeeper 特点](#Zookeeper 特点)
      • [Zookeeper 数据结构](#Zookeeper 数据结构)
      • [Zookeeper 选举机制](#Zookeeper 选举机制)
  • [部署 Zookeeper 集群](#部署 Zookeeper 集群)
    • [准备 3 台服务器作为 Zookeeper 集群节点](#准备 3 台服务器作为 Zookeeper 集群节点)

Zookeeper 概述

Zookeeper 定义

ZooKeeper是一个开源的分布式协调服务,它为分布式应用提供一致性服务。ZooKeeper通过提供高效且可靠的数据存储、数据同步以及集群管理等功能,帮助开发者构建高可用的分布式系统。在分布式环境中,ZooKeeper常用于解决分布式数据一致性、分布式锁、命名服务、配置管理等问题。

Zookeeper 工作机制

从设计模式的角度来看,ZooKeeper基于观察者模式设计。它维护一个共享的、树状的数据结构,并允许客户端注册为某个数据节点的观察者。当这些数据节点的状态发生变化时,ZooKeeper会通知所有注册的观察者,使得它们能够做出相应的反应。这种机制使得ZooKeeper在分布式系统中能够高效地协调不同节点之间的通信和协作。

Zookeeper 特点

  1. 集群架构:ZooKeeper集群由一个领导者(Leader)和多个跟随者(Follower)组成。这种架构确保了系统的高可用性和容错性。
  2. 高可用性:只要ZooKeeper集群中有一半以上的节点存活,集群就能正常提供服务。因此,为了最大化系统的可用性,通常建议安装奇数台服务器来构建ZooKeeper集群。
  3. 全局数据一致:ZooKeeper集群中的每个节点都保存一份相同的数据副本,确保了数据的全局一致性。
  4. 顺序一致性:ZooKeeper保证来自同一个客户端的更新请求会按照其发送顺序依次执行。
  5. 数据更新原子性:ZooKeeper保证每次数据更新操作要么成功,要么失败,不会出现部分更新的情况。
  6. 实时性:ZooKeeper能够在一定时间内保证客户端能够读取到最新的数据。

Zookeeper 数据结构

ZooKeeper的数据模型类似于Linux文件系统,整体上可以看作是一棵树,每个节点称为ZNode。每个ZNode默认能够存储1MB的数据,并通过其路径唯一标识。ZNode可以分为持久节点和临时节点两种类型,分别用于存储持久数据和临时数据。

Zookeeper 选举机制

第一次启动选举机制

  1. 当第一台服务器启动时,它会发起一次选举并投自己一票。由于票数不足半数,选举无法完成,服务器状态保持为LOOKING。
  2. 当第二台服务器启动时,它会再次发起选举并与第一台服务器交换选票信息。根据选票规则(如服务器ID较大的获胜),第二台服务器可能会成为领导者或继续保持LOOKING状态。
  3. 当第三台服务器启动时,它会继续发起选举并与前两台服务器交换选票信息。最终,根据选票规则,一台服务器会成为领导者,其他服务器成为跟随者。

非第一次启动选举机制

  1. 当ZooKeeper集群中的一台服务器出现初始化启动或无法与领导者保持连接时,它会开始进入Leader选举流程。
  2. 如果集群中已经存在一个领导者,则新加入的服务器会尝试与领导者建立连接并进行状态同步。
  3. 如果集群中不存在领导者,则所有参与选举的服务器会根据EPOCH(每个领导者任期的代号)、ZXID(事务ID)和服务器ID等规则进行投票选举。最终,一台服务器会成为新的领导者。

选举Leader规则

  1. EPOCH大的直接胜出:EPOCH表示每个领导者任期的代号,EPOCH值较大的服务器具有更高的优先级。
  2. EPOCH相同,事务ID大的胜出:如果EPOCH相同,则比较事务ID(ZXID),事务ID较大的服务器具有更高的优先级。
  3. 事务ID相同,服务器ID大的胜出:如果事务ID也相同,则比较服务器ID(SID),服务器ID较大的服务器具有更高的优先级。

SID :服务器ID。用来唯一标识一台ZooKeeper集群中的机器,每台机器不能重复,和myid一致。
ZXID :事务ID。ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的ZXID值不一定完全一致,这和ZooKeeper服务器对于客户端"更新请求"的处理逻辑速度有关。
Epoch:每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加

部署 Zookeeper 集群

准备 3 台服务器作为 Zookeeper 集群节点

  • 192.168.80.10
  • 192.168.80.11
  • 192.168.80.12

1. 安装前准备

关闭防火墙
bash 复制代码
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
安装 JDK
bash 复制代码
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
java -version
下载安装包

官方下载地址:https://archive.apache.org/dist/zookeeper/

bash 复制代码
cd /opt
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz

2. 安装 Zookeeper

bash 复制代码
cd /opt
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz
mv apache-zookeeper-3.5.7-bin /usr/local/zookeeper-3.5.7
修改配置文件
bash 复制代码
cd /usr/local/zookeeper-3.5.7/conf/
cp zoo_sample.cfg zoo.cfg

编辑 zoo.cfg 文件:

bash 复制代码
vim zoo.cfg

配置项说明:

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

添加集群信息:

ini 复制代码
server.1=192.168.80.10:3188:3288
server.2=192.168.80.11:3188:3288
server.3=192.168.80.12:3188:3288

集群配置项说明:

  • server.A=B:C:D
    • A 是一个数字,表示这个是第几号服务器。集群模式下需要在 zoo.cfgdataDir 指定的目录下创建一个文件 myid,这个文件里面有一个数据就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是哪个 server。
    • B 是这个服务器的地址。
    • C 是这个服务器 Follower 与集群中的 Leader 服务器交换信息的端口。
    • D 是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
拷贝配置好的 Zookeeper 配置文件到其他机器上
bash 复制代码
scp /usr/local/zookeeper-3.5.7/conf/zoo.cfg 192.168.80.11:/usr/local/zookeeper-3.5.7/conf/
scp /usr/local/zookeeper-3.5.7/conf/zoo.cfg 192.168.80.12:/usr/local/zookeeper-3.5.7/conf/
在每个节点上创建数据目录和日志目录
bash 复制代码
mkdir /usr/local/zookeeper-3.5.7/data
mkdir /usr/local/zookeeper-3.5.7/logs
在每个节点的 dataDir 指定的目录下创建一个 myid 的文件
bash 复制代码
echo 1 > /usr/local/zookeeper-3.5.7/data/myid
echo 2 > /usr/local/zookeeper-3.5.7/data/myid
echo 3 > /usr/local/zookeeper-3.5.7/data/myid
配置 Zookeeper 启动脚本
bash 复制代码
vim /etc/init.d/zookeeper

脚本内容:

bash 复制代码
#!/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
设置开机自启
bash 复制代码
chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper
分别启动 Zookeeper
bash 复制代码
service zookeeper start
查看当前状态
bash 复制代码
service zookeeper status
相关推荐
翰林小院44 分钟前
【RabbitMQ】 RabbitMQ Overview
分布式·rabbitmq
xujiangyan_1 小时前
Redis详解
数据库·redis·缓存
蓁蓁啊2 小时前
GIT使用SSH 多账户配置
运维·git·ssh
Y编程小白4 小时前
PostgreSQL在Linux中的部署和安装教程
数据库·postgresql
程序猿小三4 小时前
Linux下基于关键词文件搜索
linux·运维·服务器
虚拟指尖5 小时前
Ubuntu编译安装COLMAP【实测编译成功】
linux·运维·ubuntu
椎4956 小时前
苍穹外卖前端nginx错误之一解决
运维·前端·nginx
刘某的Cloud6 小时前
parted磁盘管理
linux·运维·系统·parted
TiAmo zhang6 小时前
SQL Server 2019实验 │ 数据库和表的创建、修改与删除
数据库·oracle
啊?啊?6 小时前
4 解锁 Linux 操作新姿势:man、grep、tar ,创建用户及添加权限等 10 大实用命令详解
linux·服务器·实用指令