zookeeper是一个强一致【不严格】的分布式数据库,由多个节点共同组成一个分布式集群,挂掉任意一个节点,数据库仍然可以正常工作,客户端无感知故障切换。客户端向任意一个节点写入数据,其它节点可以立即看到最新的数据。

布局规划图

架构图

环境准备

  1. JRE (依赖的环境)【 点击进入

安装JRE

1
2
3
4
5
6
7
8
9
10
11
12
13
tar zxvf jre-8u191-linux-x64.tar.gz
mv jre1.8.0_191/ /opt/
//添加环境变量
vi /etc/profile
//末尾加入
JAVA_HOME=/opt/jre1.8.0_191
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH
//生效配置
source /etc/profile

开启端口

默认是2181 我自己设定为2999,2888和3888是机器之间同步端口

1
2
3
4
firewall-cmd --zone=public --add-port=2999/tcp --permanent
firewall-cmd --zone=public --add-port=2888/tcp --permanent
firewall-cmd --zone=public --add-port=3888/tcp --permanent
firewall-cmd --reload
  1. ZooKeeper安装包
1
2
3
4
5
wget http://mirror.cogentco.com/pub/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz

tar zxvf zookeeper-3.4.13.tar.gz

mv zookeeper-3.4.13 /opt/

安装配置ZooKeeper

基础环境安装完成后,需要配置ZooKeeper

1
2
3
4
//配置
cp /opt/zookeeper-3.4.13/conf/zoo_sample.cfg /opt/zookeeper-3.4.13/conf/zoo.cfg

vi /opt/zookeeper-3.4.13/conf/zoo.cfg

有以下配置选项

  1. tickTime=2000

最小时间单元长度,默认3000,例如回话的最小超时时间默认2*tickTIme

  1. initLimit=5

默认:10,定义leader服务在启动过程中等待follower完成数据同步的时间,后续服务器增多需要增大这个值,以保证数据同步顺利完成。

  1. dataDir=/var/lib/zookeeper/

无默认,必须配置,用于配置ZooKeeper存放快照文件的目录,如果不配置dataLogDir则也存放在这里面。

  1. clientPort=2999

当前服务对外的端口,集群内服务器都可以配置任意可用端口,不需要保持端口一致!一般是2181, 无默认,必须配置!

  1. server.1 = server1:2888:3888

用于定义整个集群是由那几台机器构成的,每一行代表一个机器配置格式如下:

server.id = host:localPort:targetPort

创建myid文件标识当前主机的序号,在dataDir中新建

1
2
vi /var/lib/zookeeper/myid
写上当前主机的序号即可,一定要是整数!

启动ZooKeeper

1
2
3
4
/opt/zookeeper-3.4.13/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

看到上方标识意味启动成功

验证ZooKeeper服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@zookeepermaster bin]# telnet localhost 2999
Trying ::1...
Connected to localhost.
Escape character is '^]'.
stat
Zookeeper version: 3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
Clients:
/0:0:0:0:0:0:0:1:56564[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x200000000
Mode: follower
Node count: 4
Connection closed by foreign host.

像上方这样的返回意味着已经成功运行ZooKeeper了,其中Mode: follower是当前的身份

  1. Mode: leader

leader 是节点中选举的主节点整个服务器中就1个

  1. Mode: follower

follower 是从节点,负责服务客户端

  1. Mode: standalone

standalone 是单机模式下才会有的

采坑集结

如果telnet验证时返回下面这样的情况

1
2
3
4
5
6
7
[root@zookeepermaster bin]# telnet 127.0.0.1 2999
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stat
This ZooKeeper instance is not currently serving requests
Connection closed by foreign host.

碰到上面的情况首先应该检查各个服务节点的机器是否端口已经全部打开?,主要原因就是这个节点无法连接其他服务器造成服务无法选举造成了服务出错