zookeeper

目录

zookeeper概述

zookeeper工作机制

[1. 数据模型](#1. 数据模型)

[2. 会话管理](#2. 会话管理)

[3. Watcher 机制](#3. Watcher 机制)

[4. Leader 选举](#4. Leader 选举)

[5. 一致性协议(ZAB 协议)](#5. 一致性协议(ZAB 协议))

[6. 读写请求处理](#6. 读写请求处理)

zookeeper应用场景

统一命名服务

统一配置管理

统一集群管理

服务器动态上下线

软负载均衡

zookeeper选举机制

第一次启动选举机制

非第一次启动选举机制

zookeeper部署


zookeeper概述

ZooKeeper 是一个开源的分布式协调服务,它为分布式应用提供了一种可靠的、高性能的协调机制,广泛应用于分布式系统中的配置管理、命名服务、分布式锁、分布式队列等场景。ZooKeeper 的设计目标是简化分布式系统的开发和维护,提高系统的可靠性和可扩展性。

zookeeper工作机制

1. 数据模型

ZooKeeper 的数据模型类似于文件系统,其中的每个节点称为 ZNode。ZNode 可以存储数据,也可以作为目录包含其他 ZNode。ZNode 分为两种类型:

持久节点:持久节点在创建后会一直存在,直到被显式删除。

临时节点:临时节点在创建它的客户端会话结束时自动删除。

此外,ZNode 还可以是顺序节点(Sequential Node),即每个创建的节点都会被自动分配一个唯一的递增数字。

2. 会话管理

客户端与 ZooKeeper 服务器之间的连接称为会话。会话具有超时时间,客户端需要定期发送心跳以保持会话有效。会话管理涉及以下几个方面:

会话创建:客户端通过连接到 ZooKeeper 服务器来创建会话。会话创建时,客户端会指定一个超时时间。

心跳机制:客户端需要定期发送心跳(ping)以保持会话有效。如果服务器在超时时间内没有收到客户端的心跳,会话将被视为失效。

会话恢复:如果客户端与服务器的连接中断,客户端可以尝试重新连接到其他服务器,并恢复之前的会话状态。

3. Watcher 机制

Watcher 是一种通知机制,客户端可以注册 Watcher 来监听 ZNode 的变化。当 ZNode 发生变化时,ZooKeeper 会通知注册了 Watcher 的客户端。Watcher 机制涉及以下几个方面:

Watcher 注册:客户端可以通过 API 注册 Watcher,指定要监听的 ZNode 和事件类型(如节点创建、节点删除、数据变化等)。

事件通知:当 ZNode 发生变化时,ZooKeeper 会向注册了 Watcher 的客户端发送通知。客户端收到通知后,可以执行相应的操作。

一次性触发:Watcher 是一次性触发的,即每次触发后,Watcher 会被自动删除。如果客户端希望继续监听,需要重新注册 Watcher。

4. Leader 选举

ZooKeeper 集群中的服务器分为 Leader 和 Follower 两种角色。Leader 负责处理所有写请求,Follower 负责处理读请求和参与 Leader 选举。Leader 选举机制涉及以下几个方面:

初始选举:当 ZooKeeper 集群启动时,所有服务器会参与 Leader 选举。通过 ZAB 协议,集群中的服务器会选举出一个 Leader。

Leader 失效:如果 Leader 失效,集群中的其他服务器会重新启动 Leader 选举过程,选举出新的 Leader。

数据同步:Leader 选举完成后,新的 Leader 会与 Follower 进行数据同步,确保所有服务器的数据一致性。

5. 一致性协议(ZAB 协议)

ZooKeeper 使用 ZAB(ZooKeeper Atomic Broadcast)协议来保证数据的一致性和可靠性。ZAB 协议是一种类 Paxos 的一致性协议,确保所有服务器的数据一致性。ZAB 协议涉及以下几个方面:

原子广播:Leader 通过原子广播机制将写请求广播给所有 Follower。Follower 接收到写请求后,会将其应用到本地数据。

事务提交:当 Leader 收到大多数 Follower 的确认后,会将事务提交,并通知所有 Follower 提交事务。

崩溃恢复:如果 Leader 崩溃,ZAB 协议会启动崩溃恢复过程,选举新的 Leader,并进行数据同步。

6. 读写请求处理

ZooKeeper 的读写请求处理机制如下:

读请求:读请求由任意一个 Follower 处理,Follower 直接从本地数据中读取数据并返回给客户端。

写请求:写请求由 Leader 处理。Leader 接收到写请求后,会将其广播给所有 Follower,并等待大多数 Follower 的确认。确认后,Leader 会将事务提交,并通知所有 Follower 提交事务。

zookeeper应用场景

统一命名服务

在分布式环境下,经常需要对应用/服务进行统一的命名,便于识别。就比如,我们平常访问网站时不会或者很少有人会去记网站的ip地址,一般都是记域名

统一配置管理

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

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

统一集群管理

分布式环境中,实时掌握每个节点的状态时必要的,zookeeper 可以实现实时监控节点状态变化,可将节点信息写入 zookeeper 上的一个 znode ,监听这个 znode 可获取它的实时状态变化

服务器动态上下线

客户端能实时洞察到服务器上下线的变化

软负载均衡

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

zookeeper选举机制

第一次启动选举机制

在zookeeper 工作机制中,有一个重要的步骤,那就是选举机制,上文只是一笔带过,没有具体讲服务器是如何进行选举的

因为要确保集群中的所有节点对外表现为一个统一的服务,所以zookeeper加入了选举机制,选举机制分为两个阶段:Leader 选举 和 投票确认

因为投票需半数以上的服务器同意,所以集群中起码有5台服务器,接下来从第一台第二台服务器逐步说明选举的完整过程

首先服务器1启动,发起一次选举,因为集群中暂时只有一台服务器开启,所以服务器1给自己投一票,此时只有一票,不够半数以上,无法完成选举,服务器状态保持为 LOOKING

服务器2启动,再发起一次选举,服务器1和服务器2分别投自己一票并且交换选票信息,此时服务器1发现服务器2的myid 比自己的大,所以更改选票为服务器2,此时服务器2 两票,依然没有过半数,服务器1 和 2都继续保持LOOKING状态。myid是集群中服务器的标识符,一般在1-255之间,集群内每个服务器myid 唯一。

服务器3启动,发起第三次选举,同样的操作,一开始是服务器2 两票,服务器3 一票,交换选票信息后,服务器3 myid 是最大的,所以所有服务器都将选票更改为服务器3,此时选票已经超过半数,服务器3的状态跟改为LEADING,服务器1和2更改为FOLLOWING

之后的每台服务器启动,因为1、2、3 都已经不是LOOKING状态了,不会更改选票,所以即使服务器4的myid更大,投了自己一票,也会是少数服从多数

如果有服务器5,那么它和服务器4一样,因为集群中3超过半数,那么集群中只可能有4台或者5台服务器

非第一次启动选举机制

当然,并不是所有机器都是初次启动,当服务器初始化启动或者服务器运行期间无法和Leader保持连接时,会进入Leader选举

检测 Leader 失效:Follower 服务器会定期向 Leader 发送心跳(ping)请求。如果 Follower 在超时时间内没有收到 Leader 的响应,会认为 Leader 失效。

启动选举 :当 Follower 检测到 Leader 失效后,会启动新的 Leader 选举过程。每个服务器会广播自己的 myid 和当前的投票信息。

投票过程 :每个服务器会根据收到的投票信息进行投票。通常,服务器会投票给 myid 值较大的服务器。如果多个服务器同时收到大多数投票,则 myid 值较大的服务器将成为 Leader。

选举结果:当某个服务器收到大多数服务器的投票时,它将成为新的 Leader。新的 Leader 会广播选举结果,并通知所有 Follower 服务器。

数据同步:新的 Leader 选举完成后,新的 Leader 会与 Follower 进行数据同步,确保所有服务器的数据一致性。

zookeeper部署

几台机器操作相同

关闭防火墙和增强

官网下载安装包或者压缩包,放到合适的目录下

tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz

mv apache-zookeeper-3.5.7-bin /usr/local/zookeeper-3.5.7

修改配置文件

cd /usr/local/zookeeper-3.5.7/conf/

cp zoo_sample.cfg zoo.cfg #备份

vim zoo.cfg

tickTime=2000 #Zookeeper服务器与客户端心跳时间,单位毫秒

initLimit=10 #Leader和Follower初始连接时能容忍的最多心跳数

syncLimit=5 #同步时,发送几次心跳无回应后认为leader下线

dataDir=/usr/local/zookeeper-3.5.7/data #指定zookeeper中数据的目录

dataLogDir=/usr/local/zookeeper-3.5.7/logs #指定存放日志的目录

clientPort=2181 客户端连接端口号

server.1=172.16.233.105:3188:3288

server.2=172.16.233.106:3188:3288

server.3=172.16.233.107:3188:3288

#server后面数字是几表示这个是第几号服务器。集群模式下需要在zoo.cfg中dataDir指定的目录下创建一个文件 myid,这个文件里面有一个数据就是server后面数字的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面 的配置信息比较从而判断到底是哪个server。

保存并退出

创建数据目录和日志目录

mkdir /usr/local/zookeeper-3.5.7/data

mkdir /usr/local/zookeeper-3.5.7/logs

echo 1 > /usr/local/zookeeper-3.5.7/data/myid #哪台机器就echo 几

配置zookeeper 启动脚本

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

相关推荐
求积分不加C1 小时前
-bash: ./kafka-topics.sh: No such file or directory--解决方案
分布式·kafka
nathan05291 小时前
javaer快速上手kafka
分布式·kafka
朝九晚五ฺ2 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream2 小时前
Linux的桌面
linux
xiaozhiwise3 小时前
Makefile 之 自动化变量
linux
谭震鸿4 小时前
Zookeeper集群搭建Centos环境下
分布式·zookeeper·centos
意疏5 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
BLEACH-heiqiyihu5 小时前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器
一只爱撸猫的程序猿5 小时前
一个简单的Linux 服务器性能优化案例
linux·mysql·nginx