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

相关推荐
2035去旅行15 小时前
bootcmd 详细讲解
linux·嵌入式·arm·soc
陈希12316 小时前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
女神下凡17 小时前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
且从容.20 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道20 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
且从容.1 天前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落1 天前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨1 天前
WSL2的安装与使用
linux·wsl
微小的鱼1 天前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng1 天前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器