| 作者 | 日期 | 版本号 |
|---|---|---|
| 元公子 | 2019-12-10 | v1.0.0 |
你知道的越少,你不知道的就越少
没有朋友的点赞,就没法升级打怪
一、闲话
它是典型的分布式数据一致性的解决方案,涉及到分布式的中间件,一般都会使用到它,真要得拜读下源码。它是由Yahoo出品,Google Chubby的开源实现。树形数据存储结构、节点间通讯、监听节点变化事件、领导人选举、分布式锁/队列、ZAB协议、Paxos 算法等等,真是升级段位必备补品,够看几年的,还要啥自行车。
二、下载安装包
官方地址:zookeeper.apache.org/releases.ht…
下载最新版软件:apache-zookeeper-3.5.6-bin.tar.gz
三、系统环境检查/准备
- 示例使用Centos7操作系统
- 全程使用root用户
四、单点玩耍
此章节讲述单机单点的安装方法,我的行话单节点版(单实例),一个人省钱玩的嗨。
1.选择安装目录(在/soft文件夹放置工具软件,或者按您意思来)
解压缩
[root@hadoop-master /soft]# tar -xvzf apache-zookeeper-3.5.6-bin.tar.gz
创建软连接,便于后续的软件升级或多版本切换
[root@hadoop-master /soft]# ln -s apache-zookeeper-3.5.6-bin zk
2.找些东东改改
- 修改bin/zkEnv.sh,在正式内容的开始行下,增加一行JAVA_HOME环境变量
[root@hadoop-master /soft]# vi /soft/zk/bin/zkEnv.sh
参考基准位 # '--config' option in the command line.
# jdk路径按您的实际情况调整
JAVA_HOME=/soft/jdk
参考基准位 ZOOBINDIR="${ZOOBINDIR:-/usr/bin}"
执行保存: Esc :wq
- 设置环境变量
文件最底部追加以下内容
[root@hadoop-master /soft]# vi /etc/profile
export ZOOKEEPER_HOME=/soft/zk
export PATH=$PATH:$ZOOKEEPER_HOME/bin
执行保存: Esc :wq
[root@hadoop-master /soft]# source /etc/profile
- 修改配置文件:从demo样例中复制一份,并修改conf/zoo.cfg文件(它是启动配置文件,多点启动时都会到。)
[root@hadoop-master /soft]# cp /soft/zk/conf/zoo_sample.cfg /soft/zk/conf/zoo.cfg
[root@hadoop-master /soft]# vi /soft/zk/conf/zoo.cfg
# 默认2000毫秒,基本时间单元。服务器(即zookeeper各类节点)之间或者客户端(理解为谁来连接,比如程序项目即为客户端)与服务器之间维持心跳的时间间隔。
# 另外,zookeeper的客户端和服务端之间也有和web开发里类似的session的概念,zookeeper默认最小的session过期时间(minSessionTimeout参数)是2*tickTime,最大的session过期时间(maxSessionTimeout参数)是20*tickTime。
tickTime=2000
# 默认10,时长10*tickTime。Follower在启动过程中,从Leader同步所有最新数据的最大心跳数(或时长)。
initLimit=10
# 默认5,时长5*tickTime。Leader向Follower发送消息,请求和应答之间能容忍的最多心跳数.如果follower在设置的时间内不能与leader进行通信,那么此follower将被丢弃。
syncLimit=5
# 默认服务的端口号2181
clientPort=2181
# 快照数据存储路径,启动时自动创建(按客官喜好调整)
dataDir=/var/zookeeper/data
# 事务日志存储路径,启动时自动创建(按客官喜好调整)
dataLogDir=/var/zookeeper/log
# 默认60,每个客户端IP的最大并发连接数。如果客户端报错Zookeeper Too many connections,需调节此参数。
#maxClientCnxns=100
# 默认情况下,Leader是会接受客户端连接,并提供正常的读写服务。参数设置为no后,Leader不接收客户端请求,以专注协调集群机器,提高集群性能。
#leaderServes=no
# 将此节点设置为观察者模式,Observer不参与投票,其它和Follower一样。(就是开啥会都不举手的那类好战友)
# 同时,该集群节点的配置需增加:observer标识,例如:server.1=IP:2181:3181:observer
#peerType=observer
3.点火启动,action
[root@hadoop-master /soft]# zkServer.sh start
Starting zookeeper ... STARTED
其它关联指令:
- 熄火停止:zkServer.sh stop
- 查看启动/集群状态:zkServer.sh status
- 显示当前所有java进程(zookeeper的java进程名称QuorumPeerMain):jps
五、多点伪集群玩耍
此章节讲述单机多点的安装方法,我的行话单机多节点伪集群,多人在一间网吧里嗨。为啥有这个东东,没钞票买电脑呗。您还别瞧不起假的,往往用假的比真的泛滥。。。
此安装方式至少需要启动3个服务节点,而且递增为奇数(2^N-1,N>=2)
- 在上一章节的单点基础上,复制conf/zoo.cfg文件三份,例如:conf/zoo1.cfg,conf/zoo2.cfg,conf/zoo3.cfg,然后修改这三份配置文件。
[root@hadoop-master /soft]# cp /soft/zk/conf/zoo.cfg /soft/zk/conf/zoo1.cfg
[root@hadoop-master /soft]# cp /soft/zk/conf/zoo.cfg /soft/zk/conf/zoo2.cfg
[root@hadoop-master /soft]# cp /soft/zk/conf/zoo.cfg /soft/zk/conf/zoo3.cfg
- 开始修改三个配置文件:zoo1.cfg
[root@hadoop-master /soft]# vi /soft/zk/conf/zoo1.cfg
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/var/zookeeper/zk1/data
dataLogDir=/var/zookeeper/zk1/log
# 集群格式:server.myid=IP:Port1:Port2[:observer]
# myid是服务器的编号,一个正整数,一般是0、1、2、3,这里实例有3个。
# IP:实例所在机器IP或域名映射(推荐域名方式,便于机器IP变动,文章结尾会给出配置域名的方法)
# Port1:与集群Leader服务器交换信息的端口,Port2:集群Leader服务器宕机,用于重新选举出Leader的端口。
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
修改zoo2.cfg
[root@hadoop-master /soft]# vi /soft/zk/conf/zoo2.cfg
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2182
dataDir=/var/zookeeper/zk2/data
dataLogDir=/var/zookeeper/zk2/log
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
修改zoo3.cfg
[root@hadoop-master /soft]# vi /soft/zk/conf/zoo3.cfg
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2183
dataDir=/var/zookeeper/zk3/data
dataLogDir=/var/zookeeper/zk3/log
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
- 创建集群所需的myid标识文件,各自内容为配置文件中的服务器编号
# 创建myid标识文件
[root@hadoop-master /soft]# mkdir -p /var/zookeeper/zk1/data
[root@hadoop-master /soft]# vi /var/zookeeper/zk1/data/myid
1
执行保存: Esc :wq
[root@hadoop-master /soft]# mkdir -p /var/zookeeper/zk2/data
[root@hadoop-master /soft]# vi /var/zookeeper/zk2/data/myid
2
执行保存: Esc :wq
[root@hadoop-master /soft]# mkdir -p /var/zookeeper/zk3/data
[root@hadoop-master /soft]# vi /var/zookeeper/zk3/data/myid
3
执行保存: Esc :wq
- 启动三个实例节点
[root@hadoop-master /soft]# zkServer.sh start /soft/zk/conf/zoo1.cfg
[root@hadoop-master /soft]# zkServer.sh start /soft/zk/conf/zoo2.cfg
[root@hadoop-master /soft]# zkServer.sh start /soft/zk/conf/zoo3.cfg
其它关联指令:
- 熄火停止:
- zkServer.sh stop /soft/zk/conf/zoo1.cfg
- zkServer.sh stop /soft/zk/conf/zoo2.cfg
- zkServer.sh stop /soft/zk/conf/zoo3.cfg
- 查看启动状态:
- zkServer.sh status /soft/zk/conf/zoo1.cfg
- zkServer.sh status /soft/zk/conf/zoo2.cfg
- zkServer.sh status /soft/zk/conf/zoo3.cfg
六、多点真集群分布式(不玩耍,有钱我是认真)
此章节讲述多机单点的安装方法,我的行话多机多点分布式集群,多人在各自家里联网嗨,有钱呗。
此安装方式其实就是前两节的综合,在每台机器上安装ZooKeeper,然后配置上带有集群功能的参数。
以下为三台服务器为例讲述:机器1(192.168.0.1),机器2(192.168.0.2),机器3(192.168.0.3)
-
首先,在三台机器上,按照
第四节单点玩耍的方式安装ZooKeeper -
然后,修改这三台机器上的zoo.cfg文件。由于是单独的机器,参数内容基本都一致。
建议把该文件放到其他目录,会少些升级时拷贝配置文件的烦恼,这里放到安装用户home目录下。
192.168.0.1(配置中的集群各节点IP,建议替换为映射域名,可参考尾部章节)
[root@192.168.0.1 /soft]# mkdir -p ~/zookeeper/conf
[root@192.168.0.1 /soft]# vi ~/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/var/zookeeper/data
dataLogDir=/var/zookeeper/log
server.1=192.168.0.1:2287:3387
server.2=192.168.0.2:2287:3387
server.3=192.168.0.3:2287:3387
执行保存: Esc :wq
192.168.0.2
[root@192.168.0.2 /soft]# mkdir -p ~/zookeeper/conf
[root@192.168.0.2 /soft]# vi ~/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/var/zookeeper/data
dataLogDir=/var/zookeeper/log
server.1=192.168.0.1:2287:3387
server.2=192.168.0.2:2287:3387
server.3=192.168.0.3:2287:3387
执行保存: Esc :wq
192.168.0.3
[root@192.168.0.3 /soft]# mkdir -p ~/zookeeper/conf
[root@192.168.0.3 /soft]# vi ~/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/var/zookeeper/data
dataLogDir=/var/zookeeper/log
server.1=192.168.0.1:2287:3387
server.2=192.168.0.2:2287:3387
server.3=192.168.0.3:2287:3387
执行保存: Esc :wq
- 依旧是创建集群所需的myid标识文件。
192.168.0.1
# 创建myid标识文件
[root@192.168.0.1 /soft]# mkdir -p /var/zookeeper/data
[root@192.168.0.1 /soft]# vi /var/zookeeper/data/myid
1
执行保存: Esc :wq
192.168.0.2
[root@192.168.0.2 /soft]# mkdir -p /var/zookeeper/data
[root@192.168.0.2 /soft]# vi /var/zookeeper/data/myid
2
执行保存: Esc :wq
192.168.0.3
[root@192.168.0.3 /soft]# mkdir -p /var/zookeeper/data
[root@192.168.0.3 /soft]# vi /var/zookeeper/data/myid
3
执行保存: Esc :wq
- 每台机器上启动实例节点
192.168.0.1
[root@192.168.0.1 /soft]# zkServer.sh start /root/zookeeper/conf/zoo.cfg
Using config: /root/zookeeper/conf/zoo.cfg
Starting zookeeper ... STARTED
192.168.0.2
[root@192.168.0.2 /soft]# zkServer.sh start /root/zookeeper/conf/zoo.cfg
Using config: /root/zookeeper/conf/zoo.cfg
Starting zookeeper ... STARTED
192.168.0.3
[root@192.168.0.3 /soft]# zkServer.sh start /root/zookeeper/conf/zoo.cfg
Using config: /root/zookeeper/conf/zoo.cfg
Starting zookeeper ... STARTED
七、Centos7 自启动服务
服务文件名zookeeper.service,可按您实际情况定义。
如果启动需指定zoo.cfg配置文件的情况,请参考上面讲解的事例脚本,修改ExecStart、ExecStop和ExecReload。
[root@hadoop-master /soft]# vi /etc/systemd/system/zookeeper.service
# 或者 vi /lib/systemd/system/zookeeper.service
[Unit]
Description=zookeeper
After=syslog.target network.target
[Service]
Type=forking
User=root
Group=root
# 多个变量以空格分割。变量值带有空格或者等号的情况,则用双引号区分。例如:#Environment="VAR1=word1 word2" VAR2=word3
# 或者每个环境变量一行,例如第一行Environment="VAR1=word1 word2" 第二行Environment=VAR2=word3
# zookeeper运行日志的目录,可自定义修改
Environment=ZOO_LOG_DIR=/soft/zk/logs
# ExecStart、ExecStop、ExecReload按您实际目录情况定义
ExecStart=/soft/zk/bin/zkServer.sh start
ExecStop=/soft/zk/bin/zkServer.sh stop
ExecReload=/soft/zk/bin/zkServer.sh restart
Restart=always
[Install]
WantedBy=multi-user.target
执行保存: Esc :wq
[root@hadoop-master /soft]# chmod 755 /etc/systemd/system/zookeeper.service
# 启用开机启动服务(zookeeper名称为zookeeper.service的"."前部分)
[root@hadoop-master /soft]# systemctl enable zookeeper
# 启动服务
[root@hadoop-master /soft]# systemctl start zookeeper
其它关联指令:
- 停止服务:service zookeeper stop
- 重启服务(先stop后start):service zookeeper restart
- 查看服务状态:service zookeeper status
- 修改服务的配置内容后,重新加载生效:systemctl daemon-reload
- 禁用开机服务:systemctl disable zookeeper
- 查看服务是否开机启动:systemctl is-enabled zookeeper
- 查看已启动的服务列表:systemctl list-unit-files --type=service | grep enabled
八、扩展内容
1. 设置IP/域名名称映射
查看本机的机器名
[root@hadoop-master /soft]# hostname
hadoop-master
设置本机的机器名(需重启生效)
[root@hadoop-master /soft]# hostnamectl set-hostname 自定义机器名
设置自定义域名名称与真实机器IP的映射关系(与上述机器名设置没什么关系,只是为了便于查看,一般与机器名称一致)
[root@hadoop-master /soft]# vi /etc/hosts
# 本文举例,间距可以一个空格或者一个tab
192.168.0.1 zk1
192.168.0.2 zk2
192.168.0.3 zk3
然后,每台ZooKeeper集群配置的地方调整如下(每台服务器都要有同映射内容hosts文件)
server.1=zk1:2287:3387
server.2=zk2:2287:3387
server.3=zk3:2287:3387
2. zoo.cfg配置参数整理(记录用过的)
| 基本配置参数 | 键名 | 键值/描述 |
| clientPort | 接收客户端访问请求的端口 | |
| dataDir | 存储内容快照的位置 | |
| dataLogDir | 存储事务日志的位置 | |
| tickTime | 基本时间单元 | |
| 网络配置参数 | 键名 | 键值/描述 |
| maxClientCnxns | 每客户端IP的最大并发连接数 | |
| clientPortAddress | zk监听IP的地址 | |
| minSessionTimeout | 会话的最短超时时长 | |
| maxSessionTimeout | 会话的最大超时时长 | |
| 集群配置参数 | 键名 | 键值/描述 |
| server.ID | [hostname]:port:port[:observer] | |
| initLimit | Follower连入Leader并完成数据同步的时长 | |
| syncLimit | 心跳检测的最大延迟 | |
| leaderServes | leader是否接收读写请求 | |
| cnxTimeout | 默认值为5000,单位毫秒。Leader选举期间,各服务器之间进行TCP连接创建的超时时间 | |
| weight.ID | (leader选举)节点的权重,默认是1,例如weight.1=1。如设置为0,不参与leader选举。配合group.ID使用。 | |
| group.ID | (leader选举)节点所属组,例如group.1=1:2:3。 | |
| 存储配置参数 | 键名 | 键值/描述 |
| 待用 |