1 概述
1.1 Zookeeper 简介
(1)Zookeeper简介
Zookeeper是一个开源的分布式服务,是Hadoop下的一个子项目,提供了优秀的分布式一致性的解决方案。Zookeeper的主要功能包括:配置管理、名字服务、分布式锁和集群管理等功能,来统筹分布式场景下的应用服务。
Zookeeper的配置管理在分布式应用配置上起到了很大的作用,它使用了Zab一致性协议来提供一致性。有很多开源项目使用了Zookeeper来维护配置,比如在HBase中,客户端就是通过连接一个Zookeeper来获得必要的HBase集群的配置信息,从而进行下一步操作;开源的消息队列应用Kafka中,也使用 Zookeeper来维护broker的信息。在 Alibaba开源的 SOA 框架Dubbo 中也广泛的使用 Zookeeper 管理一些配置来实现服务治理。
Zookeeper名字服务顾名思义,即提供统一的名字服务。当分布式应用服务越来越多时,在本地存储服务的地址将变得不再方便,因此Zookeeper提供了一个统一的访问入口,用于维护所有的IP。
Zookeeper的另一个重要的应用就是分布式锁,用于协调多个分布式服务之间的活动。除此之外Zookeeper还提供了分布式集群管理,维护集群中的节点状态,比如Alibaba开源的SOA框架Dubbo就采用Zookeeper作为服务发现的底层机制)。还有开源的Kafka队列就采用了Zookeeper作为Cosnumer的上下线管理。
Zookeeper官网:https://Zookeeper.apache.org/
1.2 Kayarch 简介
浪潮信息KOS是浪潮信息基于Linux Kernel、OpenAnolis等开源技术自主研发的一款服务器操作系统,支持x86、ARM等主流架构处理器,性能和稳定性居于行业领先地位,具备成熟的 CentOS 迁移和替换能力,可满足云计算、大数据、分布式存储、人工智能、边缘计算等应用场景需求。详细介绍见官网链接浪潮信息KOS服务器操作系统-服务器操作系统-浪潮信息。
2 安装准备
2.1 操作系统环境
版本信息:KeyarchOS 5.8sp1
硬件平台:X86_64
2.2 Zookeeper版本
Zookeeper-3.8.2
3 安装 Zookeeper
3.1 安装JDK
Zookeeper是基于Java的应用,因此在正式安装Zookeeper之前,需要确保主机的JDK环境,如若缺少,则准备之。
以JDK1.8为例,通过yum管理器安装。
$ yum install -y java-1.8.0-openjdk
查看是否安装成功。
$ java -version
3.2 安装Zookeeper
(1)下载安装包
通过wget下载安装包到本地:
$ wget https://archive.apache.org/dist/Zookeeper/Zookeeper-3.5.9/apache-Zookeeper-3.5.9-bin.tar.gz
- 或者移步官网手动下载:https://archive.apache.org/dist/Zookeeper/
下载完毕,解压缩到指定目录下:
$ tar -zxvf ~/apache-Zookeeper-3.5.9-bin.tar.gz
$ cd apache-Zookeeper-3.5.9-bin
此时可以看到Zookeeper的目录结构。
可以对其重命名。
$ mv apache-Zookeeper-3.5.9-bin/ Zookeeper3
(2)配置Zookeeper
进入Zookeeper3目录下,创建两个子目录:data和logs,并创建配置文件。
$ mkdir data logs
$ cp conf/zoo_sample.cfg conf/zoo.cfg
进入该配置文件,可以查看其基本信息:
$ vim conf/zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/Zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://Zookeeper.apache.org/doc/current/ZookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
更多关于zk的配置请参考:https://cloud.tencent.com/developer/article/1529208z
(3)运行Zookeeper
在Zookeeper3目录下,运行bin子目录下的启动脚本。
$ bin/zkServer.sh start
查看Zookeeper的启动状态:
$ bin/zkServer.sh status
可以查看到客户端口,启动模式(单机模式)等信息。
停止运行Zookeeper:
$ bin/zkServer.sh stop
注意,由于涉及端口开放,因此要配置本机防火墙以开放对应端口。本文不再赘述。
4 Zookeeper在集群中的应用
4.1 Zookeeper基本概念
Zookeeper被广泛应用到集群中,提供分布式数据一致性解决方案。接下来本文将介绍一些Zookeeper的基本概念。
(1)角色
Zookeeper的角色分为:Leader、Follower和Observer三种。
Zookeeper 集群在同一时刻只会有一个 Leader节点,其他节点都是 Follower 或 Observer。Zookeeper 默认只有 Leader 和 Follower 两种角色,没有 Observer 角色。当然,任何想变成Observer的节点,都可以在其配置文件中做出如下配置以成为Observer。
:peerType=observer
(2)选举
Zookeeper 集群的所有节点通过一个选举过程来选定一台被称为Leader节点,用于提供客户端的读写服务。
选举过程使用特定的算法,采用投票机制,myid小的服务器给myid大的服务器投票,直到半数以上节点一致通过,最终选举出合适的Leader。
参考:https://zhuanlan.zhihu.com/p/100938553
(3)会话
Zookeeper中,每个节点客户端和服务端建立一个持久会话(TCP长连接),通过会话不断更新节点状态,其他节点也可以获取此节点状态。
Zookeeper 对外的服务端口默认是2181,客户端启动时,首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够通过心跳检测和服务器保持有效的会话,也能够向 Zookeeper 服务器发送请求并接受响应,同时还能通过该连接接收来自服务器的 Watch 事件通知。
Session 的 SessionTimeout 值用来设置一个客户端会话的超时时间。当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在SessionTimeout 规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。
(4)数据节点
Zookeeper的结构其实就是一个树形结构,Leader就相当于其中的根结点,其它节点就相当于Follower节点,每个节点都保留自己的内容。
Zookeeper的节点分两类:
- 持久节点:所谓持久节点是指一旦这个树形结构上被创建了,除非主动进行对树节点的移除操作,否则这个节点将一直保存在 Zookeeper 上。
- 临时节点:临时节点的生命周期跟客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。
(5)状态信息
每个节点除了存储数据内容之外,还存储了节点本身的一些状态信息。用 get 命令可以同时获得某个节点的内容和状态信息.
在Zookeeper中,version属性是用来实现乐观锁机制中的写入校验的(保证分布式数据原子性操作)。
(6)事务操作
在Zookeeper中,能改变Zookeeper服务器状态的操作称为事务操作。一般包括数据节点创建与删除、数据内容更新和客户端会话创建与失效等操作。对应每一个事务请求,Zookeeper都会为其分配一个全局唯一的事务ID,用ZXID表示,通常是一个64位的数字。每一个 ZXID对应一次更新操作,从这些 ZXID 中可以间接地识别出 Zookeeper 处理这些事务操作请求的全局顺序。
4.2 Zookeeper集群搭建
(1)更改配置文件zoo.cfg
在zoo.cfg末尾加入集群服务器配置(所有机器都要配置)。
# IN zoo.cfg
server.1=${IP1}:2281:2381
server.2=${IP2}:2281:2381
server.3=${IP3}:2281:2381
注意,这里的格式(server.n=A:B:C),n服务器编号,可随便起,别重复就行(myid文件会用到此值),A表示服务器IP,B表示follower与leader通信的端口,C表示Leader选举端口。
(2)创建myid文件
在zookeeper3/data目录中创建一个myid文件,意欲作为Leader的节点设置为1。
同理,上文${IP2}主机配置为2,${IP3}主机配置为3。
(3)开通防火墙端口
确保2281端口开放。
$ firewall-cmd --zone=public --add-port=2281/tcp --permanent
$ firewall-cmd --reload
此时便配置完毕了。重启Zookeeper,使用zkCli.sh连接。
$ bin/zkServer.sh restart
$ bin/zkCli.sh
(4)配置密码和权限
使用zkCli连接Zookeeper服务器后,查看ACL。
$ getAcl /
添加用户和密码:
$ addauth digest {account}:{password}