zookeeper

ops/2024/9/24 8:35:07/

目录

zookeeper%E6%A6%82%E8%BF%B0-toc" style="margin-left:80px;">zookeeper概述

zookeeper%E5%B7%A5%E4%BD%9C%E6%9C%BA%E5%88%B6-toc" style="margin-left:80px;">zookeeper工作机制

1. 数据模型

2. 会话管理

3. Watcher 机制

4. Leader 选举

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

6. 读写请求处理

zookeeper%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF-toc" style="margin-left:80px;">zookeeper应用场景

统一命名服务

统一配置管理

统一集群管理

服务器动态上下线

软负载均衡

zookeeper%E9%80%89%E4%B8%BE%E6%9C%BA%E5%88%B6-toc" style="margin-left:80px;">zookeeper选举机制

第一次启动选举机制

非第一次启动选举机制

zookeeper%E9%83%A8%E7%BD%B2-toc" style="margin-left:80px;">zookeeper部署


zookeeper%E6%A6%82%E8%BF%B0">zookeeper概述

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

zookeeper%E5%B7%A5%E4%BD%9C%E6%9C%BA%E5%88%B6">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%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF">zookeeper应用场景

统一命名服务

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

统一配置管理

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

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

统一集群管理

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

服务器动态上下线

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

软负载均衡

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

zookeeper%E9%80%89%E4%B8%BE%E6%9C%BA%E5%88%B6" style="background-color:transparent;">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%E9%83%A8%E7%BD%B2">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


http://www.ppmy.cn/ops/115206.html

相关文章

vim 操作一列数字

一列数字从 9 到 23,想要将它们都减去 9 使用宏: a. 将光标移动到第一个数字 b. 按 qa 开始录制宏 c. 按 9 然后按 Ctrl-X (这会减去 9) d. 按 j 移动到下一行 e. 按 q 停止录制 f. 使用 a 重复宏,或 100a 重复多次 …

C++Thread封装

实现一个C的对pthread的封装基类,来实现对线程的启动,分离,等待结束以及取消操作,可以在派生类中定义run函数来实现线程的具体操作 定义头文件 // // Created by crab on 2024/9/24. //#ifndef THREAD_H #define THREAD_H#inclu…

基于飞腾平台的OpenCV的编译与安装

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适…

腾讯云点播及声音上传

文章目录 1、开通腾讯云点播2、获取腾讯云API密钥3、完成声音上传3.1、引入依赖3.2、参考:接入点地域3.3、参考:任务流设置3.4、首先修改配置:3.4.1、 3.5、TrackInfoApiController --》 uploadTrack()3.6、VodServiceImpl --》 uploadTrack(…

Vue3快熟

Vue3快速上手 1. Vue3简介1.1. 【性能的提升】1.2.【 源码的升级】1.3. 【拥抱TypeScript】1.4. 【新的特性】 2. 创建Vue3工程2.1. 【基于 vue-cli 创建】2.2. 【基于 vite 创建】(推荐)2.3. 【一个简单的效果】 3. Vue3核心语法3.1. 【OptionsAPI 与 CompositionAPI】Options…

Python爬虫之requests模块(一)

Python爬虫之requests模块(一) 学完urllib之后对爬虫应该有一定的了解了,随后就来学习鼎鼎有名的requests模块吧。 一、requests简介。 1、什么是request模块? requests其实就是py原生的一个基于网络请求的模块,模拟…

HTML元素居中

⾏内元素⽔平垂直居中 设置⽗级标签。 ⽔平居中&#xff1a; text-align: center 垂直居中&#xff1a; line-height&#xff1a;盒⼦⾼度 ⽔平垂直都居中 <!DOCTYPE html> <html> <head><style>.container {position: relative;width: 200px;height: …

锁策略, cas 和 synchronized 优化过程

1.1 常見的鎖策略 預測鎖衝突概率 樂觀鎖&#xff1a;加鎖的時候&#xff0c;假設出現鎖衝突的概率不大。圍繞加鎖做的工作會更少。 悲觀鎖&#xff1a;加鎖的時候&#xff0c;假設鎖出現衝突的概率很大。圍繞加鎖做的工作會更多。 synchronized “自適應” 初始是樂觀的。鎖…