Dubbo学习之Zookeeper
- Zookeeper简介
- 1. Zookkeeper角色
- 2. Zookeeper下载和安装
- 3. 部署 3 个节点的 Zookeeper 伪分布式集群
- 3.1 为每个节点建立data目录、logs目录和myid文件
- 3.2 为每个节点建立配置文件
- 3.3 启动 zk 集群
- 3.4 客户端接入集群
- 3.5 真实集群需要注意的地方
- 3.6 Zookeeper配置文件中的配置项的含义
- 4 Zookeeper 常用命令
- 4.1 Zookeeper 服务命令
- 4.2 客户端连接Zookeeper
- 4.3 客户端命令
- 4.4 创建节点
Zookeeper简介
学习了一段时间的zookeeper,为了日后好有迹可循就参考官方文档做了一些记录。ZooKeeper是一个开源的分布式框架,提供了协调分布式应用的基本服务。它向外面暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调和管理的难度。它本身可以搭建成一个集群,这个 zk 集群用来对应用程序集群进行管理,监视应用程序集群中各个节点的状态,并根据应用程序集群中各个节点提交的反馈信息决定下一步的合理操作。如下图:
1. Zookkeeper角色
Zookeeper集群是一个基于主从复制的高可用集群,每个服务器都承担如下三种角色的一种角色
- Leader - 领导者
1.1 一个zookeeper集群同时只有一个leader,它会发起并维护与各Follow和Observer间的心跳
1.2 所有的写操作都必须由Leader完成,并由Leader将写操作广播给其他服务器,只要有一半节点 (不包含Observer)接收并写入成功,则这次写操作就认为成功,即写请求会被提交(有点类似于2PC协议) - Follow - 跟随者
2.1 一个zookeeper集群会有多个Follow,它会响应Leader的心跳
2.2 Follow可以独立处理客户端的读请求,同时将写请求发送给Leader处理
2.3 并且负责在Leader投票的时候投上一票 - Observer - 观察者
3.1 Observer角色和Follow类似,只不过没有投票权,Zookeeper需要保证高可用性和强一致性,为了支持更多的客户端,需要增加更多的server,server一多必然会造成投票延迟增大,影响性能;引入Observer,Observer不参与投票,接收客户端的请求,将写的操作转发给Leader节点,加入更多的Observer节点,提高伸缩性,同时不影响吞吐率(是指在一指定时间内由一处传输到另一处或被处理的数据量)
这里留个疑问:是如何进行Leader选举的呢?1
2. Zookeeper下载和安装
环境如下
操作系统: Centos7
Zookeeper版本:3.5.7
其实安装比较简单没太多的东西
- 下载zookeeper
[root@hecs-x-large-2-linux-20200330095116 zookeeper]# pwd
/root/server/tools/zookeeper
[root@hecs-x-large-2-linux-20200330095116 zookeeper]# wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/zookeeper-3.5.7.tar.gz
- 用命令进行解压
[root@hecs-x-large-2-linux-20200330095116 zookeeper]# tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz
-----重命令zookeeper为zookeeper1-----
[root@hecs-x-large-2-linux-20200330095116 zookeeper]# mv zookeeper zookeeper1
- 复制解压后的zookeeper
[root@hecs-x-large-2-linux-20200330095116 zookeeper]# cp -r zookeeper1 zookeeper2
可以按照此方式复制多个zookeeper,后面伪集群需要
3. 部署 3 个节点的 Zookeeper 伪分布式集群
在同一台服务服务器上,部署一个3个zookeeper节点组成的集群,这样的集群叫做伪分布式集群,如果3个节点分别部署在不同的服务器上,则称这种集群为真的分布式集群。真正的分布式集群和这里稍微有些不同。
首先建立一个集群安装的目录就叫zookeeper。其次,在这个目录的下面解压三份ZooKeeper,形成 3 个节点,每一个目录中的 ZooKeeper 就代表一个节点。这样就形成了如下的安装目录结构:
/root/server/tools/zookeeper:
|-- zookeeper1
|-- zookeeper2
|-- zookeeper3
3.1 为每个节点建立data目录、logs目录和myid文件
- 在三个节点分别建立data、logs目录和myid文件
这里用zookeeper1举例子,其他节点按照此操作即可
# 新建目录 data
[root@hecs-x-large-2-linux-20200330095116 zookeeper1]# mkdir data
# 新建目录logs
[root@hecs-x-large-2-linux-20200330095116 zookeeper1]# mkdir logs
# 新建文件myid,只要在文件里写入1就可以,然后保存该文件
[root@hecs-x-large-2-linux-20200330095116 zookeeper1]# touch data/myid
# 查看文件内容
[root@hecs-x-large-2-linux-20200330095116 data]# cat myid
1
[root@hecs-x-large-2-linux-20200330095116 data]#
3.2 为每个节点建立配置文件
- 在 zookeeper1 下新增配置文件:cp zoo_sample.cfg zoo.cfg
[root@hecs-x-large-2-linux-20200330095116 conf]# cp zoo_sample.cfg zoo.cfg
- 编辑zoo.cfg文件
[root@hecs-x-large-2-linux-20200330095116 conf]# vi zoo.cfg
- zoo.cfg文件中的内容如下
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/root/server/tools/zookeeper/zookeeper1/data
dataLogDir=/root/server/tools/zookeeper/zookeeper1/logs
# 本地伪集群的使用
clientPort=2181
server.1=127.0.0.1:8880:7770
server.2=127.0.0.1:8881:7771
server.3=127.0.0.1:8882:7772
- 用同样的方法,在 zookeeper2 和 zookeeper3 的相应位置创建 zoo.cfg,文件 内容复制zookeeper1的 zoo.cfg。只不过需要改动 clientport、dataDir、dataLogDir 三个配置项,zookeeper2 的 clientport 改为 2182,zookeeper3 的 clientport 改为 2183,而 dataDir和 dataLogDir 都修改为相应的目录,就好了。
经过以上的配置,zk 集群中的 3 个节点就全部配置好了。
3.3 启动 zk 集群
- 进入zookeeper集群的第一个节点zookeeper的bin目录,启动服务
# 启动zookeeper1
[root@hecs-x-large-2-linux-20200330095116 zookeeper]# zookeeper1/bin/zkServer.sh start
# 启动zookeeper2
[root@hecs-x-large-2-linux-20200330095116 zookeeper]# zookeeper2/bin/zkServer.sh start
# 启动zookeeper3
[root@hecs-x-large-2-linux-20200330095116 zookeeper]# zookeeper3/bin/zkServer.sh start
3.4 客户端接入集群
- 进入zookeeper集群中任意目录下,启动客户端,然后查看客户端的角色,
三个节点的状态如下图: - 我们可以启动一个客户端,该客户端可以连接集群中任意一个节点,启动客户端命令为 ./zkCli.sh -server ip:port,这里的IP指zookeeper节点的IP,port指zookeeper配置文件zoo.cfg中的clientport值,命令如下:
[root@hecs-x-large-2-linux-20200330095116 zookeeper]# zookeeper1/bin/zkCli.sh -server 127.0.0.1:2181
客户端图片如下:
3.5 真实集群需要注意的地方
真正的分布式集群和伪分布式集群不一样的地方在于配置文件。
- clientport 端口各个节点一样就行。
- server.1=127.0.0.1:8880:7770 中的 ip 要修改成对应的 server 的 ip,后边的两个端口号不需要不同,各个节点都一样就可以了。其他地方伪分布式和真正分布式都是一样的。
3.6 Zookeeper配置文件中的配置项的含义
配置文件中配置项的含义:
- tickTime: zookeeper 中使用的基本时间单位,毫秒值,比如可以设为 1000,那么基本时间单位就是 1000ms,也就是 1s。
- initLimit: zookeeper 集群中的包含多台 server,其中一台为 leader,集群中其余的 server 为 follower,initLimit 参数配置初始化连接时,follower 和 leader 之间的最长 心 跳 时 间 。 如 果 该 参 数 设 置 为 5 , 就 说 明 时 间 限 制 为 5 倍 tickTime , 即5*1000=5000ms=5s。
- syncLimit: 该参数配置 leader 和 follower 之间发送消息,请求和应答的最大时间长度。如果该参数设置为 2,说明时间限制为 2 倍 tickTime,即 2000ms。
- dataDir: 数据目录. 可以是任意目录,一般是节点安装目录下 data 目录。
- dataLogDir: log目录, 同样可以是任意目录,一般是节点安装目录下的logs目录。如果没有设置该参数,将使用和 dataDir 相同的设置。
- clientPort: 监听 client 连接的端口号。
- server.X=A:B:C 其中 X 是一个数字, 表示这是第几号 server,它的值和 myid 文 件中的值对应。A 是该 server 所在的 IP 地址。B 是配置该 server 和集群中的 leader 交换消息所使用的端口。C 配置选举 leader 时所使用的端口。由于配置的是伪集群模式,所以各个 server 的 B, C 参数必须不同,如果是真正分布式集群,那么 B 和 C 在各个节点上可以相同,因为即使相同由于节点处于不同的服务器也不会导致端口冲突。
4 Zookeeper 常用命令
4.1 Zookeeper 服务命令
在准备好相应的配置之后,可以直接通过 zkServer.sh 这个脚本进行服务的相关操作
- 启动 ZK 服务: bin/zkServer.sh start
- 查看 ZK 服务状态: bin/zkServer.sh status
- 停止 ZK 服务: bin/zkServer.sh stop
- 重启 ZK 服务: bin/zkServer.sh restart
- 连接服务器: zkCli.sh -server 127.0.0.1:2181
4.2 客户端连接Zookeeper
zookeeper启动后,我们可以使用如下命令连接zookeeper服务
[root@hecs-x-large-2-linux-20200330095116 zookeeper]# zookeeper1/bin/zkCli.sh -server 127.0.0.1:2181
连接成功会显示如下:
4.3 客户端命令
当然你也可以通过help帮助命令帮助到你:
4.4 创建节点
使用 create 命令,可以创建一个 Zookeeper 节点, 如create [-s] [-e] path data acl其中,-s 或-e 分别指定节点特性,顺序或临时节点,若不指定,则表示持久节点;acl 用来进行权限控制。
- 创建顺序节点
使用 create -s /mytest 12453 命令创建 mytest 顺序节点 - 删除节点
使用 delete 命令可以删除 Zookeeper 上的指定节点,用法如下delete path [version]
其 中 version 也 是 表 示 数 据 版 本 , 使 用 delete /mytest0000000125 命 令 即 可 删 除 /mytest0000000125 节点值得注意的是,若删除节点存在子节点,那么无法删除该节点,必须先删除子节点,再删除父节点。
- 读取节点
与读取相关的命令有 ls 命令和 get 命令,ls 命令可以列出 Zookeeper 指定节点下的所有子节点,只能查看指定节点下的第一级的所有子节点;get 命令可以获取 ZK 指定节点的数据内容和属性信息。其用法分别如下
ls path [watch]
get -s path [watch]
ls -s path [watch]
若获取根节点下面的所有子节点,使用 ls / 命令即可
若想获取根节点数据内容和属性信息,使用 get -s / 命令即可 - 更新节点
使用 set 命令,可以更新指定节点的数据内容,用法如下
set path data [version]
其中,data 就是要更新的新内容,version 表示数据版本,如将/test1230000000126 节点的数据更新为 2356,可以使用如下命令:set /test1230000000126 2356
- 具体可以参考这篇文章. ↩︎