文章目录
ZooKeeper
官方网站:https://zookeeper.apache.org/
官方文档:https://zookeeper.apache.org/doc/
zk的由来
ZooKeeper 是由 雅虎(Yahoo!)开发的,用来解决分布式系统中协调和管理的问题。它最早是雅虎为了支持其大规模分布式应用而开发的协调服务。
在分布式系统中,多个节点需要相互协调和通信以保持一致性,而直接实现这些协调任务是非常复杂和容易出错的。雅虎在开发其分布式应用时,发现每次要构建高效且可靠的分布式协调机制都非常困难,特别是在面对节点故障、网络分区等复杂的分布式问题时。因此,雅虎开发了 ZooKeeper 作为一个通用的协调服务,来为分布式系统中的任务提供高效、可靠的协调功能。
zk解决了什么问题
在分布式系统中,有许多常见的协调问题需要解决。ZooKeeper 的设计目标是通过提供一个简单的、高可用的、可扩展的分布式协调服务来解决这些问题。
1.分布式协调的复杂性
在分布式系统中,节点彼此独立运行,它们之间可能存在网络延迟、节点故障或网络分区等问题。要让这些节点协调一致地工作,尤其是保证数据一致性和协调复杂的工作流(如任务调度、分布式锁等),非常困难。ZooKeeper 提供了一套简单的 API,使开发人员无需关心分布式协调的底层复杂性,只需通过 ZooKeeper 的数据模型和 Watch 机制,就可以轻松实现协调功能。
2.一致性问题
分布式系统的一个关键问题是 一致性。当多个节点对同一个共享资源进行操作时,如何确保数据的一致性?例如,多个客户端可能同时读取和写入某个共享的数据,而如果没有有效的协调机制,可能会导致数据不一致。
ZooKeeper 通过其 原子性和顺序一致性 的特性,确保所有节点能够以相同的顺序看到相同的数据变化。它使用 Paxos 类的协议确保每个写操作都在大多数节点上达成共识,从而实现分布式数据的一致性。
3.分布式锁
在分布式系统中,多个客户端可能需要同时访问和修改共享资源,如何避免资源竞争并确保只有一个客户端能同时访问共享资源是一个挑战。ZooKeeper 通过 临时节点 和 有序节点 的机制,简化了分布式锁的实现,使得开发者可以很方便地实现分布式锁和领导者选举。
临时节点:
当客户端创建临时节点时,ZooKeeper 保证在客户端会话断开后自动删除节点。这有助于管理分布式系统中的锁和其他资源。
有序节点:
ZooKeeper 允许创建带有序号的节点,从而可以方便地实现如分布式队列、任务调度等应用场景。
4. Leader 选举
在分布式系统中,有时需要选出一个节点作为 Leader 来协调其他节点的工作,比如处理写请求或分配任务。ZooKeeper 提供了 Leader 选举机制,通过其一致性协议可以快速选出一个 Leader,并确保其他节点知道谁是当前的 Leader。
这一功能广泛应用于集群管理,例如 Hadoop、Kafka 等系统都使用 ZooKeeper 进行 Leader 选举。
5.分布式配置管理
分布式系统通常会有多个节点,这些节点可能需要共享某些配置信息。如果手动管理这些配置信息并在节点之间同步非常麻烦,ZooKeeper 提供了分布式配置管理的功能。
开发者可以将配置存储在 ZooKeeper 中,ZooKeeper 保证这些配置能实时同步到所有的客户端节点。通过 Watch 机制,客户端还能监听配置的变化,当配置更新时,ZooKeeper 会通知所有客户端进行调整。
6.分布式服务注册与发现
在分布式系统中,服务的节点数量通常是动态变化的,某些服务可能会随时加入或离开集群。为了实现 服务注册与发现,ZooKeeper 提供了一个集中的注册服务,服务节点可以将自己的信息注册到 ZooKeeper 中,客户端则可以从 ZooKeeper 上发现并获取这些服务节点的信息。
这为负载均衡、容错等机制提供了基础支持。例如,ZooKeeper 被广泛应用于 Apache Kafka、Dubbo、Hadoop 等框架中作为服务注册与发现的基础组件。
7.故障恢复与高可用性
在分布式系统中,节点故障是不可避免的。如果系统中没有合适的协调机制,故障会导致系统整体不可用。ZooKeeper 通过 复制机制 和 多数决原则,确保即使部分节点故障,集群也能正常运行。
复制机制:ZooKeeper 中的所有数据都被复制到集群中的多个节点上,这样即使某些节点发生故障,其他节点依然可以提供服务。
多数决原则:只要有超过半数的 ZooKeeper 节点正常工作,整个系统就能继续运行。这种机制保证了 ZooKeeper 集群的高可用性。
ZK工作原理
ZK数据模型
在zookeeper 中,节点分为两类
第一类是指构成zookeeper集群的主机,称之为主机节点
第二类则是指内存中zookeeper数据模型中的数据单元,用来存储各种数据内容,称之为数据节点ZNode.
zookeeper内部维护了一个层次关系(树状结构)的数据模型,它的表现形式类似于Linux的文件系统,甚至操作的种类都一致。
Zookeeper
数据模型中有自己的根目录(/),根目录下有多个子目录,
每个子目录后面有若干个文件,由斜杠(/)进行分割的路径,就是一个ZNode,
每个ZNode上都会保存自己的数据内容和一系列属性信息.
zk功能
1.命名服务
命名服务是分布式系统中比较常见的一类场景。命名服务是分布式系统最基本的公共服务之一。在分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等—―这些我们都可以统称它们为名字(Name),其中较为常见的就是一些分布式服务框架(如RPC、RMI)中的服务地址列表,通过使用命名服务,客户端应用能够根据指定名字来获取资源的实体、服务地址和提供者的信息等。
2.状态同步
每个节点除了存储数据内容和node节点状态信息之外,还存储了已经注册的APP的状态信息,当有些节点或APP不可用,就将当前状态同步给其他服务。
3.配置中心
现在我们大多数应用都是采用的是分布式开发的应用,搭建到不同的服务器上,我们的配置文件,同一个应用程序的配置文件一样,还有就是多个程序存在相同的配置,当我们配置文件中有个配置属性需要改变,需要改变每个程序的配置属性,这样会很麻烦的去修改配置,那么可用使用ZooKeeper来实现配置中心。
ZooKeeper 采用的是推拉相结合的方式:客户端向服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应的客户端发送Watcher事件通知,客户端接收到这个消息通知后,需要主动到服务端获取最新的数据。
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,此应用比较流行。
4.集群管理
所谓集群管理,包括集群监控与集群控制两大块,前者侧重对集群运行时状态的收集,后者则是对集群进行操作与控制,在日常开发和运维过程中,我们经常会有类似于如下的需求:
1.希望知道当前集群中究竟有多少机器在工作。
2.对集群中每台机器的运行时状态进行数据收集。对集群中机器进行上下线操作。
ZooKeeper 具有以下两大特性:
1.客户端如果对ZooKeeper的一个数据节点注册Wwatcher监听,那么当该数据节点的内容或是其子节点列表发生变更时,
Zookeeper服务器就会向已注册订阅的客户端发送变更通知。
2.对在ZooKeeper上创建的临时节点,一旦客户端与服务器之间的会话失效,那么该临时节点也就被自动清除。
Watcher(事件监听器)是Zookeeper中的一个很重要的特性。Zookeeper 允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到感兴趣的客户端上去,该机制是Zookeeper实现分布式协调服务的重要特性。
zk部署
单机
官方文档:https://zookeeper.apache.org/doc/r3.6.2/zookeeperStarted.html#sc_InstallingSingleMode
1.配置Java环境
官方依赖介绍:https://zookeeper.apache.org/doc/r3.8.0/zookeeperAdmin.html#sc_systemReq
2.包安装
[root@ubuntu2204 ~]#apt list zookeeper
正在列表...完成
zookeeper/jammy 3.4.13-6ubuntu4 all
[root@ubuntu2204 ~]#apt -y insta11 zookeeper
[root@ubuntu2204 ~]#grep -Ev "#|^$” /etc/zookeeper/conf/zoo.cfg
tickTime=2000 服务器与服务器之间的单次心跳检测时间间隔,单位为毫秒
initLimit=10 集群中leader服务器与fo1lower服务器初始连接心跳次数,即多少个2000毫秒
syncLimit=5 leader与fo11ower之间检测发送和应答的心跳次数,
如果该fo11ower在时间段5*200不能与leader进行通信,此follower将不可用
dataDir=/var/lib/zookeeper 自定义的zookeeper保存数据的目录
c1ientPort=2181 客户端连接zookeeper服务器的端口,zookeeper会监听这个端口,接受客户端的访问请求
[root@ubuntu2204 ~]#1s /usr/share/zookeeper/bin/
zkcleanup.sh zkc1i.sh zkEnv.sh zkserver.sh
[root@ubuntu2204 ~]#/usr/share/zookeeper/bin/zkServer.sh start
ZooKeeper JMx enab1ed by default
using config: /etc/zookeeper/conf/zoo.cfg
starting zookeeper ... STARTED
[root@ubuntu2204 ~]#/usr/share/zookeeper/bin/zkserver.sh status
ZooKeeper JMX enabled by default
using config: /etc/zookeeper/conf/zoo.cfg
Mode: standalone
单机安装脚本
install_zookeeper_single_node.sh
#!/bin/bash
#
#********************************************************************
#Author: wangxiaochun
#Date: 2020-06-20
#FileName: install_zookeeper.sh
#URL: http://www.wangxiaochun.com
#Description: The test script
#Copyright (C): 2022 All rights reserved
#********************************************************************
#支持在线和离线安装
ZK_VERSION=3.8.1
#ZK_VERSION=3.8.0
#ZK_VERSION=3.6.3