【误闯大数据】【从安装到入门】ZooKeeper-单点多点篇

1,168 阅读9分钟
作者 日期 版本号
元公子 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.找些东东改改

  1. 修改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
  1. 设置环境变量

文件最底部追加以下内容

[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
  1. 修改配置文件:从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)

  1. 在上一章节的单点基础上,复制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
  1. 开始修改三个配置文件: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
  1. 创建集群所需的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
  1. 启动三个实例节点
[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)

  1. 首先,在三台机器上,按照第四节单点玩耍的方式安装ZooKeeper

  2. 然后,修改这三台机器上的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
  1. 依旧是创建集群所需的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
  1. 每台机器上启动实例节点

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。
存储配置参数 键名 键值/描述
待用

附录: