ZooKeeper安装配置--集群模式

前言

ZooKeeper 是 Apache Hadoop 生态系统中的一个重要组件,最初是为分布式应用程序提供协调服务而设计的。它解决了分布式系统中的复杂性,提供了集中化的配置管理、分布式同步和分布式节点管理等功能。

ZooKeeper的主要特点

  • 分布式协调服务:ZooKeeper 提供了一种通用的协调服务,用于分布式系统中的各种应用场景,包括配置管理、领导选举、分布式锁和元数据管理等。
  • 高可用性和可靠性:ZooKeeper 通过多节点(Quorum)的方式提供高可用性。它采用了主-从架构,其中一个节点充当领导者 (Leader),其他节点为跟随者 (Follower)。只要超过半数的节点正常运行,ZooKeeper 集群就能继续提供服务。
  • 强一致性:ZooKeeper 保证了分布式系统中数据的强一致性。所有写操作都会在领导者节点上执行,然后同步到跟随者节点,确保所有客户端在读取时能看到相同的数据。
  • 简洁的 API:ZooKeeper 提供了简单的客户端 API,支持创建、读取、更新和删除 (CRUD) 操作,同时支持临时节点、顺序节点和监视机制 (Watcher) 等功能,帮助开发者实现复杂的分布式逻辑。

ZooKeeper的核心概念

节点(ZNode)

ZooKeeper 中的所有数据都存储在树形结构中的节点上,每个节点被称为 ZNode。ZNode 可以包含数据或子节点。每个 ZNode 的路径是唯一的,就像 Unix 文件系统中的路径一样,例如 /myapp/config

ZNode 有以下几种类型:

  • 持久节点:一旦创建,除非显式删除,否则持久存在。

  • 临时节点:客户端会话结束时临时节点会自动删除。

  • 顺序节点:创建时,ZooKeeper 会在节点名称后自动附加一个唯一的数字,用来标识顺序。

会话(Session)

ZooKeeper 使用会话机制来管理客户端与服务器的连接。每个客户端在连接时都会与服务器建立一个会话。会话有一个超时时间,超时后 ZooKeeper 将认为客户端断开连接,并删除与该客户端关联的临时节点。

Watcher机制

Watcher 是 ZooKeeper 提供的一种事件通知机制,允许客户端在特定的 ZNode 上注册监听器。当该节点发生变化时,ZooKeeper 会通知相应的客户端。Watcher 是一次性的,即当事件触发时,监听器会被触发,然后需要重新注册。

版本号

每个 ZNode 都有一个版本号,每次对 ZNode 的数据进行修改时,ZooKeeper 都会递增该版本号。通过版本号,ZooKeeper 可以实现乐观并发控制,避免多个客户端同时修改数据时产生冲突。

ZooKeeper 的架构

ZooKeeper 采用主从 (Leader-Follower) 架构,其中一个节点被选举为领导者,其他节点作为跟随者。所有写操作都在领导者节点上执行,并同步到跟随者。读取操作可以在任意节点上执行。ZooKeeper 通过一致性算法 Zab(类似于 Paxos)来保证数据的一致性。

  • Leader:负责处理所有的写请求,并同步数据到 Follower。
  • Follower:接收客户端的读取请求,并将写请求转发给 Leader 进行处理。
  • Observer:只用于接收数据的同步,而不参与投票,通常用于减少 Follower 的负载。

ZooKeeper 使用两个重要的时间参数来管理节点之间的通信和同步:

  • syncLimit:Follower 能够与 Leader 之间同步的最大延迟时间。
  • initLimit:Follower 在启动时与 Leader 同步状态的最大允许时间。

ZooKeeper 的典型应用场景

分布式锁

ZooKeeper 可以用来实现分布式锁。通过使用临时顺序节点,ZooKeeper 可以确保每个客户端在获取锁时,都有一个唯一的顺序号。客户端只需要检查当前序列号是否是最小的,最小的则获得锁。

领导者选举

ZooKeeper 常用于领导者选举。所有的客户端尝试创建一个相同的 ZNode,ZooKeeper 只允许一个客户端成功创建,其余的客户端将收到失败通知。第一个成功创建节点的客户端就成为领导者。

