Zookeeper集群搭建(入门基础)

目录

1 概述

1.1 zookeeper的角色

1.2 zookeeper的工作原理

1.3 zookeeper集群节点数是奇数

2 环境准备

3 安装配置

3.1 下载

3.2 解压

3.3 修改配置

3.4 创建myid文件

3.5 启动服务

3.6 搭建问题


1 概述

1.1 zookeeper的角色

zookeeper 集群通常是用来对用户的分布式应用程序提供协调服务的,为了保证数据的一致性,对 zookeeper 集群进行了这样三种角色划分:leader、follower、observer分别对应着总统、议员和观察者。

  • 总统(leader):负责进行投票的发起和决议,更新系统状态。
  • 议员(follower):用于接收客户端请求并向客户端返回结果以及在选举过程中参与投票。
  • 观察者(observer):是针对于查询操作做负载的,observer与follower服务器最大的不同在于observer没有投票权,在客户端发起的增删改操作中,leader服务器是不会把消息传递给observer服务器让其投票的。但是查询操作跟follower一样,客户端的查询到了observer服务器节点,observer服务器去访问leader服务器取最新的数据然后返回给客户端。

 

1.2 zookeeper的工作原理

Zookeeper的核心是原子广播,这个机制保证了各个节点之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者leader节点崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数节点完成了和 leader节点的状态同步以后,恢复模式就结束了。状态同步保证了leader节点和其他节点具有相同的系统状态。

        为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上 了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期,而低32位用于递增计数。

每个Server在工作过程中有三种状态:

  • LOOKING:当前Server不知道leader是谁,正在搜寻
  • LEADING:当前Server即为选举出来的leader
  • FOLLOWING:leader已经选举出来,当前Server与之同步

 

1.3 zookeeper集群节点数是奇数

我们知道,在每台机器数据保持一致的情况下,zookeeper集群可以保证,客户端发起的每次查询操作,集群节点都能返回同样的结果。

  但是对于客户端发起的修改、删除等能改变数据的操作呢?集群中那么多台机器,你修改你的,我修改我的,最后返回集群中哪台机器的数据呢?

  这就是一盘散沙,需要一个领导,于是在zookeeper集群中,leader的作用就体现出来了,只有leader节点才有权利发起修改数据的操作,而follower节点即使接收到了客户端发起的修改操作,也要将其转交给leader来处理,leader接收到修改数据的请求后,会向所有follower广播一条消息,让他们执行某项操作,follower 执行完后,便会向 leader 回复执行完毕。当 leader 收到半数以上的 follower 的确认消息,便会判定该操作执行完毕,然后向所有 follower 广播该操作已经生效。

  所以zookeeper集群中leader是不可缺少的,但是 leader 节点是怎么产生的呢?其实就是由所有follower 节点选举产生的,讲究民主嘛,而且leader节点只能有一个,毕竟一个国家不能有多个总统。

  这个时候回到我们的小标题,为什么 zookeeper 节点数是奇数,我们下面来一一来说明:

  ①、容错率

  首先从容错率来说明:(需要保证集群能够有半数进行投票)

  2台服务器,至少2台正常运行才行(2的半数为1,半数以上最少为2),正常运行1台服务器都不允许挂掉,但是相对于 单节点服务器,2台服务器还有两个单点故障,所以直接排除了。

  3台服务器,至少2台正常运行才行(3的半数为1.5,半数以上最少为2),正常运行可以允许1台服务器挂掉

  4台服务器,至少3台正常运行才行(4的半数为2,半数以上最少为3),正常运行可以允许1台服务器挂掉

  5台服务器,至少3台正常运行才行(5的半数为2.5,半数以上最少为3),正常运行可以允许2台服务器挂掉

  ②、防脑裂

  脑裂集群的脑裂通常是发生在节点之间通信不可达的情况下,集群会分裂成不同的小集群,小集群各自选出自己的leader节点,导致原有的集群出现多个leader节点的情况,这就是脑裂。

  3台服务器,投票选举半数为1.5,一台服务裂开,和另外两台服务器无法通行,这时候2台服务器的集群(2票大于半数1.5票),所以可以选举出leader,而 1 台服务器的集群无法选举。

  4台服务器,投票选举半数为2,可以分成 1,3两个集群或者2,2两个集群,对于 1,3集群,3集群可以选举;对于2,2集群,则不能选择,造成没有leader节点。

  5台服务器,投票选举半数为2.5,可以分成1,4两个集群,或者2,3两集群,这两个集群分别都只能选举一个集群,满足zookeeper集群搭建数目。

  以上分析,我们从容错率以及防止脑裂两方面说明了3台服务器是搭建集群的最少数目,4台发生脑裂时会造成没有leader节点的错误。

