zk集群搭建

别等时光非礼了梦想. 提交于 2020-01-19 19:59:03

## zookeeper基础知识、体系结构、数据模型

1、zookeeper是一个类似hdfs的树形文件结构, zookeeper可以用来保证数据在(zk)集 群之间的数据的事务性一致;

2、zookeeper有watch事件,是一次性触发的,当watch监视的数据发生变化时,通 知设置了该watch的client,即watcher

3、zookeeper有三个角色: Learner, Follower, Observer

4、zookeeper应用场景: 统一命名服务(Name Service) 配置管理(Configuration Management) 集群管理(Group Membership) 共享锁(Locks) 队列管理

## 环境准备

zookeeper运行需要jdk的支持,所以需要配置jdk的环境变量,此处可以选择两种环境变量配置:全局&&局部。

全局:**/etc/profile**下配置全局的**JAVA_HOME和PATH**等环境信息

```shell
export JAVA_HOME=/usr/local/jdk1.8
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
```

局部:zookeeper解压后的bin目录的**zkEnv.sh**下可以设置zookeeper的运行环境,可以在shell脚本中加入如:

```shell
export JAVA_HOME=/usr/local/jdk1.8
export PATH=$JAVA_HOME/bin:$PATH
```

可以选择配置**ZOOKEEPER_HOME**

如果在/etc/profile中配置了**JAVA_HOME**,再配置**ZOOKEEPER_HOME**的话,如下:

```shell
export JAVA_HOME=/usr/local/jdk1.8
export ZOOKEEPER_HOME=/usr/local/zk3
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin
```

## 单机版搭建

单机版的zookeeper安装非常容易,上传或者wget到zookeeper的tar.gz文件,本次安装示例以zookeeper-3.4.6.tar.gz示例(此为配置全局jdk环境变量的安装,如果没有配置全局jdk环境变量请解压后修改zkEnv.sh文件)

1、解压

```shell
tar -zxvf zookeeper-3.4.6.tar.gz
```

2、重命名

```shell
mv zookeeper-3.4.6 zk
```

3、创建数据文件夹

```shell
cd zk
mkdir data
mkdir logs
```

4、 配置配置文件

```shell
cd conf
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
# 修改配置文件中的参数信息
clientPort=2181
dataDir=/root/zk-simple/zk/data
dataLogDir=/root/zk-simple/zk/logs
```

5、启动zookeeper

```shell
# 启动
cd bin
sh ./zkServer.sh start
# 停止
sh ./zkServer.sh stop
# 重启
sh ./zkServer.sh restart
# 查看运行状态
sh ./zkServer.sh status
```

## 集群版搭建

### 单机器搭建集群

本次搭建以三个节点为例

#### 节点1设置

```shell
mkdir zk-cluster
cd zk-cluster
tar -zxvf zookeeper-3.4.6.tar.gz
mv zookeeper-3.4.6 zk1
cd zk1
mkdir data
mkdir logs
cd data
# myid设置为1
vim myid
cd ..
cd conf
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
# 修改配置文件中的参数信息
clientPort=7700
dataDir=/root/zk-cluster/zk1/data
dataLogDir=/root/zk-cluster/zk1/logs
server.1= 192.168.84.138:2888:3888
server.2= 192.168.84.138:2889:3889
server.3= 192.168.84.138:2890:3890
```

#### 节点2设置

```shell
cd ../../
cp -r zk1 zk2
cd zk2/data
# 设置为2
vim myid
cd ..
vim zoo.cfg
# 修改配置文件中的参数信息
clientPort=7701
dataDir=/root/zk-cluster/zk2/data
dataLogDir=/root/zk-cluster/zk2/logs
server.1= 192.168.84.138:2888:3888
server.2= 192.168.84.138:2889:3889
server.3= 192.168.84.138:2890:3890
```

#### 节点3设置