配置管理

ZooKeeper 可以用作分布式系统的配置管理中心。所有服务都可以将其配置保存在 ZooKeeper 中,并在需要时读取配置,甚至可以动态更新配置,而不需要重启服务。

命名服务

ZooKeeper 可用于实现分布式系统的命名服务,每个服务都可以注册一个 ZNode,其他服务可以通过 ZooKeeper 获取该服务的地址或其他元数据。

ZooKeeper的缺点和限制

  • 读写性能:ZooKeeper 主要为了保证一致性设计,写操作的性能比读操作慢,因为所有写操作都必须通过领导者节点,且同步到所有的跟随者节点。
  • 容量限制:ZooKeeper 的每个 ZNode 数据量不应超过 1MB,适合存储轻量级的配置信息和元数据,不适合存储大规模数据。
  • 延迟敏感:ZooKeeper 对网络延迟非常敏感,如果网络不稳定或延迟较高,可能会导致服务的性能下降。

ZooKeeper 的集群管理

ZooKeeper 的高可用性通过集群(Quorum)来实现,通常建议集群中的节点数量为奇数。ZooKeeper 使用过半原则(majority),即只要超过半数的节点正常运行,集群就能继续提供服务。这意味着在三节点的 ZooKeeper 集群中,只允许有一个节点故障;在五节点集群中,允许最多有两个节点故障。

ZooKeeper 安装配置流程

  • 单节点部署:适用于开发环境或轻量级应用场景。

  • 集群部署:在生产环境中使用 ZooKeeper 时,通常会部署一个 ZooKeeper 集群来提供高可用性。ZooKeeper 通过 zoo.cfg 文件进行配置,关键参数包括 dataDirclientPortserver.X 等。

ZooKeeper 的替代方案

  • etcd:一个分布式键值存储系统,广泛应用于 Kubernetes 集群的管理。
  • Consul:提供了分布式服务发现和配置管理功能。
  • Eureka:Netflix 开源的服务发现系统。

ZooKeeper 是一个用于分布式系统的强大协调服务,能够解决分布式系统中的许多关键问题,如一致性、领导选举、配置管理和分布式锁。尽管它有一些性能和容量限制,但在需要分布式协调的场景中,ZooKeeper 是一种可靠且成熟的解决方案。

ZooKeeper下载

官方网站:https://zookeeper.apache.org/releases.html#download

这里我使用的版本是zookeeper-3.4.8.tar.gz

本文将安装的ZooKeeper采用的是集群模式

准备工作

Java 环境

ZooKeeper 是用 Java 开发的,因此需要安装 Java 运行时环境(JRE)或 Java 开发工具包(JDK)。

节点介绍

在每个服务器节点上都需要安装 ZooKeeper 3.4.8。假设我们有三台服务器

master172.16.250.205
slave1172.16.250.206
slave2172.16.250.207

安装与配置

上传ZooKeeper

这里的上传路径为/root下

上传方式可通过本地拖拽文件上传,也可通过连接xftp来拖拽至xshell命令行里实现

解压ZooKeeper

解压至/root/software目录下

tar -zxvf zookeeper-3.4.8.tar.gz -C software/

重命名(可选)

mv zookeeper-3.4.8/ zookeeper

添加至环境变量

vim /etc/profile

添加以下参数

export ZOOKEEPER_HOME=/root/software/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

wq保存退出

刷新变量

source /etc/profile

配置zoo.cfg文件

首先在zookeeper目录下创建data目录

用于数据存储路径

mkdir data

以及日志存储路径(可选)

mkdir logs

进入conf/目录下

将zoo_sample.cfg拷贝一份并重命名为zoo.cfg

使用vim编辑器打开

vim zoo.cfg

修改zoo.cfg文件为以下内容:

# 数据存储路径
dataDir=/root/software/zookeeper/data
# 日志存储路径(可选)
dataLogDir=/root/software/zookeeper/logs
# 客户端连接的端口
clientPort=2181
# 发送初始消息的超时时间
initLimit=5
# 心跳间隔
syncLimit=2

