介绍
Zookeeper是一个开源的分布式协调服务,它提供了一个高度可靠的分布式环境,用于协调和管理大规模分布式应用程序的配置、状态和集群成员信息。
它提供了以下主要功能:
- 分布式协调:Zookeeper提供了一组原语,如锁、队列和分布式锁,用于协调分布式系统中的各个节点之间的操作顺序,确保数据的一致性和可靠性。
- 高可用性:Zookeeper使用了分布式的、高可用的架构,通过在多个节点之间复制数据来实现容错能力。如果某个节点发生故障,其他节点可以接管服务而不会中断。
- 数据发布/订阅:Zookeeper允许应用程序发布和订阅关于配置更改、状态更新等的通知。应用程序可以监视特定的Zookeeper节点,以获取有关系统状态的实时通知。
- 原子操作:Zookeeper提供了原子性操作,可以保证分布式系统中的多个操作要么远不成功,要么全部失败。这对于实现分布式锁、事务等场景非常重要。
Zookeeper使用了基于Paxos算法的一致性协议来确保数据的一致性和可靠性。它的设计目标是提供高性能、低延迟的分布式协调服务,是开发人员能够更轻松地构建可靠的分布式应用程序。
Zookeeper广泛应用于分布式系统领域,例如Apache Hadoop、Apache Kafka(新版本可以不用)、Apache HBase等都使用Zookeeper来进行集群协调和管理。
安装前准备
环境
- centos 7.x
- java 1.8.0_201
- Zookeeper
规划
| IP地址 |
主机名 |
| 172.16.77.202 |
hadoop-master-202 |
| 172.16.77.203 |
hadoop-node-203 |
| 172.16.77.204 |
hadoop-node-204 |
安装Zookeeper
下载Zookeeper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#选择自己需要的版本下载
#地址:https://archive.apache.org/dist/zookeeper/
#下载Zookeeper 3.7.1
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz
#解压至安装目录
tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz -C /home/hadoop/software/
#安装包下主要目录和文件:
bin:包含了Zookeeper的可执行脚本和命令行工具,用于启动、停止和管理Zookeeper服务。
conf:包含了Zookeeper的配置文件,用于配置Zookeeper服务的行为和参数。常见的配置文件包括zoo.cfg,
用于指定Zookeeper的基本配置信息,以及log4j.properties,用于配置日志记录。
docs:包含了Zookeeper的文档和用户指南。
lib:包含了Zookeeper的依赖库和扩展插件,这些库和插件用于支持Zookeeper的各种功能和扩展。
|
配置环境变量
此处按自己的需求来,没有必须在/etc/profile添加 正常在~/.bashrc下添加就行,这里都加上了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
vim /etc/profile
......
#zookeeper
export ZK_HOME=/home/hadoop/software/apache-zookeeper-3.7.1-bin/
export PATH=$PATH:$ZK_HOME/bin
##加载环境环境,测试是否安装成功
source /etc/profile
echo $ZK_HOME
#出现以下内容,说明正常
/home/hadoop/software/apache-zookeeper-3.7.1-bin/
su - hadoop
vim ~/.bashrc
......
#zookeeper
export ZK_HOME=/home/hadoop/software/apache-zookeeper-3.7.1-bin/
export PATH=$PATH:$ZK_HOME/bin
##加载环境环境
source ~/.bashrc
|
配置Zookeeper
创建所需目录及文件
1
2
3
4
5
6
|
#创建目录
mkdir -p /home/hadoop/software/apache-zookeeper-3.7.1-bin/{zkData,zkDataLog}
#创建myid文件并写入1
#需要注意:每个节点需要不同且唯一的myid中的内容 需要和zoo.cfg里的一样
echo 1 | tee /home/hadoop/software/apache-zookeeper-3.7.1-bin/zkData/myid >/dev/null
|
修改zoo.cfg
默认没有zoo.cfg,可以将zoo_sample.cfg拷贝为zoo.cfg,也可以参考zoo_sample.cfg,自己创建zoo.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#创建zoo.cfg
cd $ZK_HOME/conf
vim zoo.cfg
#写入以下内容
##用于计算心跳和超时时间等 单位是毫秒 默认值为2000毫秒
tickTime=12000
#集群中的初始同步时间限制 以tickTime的倍数来表示
initLimit=20
# 集群中的同步时间限制 以tickTime的倍数来表示
syncLimit=5
#存储数据的目录路径。在这个路径下,ZooKeeper 会创建并存储数据文件。
dataDir=/home/hadoop/software/apache-zookeeper-3.7.1-bin/zkData
#存储事务日志的目录路径。在这个路径下,ZooKeeper 会创建并存储事务日志文件
dataLogDir=/home/hadoop/software/apache-zookeeper-3.7.1-bin/zkDataLog
#客户端连接的端口号
clientPort=2181
#集群中的服务器配置
server.1=172.16.77.202:2888:3888
server.2=172.16.77.203:2888:3888
server.3=172.16.77.204:2888:3888
#指定选举算法的参数。在这里设置为 3,表示使用 FastLeaderElection 算法。
electionAlg=3
#允许的最大客户端连接数。
maxClientCnxns=5000
#客户端连接的超时时间,以毫秒为单位
clientPortTimeout=30000
|
分发目录
将zookeeper安装目录拷贝到各个节点上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#将Zookeeper安装目录分配至hadoop用户
chown -R hadoop:hadoop /home/hadoop/software/
#切换到hadoop用户
su - hadoop
#查看路径
pwd
/home/hadoop
#传输zookeeper
scp -r software/apache-zookeeper-3.7.1-bin/ hadoop@172.16.77.203:/home/hadoop/software/
scp -r software/apache-zookeeper-3.7.1-bin/ hadoop@172.16.77.204:/home/hadoop/software/
#传输bashrc
scp ~/.bashrc hadoop@172.16.77.203:~/.bashrc
scp ~/.bashrc hadoop@172.16.77.204:~/.bashrc
|
修改myid
当前主机上已经将myid的内容设置为1了,这里需要将其他两个节点的对应修改
1
2
3
4
5
|
##分别在203和204节点上对应修改
#203
echo 2 | tee /home/hadoop/software/apache-zookeeper-3.7.1-bin/zkData/myid >/dev/null
#204
echo 3 | tee /home/hadoop/software/apache-zookeeper-3.7.1-bin/zkData/myid >/dev/null
|
启动Zookeeper
每个节点都需要启动。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
cd $ZK_HOME
###启动
bin/zkServer.sh start
.....
#出现以下正常
Starting zookeeper ... STARTED
#jps查看
jps
......
10272 QuorumPeerMain
#####202查看状态
bin/zkServer.sh status
......
Mode: follower
#####203查看状态
bin/zkServer.sh status
......
Mode: leader
#####204查看状态
bin/zkServer.sh status
......
Mode: follower
#启动关闭相关命令
zkServer.sh start
zkServer.sh status
zkServer.sh stop
zkServer.sh restart
|
说明:Zookeeper启动后会占用以下端口
- 2181端口:是Zookeeper的客户端访问端口。客户端应用程序可以通过该端口连接到Zookeeper服务器,并发送读取和写入请求,以读取和修改Zookeeper中的数据。
- 2888端口:是Zookeeper服务器之间进行通信的端口。Zookeeper使用该端口进行Leader选举和数据同步。当Zookeeper服务器启动时,它们将尝试在该端口上建立互相之间的通信,以形成一个Zookeeper集群。
- 3888端口:这是Zookeeper服务器之间进行Leader选举时使用的端口。当一个Zookeeper服务器发现当前的Leader服务器不可用时,它将使用该端口来与其他服务器进行通信,发起一次选举过程,以选择新的Leader。
- 39063端口(不一定一样):这是Zookeeper的内部通信端口。Zookeeper服务器使用该端口进行内部通信,例如用于选举协议和数据同步。这个端口是动态分配的,并且在每个服务器启动时都会随机选择一个可用端口。
测试连接
1
2
3
|
zkCli.sh -server localhost:2181
zkCli.sh -server 172.16.77.202:2181,172.16.77.203:2181,172.16.77.204:2181
|
AdminServer
了解即可
如果对应观察一下端口占用,会发现Zookeeper启动时还占用了8080端口,查询文档这里发现,在3.5版本之后,Zookeeper默认启用了AdminServer,默认情况下它会在8080端口上启动一个嵌入式的Jetty服务器,为四字命令提供HTTP接口,可以通过http://172.16.77.202:8080/commands 查看。AdminServer是默认启用的。