注意:此奇数节点并不包括observer节点,observer并不参与投票,只做查询负载。

 

2 环境准备

(1)本次集群的简单搭建用到四台虚拟机,其中1台leader、2台follower和1台observer,1台leader加上2台follower等于3台为奇数,是符合zookeeper集群节点数为奇数的要求的。

myid IP 角色
0 192.168.17.136 leader/follower
1 192.168.17.137 leader/follower
2 192.168.17.139 leader/follower
9 192.168.17.134 observer

(2)需要在这四台虚拟机上都装上JDK1.8,具体安装教程可以查看此处:

https://blog.csdn.net/qq_15092079/article/details/86348464

 

3 安装配置

3.1 下载

官网下载地址:http://mirror.bit.edu.cn/apache/zookeeper/

3.2 解压

# 默认根目录在/usr/zookeeper/
cd /usr/zookeeper/
# 解压
tar -zxvf apache-zookeeper-3.6.0.tar.gz

3.3 修改配置

进入到conf目录,并将zoo_sample.cfg复制一份并命名为zoo.cfg,因为启动zookeeper的时候会默认地读取zoo.cfg配置文件的配置。

同一个zookeeper集群中,每一台zookeeper服务上的配置都该如此。

cd /usr/zookeeper/apache-zookeeper-3.6.0/conf
# 复制
cp zoo_sample.cfg zoo.cfg
# 修改配置
vim zoo.cfg

#### 下面为修改的zoo.cfg配置文件 ####
# 表示服务器之间或客户端与服务器之间心跳的时间间隔,单位为毫秒
tickTime=2000

# follower与leader的初始连接心跳数
initLimit=10

# follower与leader请求和应答的最大心跳数
syncLimit=5

# 数据保存目录
dataDir=/usr/zookeeper/data
# 日志保存目录
dataLogDir=/opt/apache-zookeeper-3.5.5-bin/logs

# 客户端连接端口
clientPort=2181

# 服务器节点配置,格式为:
# server.${myid}=${host}:${节点间的通信端口}:${选举端口}(observer节点最后加上:observer )
server.0=192.168.17.136:2888:3888
server.1=192.168.17.137:2888:3888
server.2=192.168.17.139:2888:3888
server.9=192.168.17.134:2888:3888:observer

# 客户端最大连接数,默认为60个
maxClientCnxns=60
# 默认为false,设置成true,zk将监听所有可用ip地址的连接
quorumListenOnAllIPs=false

 

zookeeper的JVM默认最大内存是1000MB,若想要控制此内存可以在 conf/ 目录下创建java.env文件。

# 打开conf目录
cd /usr/zookeeper/apache-zookeeper-3.6.0/conf/
# 创建java.env文件
vim java.env

### java.env文件内容 ###
#!/bin/sh
# Java环境变量,若已经有了可以不用配置
export JAVA_HOME=/usr/java/jdk1.8.0_181
# heap size MUST be modified according to cluster environment
export JVMFLAGS="-Xms256m -Xmx256m $JVMFLAGS"

 

3.4 创建myid文件

在zoo.cfg配置文件中配置的dataDir目录下,创建myid文件,并写入对应的节点配置,目的是为了标识此zookeeper服务器是哪一台服务器。

比如,我们现在所在的服务器是192.168.17.136,在zoo.cfg配置中dataDir值为 /usr/zookeeper/data,并且服务器节点配置中的192.168.17.136节点的配置是:server.0=192.168.17.136:2888:3888。

# 创建myid文件,并写入值 0
vim /usr/zookeeper/data/myid

### 下面为myid文件内容 ###
0

3.5 启动服务

(1)zookeeper命令如下所示:

cd /usr/zookeeper/apache-zookeeper-3.6.0/bin

# 启动服务
./zkServer.sh start

# 停止服务
./zkServer.sh stop

# 重启服务
./zkServer.sh restart

# 查看服务状态
./zkServer.sh status

(2)分别在这四台服务器上启动服务

(3)分别在这四台服务器上查看服务状态

在192.168.17.139、192.168.17.137和192.168.17.136这三台机器中,192.168.17.139成功被选举称为了leader,而192.168.17.137和192.168.17.136则是follower,至于这一台192.168.17.134不管怎样都是observer。

如果此时我们将192.168.17.139的zookeeper服务关掉,则leader将会在192.168.17.137和192.168.17.136之间选举出现。

3.6 搭建问题

在搭建过程中可能会出现各种各样的问题,都可以在日志中查看:/usr/zookeeper/apache-zookeeper-3.6.0/logs/

不过一般的问题可能都是网络不通的问题,需要自己检查下防火墙端口开放情况。

你可能感兴趣的:(zookeeper)