# 集群中的服务器配置
server.1=192.168.1.101:2888:3888
server.2=192.168.1.102:2888:3888
server.3=192.168.1.103:2888:3888

配置完成,wq保存并退出

使用scp命令同步

将master上的zookeeper安装目录同步和环境变量同步至slave1、slave2上

scp -r zookeeper/ slave1:/root/software
scp -r zookeeper/ slave2:/root/software
scp -r /etc/profile slave1:/etc/profile
scp -r /etc/profile slave2:/etc/profile

为每个节点设置、创建myid文件

每个 ZooKeeper 节点需要一个 myid 文件,该文件位于 dataDir 目录中,用来唯一标识集群中的每个节点。在每个节点上,执行以下步骤来创建 myid 文件。

在master上

echo "1" > /root/software/zookeeper/data/myid

在slave1上

echo "2" > /root/software/zookeeper/data/myid

在slave2上

echo "3" > /root/software/zookeeper/data/myid

每个 myid 文件的内容应该是对应 server.X 的数字。

启动ZooKeeper集群

在每个节点上启动ZooKeeper

bin/zkServer.sh start

master

slave1

slave2

开启成功

测试ZooKeeper集群

你可以使用 ZooKeeper 客户端来连接并测试集群是否工作正常。可以在任意节点上执行

我在master节点上试着连接slave1来测试

注:172.16.250.206是slave1的ip

bin/zkCli.sh -server 172.16.250.206:2181
[root@master zookeeper]# bin/zkCli.sh -server 172.16.250.206:2181
Connecting to 172.16.250.206:2181
2024-10-23 22:59:05,346 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.8--1, built on 02/06/2016 03:18 GMT
2024-10-23 22:59:05,351 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=master
2024-10-23 22:59:05,351 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_241
2024-10-23 22:59:05,354 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2024-10-23 22:59:05,354 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/root/software/jdk1.8.0_241/jre
2024-10-23 22:59:05,354 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/root/software/zookeeper/bin/../build/classes:/root/software/zookeeper/bin/../build/lib/*.jar:/root/software/zookeeper/bin/../lib/slf4j-log4j12-1.6.1.jar:/root/software/zookeeper/bin/../lib/slf4j-api-1.6.1.jar:/root/software/zookeeper/bin/../lib/netty-3.7.0.Final.jar:/root/software/zookeeper/bin/../lib/log4j-1.2.16.jar:/root/software/zookeeper/bin/../lib/jline-0.9.94.jar:/root/software/zookeeper/bin/../zookeeper-3.4.8.jar:/root/software/zookeeper/bin/../src/java/lib/*.jar:/root/software/zookeeper/bin/../conf:
2024-10-23 22:59:05,355 [myid:] - INFO  [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2024-10-23 22:59:05,355 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2024-10-23 22:59:05,355 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=<NA>
2024-10-23 22:59:05,355 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Linux
2024-10-23 22:59:05,355 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=amd64
2024-10-23 22:59:05,355 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=3.10.0-1160.119.1.el7.x86_64
2024-10-23 22:59:05,355 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=root
2024-10-23 22:59:05,355 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=/root
2024-10-23 22:59:05,356 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=/root/software/zookeeper
2024-10-23 22:59:05,357 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=172.16.250.206:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@25f38edc
Welcome to ZooKeeper!
2024-10-23 22:59:05,394 [myid:] - INFO  [main-SendThread(172.16.250.206:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server 172.16.250.206/172.16.250.206:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2024-10-23 22:59:05,501 [myid:] - INFO  [main-SendThread(172.16.250.206:2181):ClientCnxn$SendThread@876] - Socket connection established to 172.16.250.206/172.16.250.206:2181, initiating session
[zk: 172.16.250.206:2181(CONNECTING) 0] 2024-10-23 22:59:05,581 [myid:] - INFO  [main-SendThread(172.16.250.206:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server 172.16.250.206/172.16.250.206:2181, sessionid = 0x292b9e186fd0000, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

[zk: 172.16.250.206:2181(CONNECTED) 0] 

连接成功

列出当前所有节点

ls /

退出客户端

quit
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值