```shell
cd ../../
cp -r zk1 zk2
cd zk2/data
# 设置为2
vim myid
cd ..
vim zoo.cfg
# 修改配置文件中的参数信息
clientPort=7702
dataDir=/root/zk-cluster/zk3/data
dataLogDir=/root/zk-cluster/zk3/logs
server.1= 192.168.84.138:2888:3888
server.2= 192.168.84.138:2889:3889
server.3= 192.168.84.138:2890:3890
```

#### 集群启动脚本

```shell
zk-cluster-start.sh
#! /bin/sh
sh /root/zk-cluster/zk1/bin/zkServer.sh start
sh /root/zk-cluster/zk2/bin/zkServer.sh start
sh /root/zk-cluster/zk3/bin/zkServer.sh start
```

#### 集群查看状态脚本

 

```shell
zk-cluster-start.sh
#! /bin/sh
sh /root/zk-cluster/zk1/bin/zkServer.sh status
sh /root/zk-cluster/zk2/bin/zkServer.sh status
sh /root/zk-cluster/zk3/bin/zkServer.sh status
```

#### 集群停止脚本

```
zk-cluster-start.sh
#! /bin/sh
sh /root/zk-cluster/zk1/bin/zkServer.sh stop
sh /root/zk-cluster/zk2/bin/zkServer.sh stop
sh /root/zk-cluster/zk3/bin/zkServer.sh stop
```

#### 集群重启脚本

```
zk-cluster-start.sh
#! /bin/sh
sh /root/zk-cluster/zk1/bin/zkServer.sh restart
sh /root/zk-cluster/zk2/bin/zkServer.sh restart
sh /root/zk-cluster/zk3/bin/zkServer.sh restart
```

#### 备注说明

一般而言,如果需要重启zk集群,不要使用集群重启脚本,可以一个一个重启,这样的好处在于zk集群的可用节点过半,zk集群处于可用状态。

如果三个节点中停掉两个节点,此时节点3虽然还是运行在进程中,但是zk集群处于不可用的状态,如果再启动一个节点,使得zk集群中的可用节点过半,那么此时zk集群将由不可用状态转变为可用状态。

生产环境中dubbo服务如果使用zk集群作为注册中心,如果zk集群不可用,此时并不会影响所有的dubbo服务调用(基于dubbo协议的rpc链接为长链接,provider和consumer端在建立长链接之后有心跳机制,心跳的频率大概使1ms,如果6000ms没有数据传输,即没有调用,provider和consumer的长链接将会断开,断开之后consumer如果再想调用provider的服务,会先从zk集群订阅的可用的provider列表,根据负载均衡策略选择一个provider调用,如果此时zk集群处于不可用状态 ,那么将报zk链接异常)

 

### 多机器搭建集群

网上资源很多,和单机版本基本一致,此处自己google

## zoo.cfg详解

 

```shell
# 基本事件单元,以毫秒为单位。这个时间是作为 Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每隔 tickTime时间就会发送一个心跳。
tickTime=2000
# 这个配置项是用来配置 Zookeeper接受客户端初始化连接时最长能忍受多少个心跳时间间隔数,当已经超过 10 个心跳的时间(也就是 tickTime)长度后Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是10*2000=20 秒。
initLimit=10
# 这个配置项标识 Leader 与 Follower之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime的时间长度,总的时间长度就是 5*2000=10 秒
syncLimit=5
# 存储内存中数据库快照的位置,顾名思义就是 Zookeeper保存数据的目录,默认情况下, Zookeeper将写数据的日志文件也保存在这个目录里
dataDir=/home/ebss/zk-cluster/zk1/data
# 这个端口就是客户端连接 Zookeeper 服务器的端口, Zookeeper会监听这个端口,接受客户端的访问请求。
clientPort=7700
# A表示这个是第几号服务器,
# B 是这个服务器的 ip 地址;
# C 表示的是这个服务器与集群中的 Leader服务器交换信息的端口;
# D 表示的是万一集群中的 Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader
server.A= B:C:D
```

 

## 常用命令

略,没有那么长时间,回家吃饭去

## PS

网上大佬写的关于zk方面的东西很多,此仅做个人手记,如有雷同,还请包含

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!