Zookeeper 集群搭建

文章目录

  • [Zookeeper 集群搭建](#Zookeeper 集群搭建)
    • [一. 简介](#一. 简介)
    • [二. 环境准备](#二. 环境准备)
    • [三. 安装 zookeeper](#三. 安装 zookeeper)
      • [3.1 下载 zookeeper](#3.1 下载 zookeeper)
      • [3.2 安装 jdk 解压 zookeeper](#3.2 安装 jdk 解压 zookeeper)
    • [四. 配置集群](#四. 配置集群)
      • [4.1 配置 zookeeper 服务器文件](#4.1 配置 zookeeper 服务器文件)
      • [4.2 修改配置文件](#4.2 修改配置文件)
      • [4.3 创建配置文件 myid](#4.3 创建配置文件 myid)
      • [4.4 启动 zookeeper](#4.4 启动 zookeeper)

Zookeeper 集群搭建

一. 简介

本次搭建使用一台机器,区别不同的启动端口及启动文件路径搭建 zookeeper 集群(伪集群),正常是使用三台及以上的奇数台服务器搭建集群。

官网参考地址:https://zookeeper.apache.org/doc/current/zookeeperAdmin.html

这里就有一个问题,为什么是需要奇数个服务器。

  • 注:为什么规则要求 可用节点数量 > 集群总结点数量/2 ?

  • 如果不这样限制,在集群出现脑裂的时候,可能会出现多个子集群同时服务的情况(即子集群各组选举出自己的 leader ), 这样对整个 zookeeper 集群来说是紊乱的。换句话说,如果遵守上述规则进行选举,即使出现脑裂,集群最多也只能回出现一个子集群可以提供服务的情况( 能满足节点数量> 总结点数量/2 的子集群最多只会有一个)。所以要限制 可用节点数量 > 集群总结点数量/2 。

    注:这里有个疑问,为什么脑裂之后 能满足节点数量> 总结点数量/2 这里为什么是集群总结点的数量,而不是脑裂之后小集群的数量?

采用奇数个的节点主要是出于两方面的考虑:

1️⃣ 防止由脑裂造成的集群不可用

可参考: HA高可用集群中"脑裂"问题解决

https://blog.csdn.net/u010476994/article/details/79806041

❓ 什么是脑裂?

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

  • 下面举例说一下为什么采用奇数台节点,就可以防止由于脑裂造成的服务不可用:

(1) 假如zookeeper集群有 5 个节点,发生了脑裂,脑裂成了A、B两个小集群:

 (a) A : 1个节点 ,B :4个节点 

 (b) A : 2个节点, B :3个节点  

可以看出,上面这两种情况下,A、B中总会有一个小集群满足 可用节点数量 > 总节点数量/2 。所以zookeeper集群仍然能够选举出leader , 仍然能对外提供服务,只不过是有一部分节点失效了而已。

(2) 假如zookeeper集群有4个节点,同样发生脑裂,脑裂成了A、B两个小集群:

(a) A:1个节点 ,  B:3个节点 

(b) A:2个节点 , B:2个节点

可以看出,情况(a) 是满足选举条件的,与(1)中的例子相同。 但是情况(b) 就不同了,因为A和B都是2个节点,都不满足 可用节点数量 > 总节点数量/2 的选举条件, 所以此时zookeeper就彻底不能提供服务了。

综合上面两个例子可以看出: 在节点数量是奇数个的情况下, zookeeper集群总能对外提供服务(即使损失了一部分节点);如果节点数量是偶数个,会存在zookeeper集群不能用的可能性(脑裂成两个均等的子集群的时候)。

在生产环境中,如果zookeeper集群不能提供服务,那将是致命的 , 所以zookeeper集群的节点数一般采用奇数个。

2️⃣ 在容错能力相同的情况下,奇数台更节省资源。

leader选举,要求 可用节点数量 > 总节点数量/2 。注意 是 > , 不是 ≥。

举两个例子:

(1) 假如zookeeper集群1 ,有3个节点,3/2=1.5 , 即zookeeper想要正常对外提供服务(即leader选举成功),至少需要2个节点是正常的。换句话说,3个节点的zookeeper集群,允许有一个节点宕机。

(2) 假如zookeeper集群2,有4个节点,4/2=2 , 即zookeeper想要正常对外提供服务(即leader选举成功),至少需要3个节点是正常的。换句话说,4个节点的zookeeper集群,也允许有一个节点宕机。

那么问题就来了, 集群1与集群2都有 允许1个节点宕机 的容错能力,但是集群2比集群1多了1个节点。在相同容错能力的情况下,本着节约资源的原则,zookeeper集群的节点数维持奇数个更好一些。

二. 环境准备

主机 配置文件路径 端口
172.26.235.140 /opt/zookeeper2181 2181
172.26.235.140 /opt/zookeeper2182 2182
172.26.235.140 /opt/zookeeper2183 2183

三. 安装 zookeeper

3.1 下载 zookeeper

官网下载:https://zookeeper.apache.org/releases.html

3.2 安装 jdk 解压 zookeeper

因为 zookeeper 依赖于 java 环境,所以要提前配置好 java 环境

  • 解压 jdk
shell 复制代码
tar -zxvf jdk-8u161-linux-x64.tar.gz
  • 修改 /etc/profile 文件
shell 复制代码
# 在文件最后添加如下内容
JAVA_HOME=/opt/jdk1.8     # 安装路径
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
  • 解压 zookeeper
shell 复制代码
tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz -C /opt

# 解压完成查看常用目录结构
bin		用来存放脚本
conf	用来存放配置文件
  • 修改 conf 中的配置文件

注:如果解压完成直接启动 zookeeper 那么则会提示如下内容,所以我们要去 conf 中修改配置文件

shell 复制代码
[root@master]# cd /opt/apache-zookeeper-3.8.0-bin
[root@master bin]# sh zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfg
grep: /opt/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfg: 没有那个文件或目录
grep: /opt/apache-zookeeper-3.8.0-bin/bin/../conf/zoo.cfg: 没有那个文件或目录
mkdir: 无法创建目录"": 没有那个文件或目录
Usage: zkServer.sh [--config <conf-dir>] {start|start-foreground|stop|version|restart|status|print-cmd}

进入 conf 文件中可以看到并没有 zoo.cfg 文件,但是有一个 zoo_sample.cfg 的模板文件

shell 复制代码
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
# zookeeper 时间配置中的基本单位(毫秒)
tickTime=2000
# 允许 follower 初始化连接到 leader 最大时长(秒),他表示 tickTime 时间倍数,即:initLimit*tickTime
initLimit=10
# 允许 follower 与 leader 数据同步最大时长(秒),他表示 tickTime 时间倍数
syncLimit=5
# zookeeper 数据存储目录及日志保存目录(如没有指明 dataLogDir,则日志也保存到这个文件中)
dataDir=/tmp/zookeeper
# 对客户端提供的端口
clientPort=2181
# 单个客户端与 zookeeper 最大并发连接数
maxClientCnxns=60
# 保存的数据快照数量,之外的会被清除
autopurge.snapRetainCount=3
# 自动触发清除任务的时间间隔,小时为单位,默认为0,表示不清除
autopurge.purgeInterval=1

四. 配置集群

单机环境下,jdk、zookeeper 安装完毕,基于一台虚拟机,进行 zookeeper 伪集群搭建,zookeeper 集群中包含3个节点,节点对外提供服务端口号分别为 2181,2182,2183

4.1 配置 zookeeper 服务器文件

基于 apache-zookeeper-3.8.0-bin 复制三分 zookeeper 安装好的服务器文件,目录名称分别为 zookeeper2181、zookeeper2182、zookeeper2183

shell 复制代码
mv /opt/apache-zookeeper-3.8.0-bin /opt/zookeeper2181
cp -r /opt/zookeeper2181 /opt/zookeeper2182
cp -r /opt/zookeeper2181 /opt/zookeeper2183

4.2 修改配置文件

修改 /opt/zookeeper218*/conf 配置文件

shell 复制代码
# zookeeper 数据存储目录及日志保存目录(如没有指明 dataLogDir,则日志也保存到这个文件中)
dataDir=/opt/zookeeper2181
# 对客户端提供的端口
clientPort=2181

# 集群配置信息
	# server.A=B:C:D
	# A:是一个数字,表示这个是服务器的编号
	# B:是这个服务器的ip地址
	# C:Zookeeper服务器之间的通信端口号
	# D:Leader选举的端口
	# 注:因为这里是伪集群(IP 地址是相同的),所以 C 和 D 是不同的,如果是不同的服务器,这里一般是相同的,示例:
		# server.1=172.26.235.140:2288:3388
		# server.2=172.26.235.141:2288:3388
		# server.3=172.26.235.142:2288:3388
	
server.1=172.26.235.140:2287:3387
server.2=172.26.235.140:2288:3388
server.3=172.26.235.140:2289:3389

4.3 创建配置文件 myid

在上一步dataDir指定的目录下,创建myid文件,然后在该文件添加上一步server配置对应A数字。

shell 复制代码
# zookeeper2181对应的数字为1
echo "1" > /opt/zookeeper2181

# zookeeper2182对应的数字为2
echo "2" > /opt/zookeeper2182

# zookeeper2183对应的数字为3
echo "3" > /opt/zookeeper2183

4.4 启动 zookeeper

shell 复制代码
[root@aliyun ~]# cd /opt/zookeeper2181/bin

[root@aliyun bin]# ./zkServer.sh start
或者指定启动配置文件
[root@aliyun bin]# ./zkServer.sh start ../conf/zoo.cfg


其他两台同样的启动方式
相关推荐
传而习乎8 分钟前
Linux:CentOS 7 解压 7zip 压缩的文件
linux·运维·centos
我们的五年18 分钟前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
IT果果日记39 分钟前
ubuntu 安装 conda
linux·ubuntu·conda
Python私教42 分钟前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
羑悻的小杀马特1 小时前
环境变量简介
linux
小陈phd1 小时前
Vscode LinuxC++环境配置
linux·c++·vscode
运维&陈同学2 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
是阿建吖!2 小时前
【Linux】进程状态
linux·运维
明明跟你说过2 小时前
Linux中的【tcpdump】:深入介绍与实战使用
linux·运维·测试工具·tcpdump
Komorebi.py3 小时前
【Linux】-学习笔记05
linux·笔记·学习