1+X云计算运维与开发(中级)实战案例——ZooKeeper集群部署

前言

ZooKeeper是一个开源的分布式协调服务,在分布式系统中用于管理和协调各种任务和服务。它提供了一个简单的分层命名空间和高效的观察(Watch)机制,用于实现分布式系统中的数据发布/订阅、配置管理、分布式锁、分布式队列等功能。在构建和管理大规模分布式系统时,是一个非常有用的工具和平台。

如果你是初学者,那么我之前发布的文章对一些简单操作有详细讲解,你可以从中入手,本文对之前讲过的操作不会详细说明。

虚拟机使用的是考试提供的xnode1、xnode2、xnode3
各节点规划如下:

虚拟机IP/24主机名节点
xnode1192.168.200.11zookeeper1zookeeper集群节点
xnode2192.168.200.12zookeeper2zookeeper集群节点
xnode3192.168.200.13zookeeper3zookeeper集群节点

操作过程

就实验而言,在这个实验中,每台机子操作要打的命令有很多都是一样的,推荐使用XShell进行远程控制,可以同时操作多个终端。多条一样的命令打一次就够了,节省时间。
功能打开方式:
在这里插入图片描述
所有选项卡都开启了功能就都会接收到输入
在这里插入图片描述
如果只需要操作部分会话,可以关闭对应选项卡的功能
在这里插入图片描述

关闭防火墙和Selinux

#三个节点均关闭防火墙并禁止其开机自启
[root@xnode1 ~]# systemctl stop firewalld && systemctl disable firewalld
[root@xnode2 ~]# systemctl stop firewalld && systemctl disable firewalld
[root@xnode3 ~]# systemctl stop firewalld && systemctl disable firewalld
#临时关闭Selinux
[root@xnode1 ~]# setenforce 0
[root@xnode2 ~]# setenforce 0
[root@xnode3 ~]# setenforce 0

更改主机名

#三个节点更改主机名,xnode1--zookeeper1、xnode2--zookeeper2、xnode3--zookeeper3
[root@xnode1 ~]# hostnamectl set-hostname zookeeper1
[root@xnode1 ~]# bash
[root@zookeeper1 ~]# 

[root@xnode2 ~]# hostnamectl set-hostname zookeeper2
[root@xnode2 ~]# bash
[root@zookeeper2 ~]# 

[root@xnode3 ~]# hostnamectl set-hostname zookeeper3
[root@xnode3 ~]# bash
[root@zookeeper3 ~]# 

配置主机映射

#三台都要配置
#zookeeper1/2/3:
cat >> /etc/hosts << EOF
> 192.168.200.11 zookeeper1
> 192.168.200.12 zookeeper2
> 192.168.200.13 zookeeper3
> EOF
#另外两台机子同样操作
#如果用Xshell就一步到位。也可以用我之前文章用到的scp传过去,又或者直接过去对应机子vi进去配

配置YUM源仓库

#这里只需要配zookeeper1,如果你使用的是XShell,请关闭xnode1的发送全部会话功能
#创建挂载目录
[root@zookeeper1 ~]# mkdir /opt/centos
#挂载
[root@zookeeper1 ~]# mount -o loop CentOS-7-x86_64-DVD-1511.iso /mnt/	
mount: /dev/loop2 is write-protected, mounting read-only					
[root@zookeeper1 ~]# cp -rvf /mnt/* /opt/centos																
[root@zookeeper1 ~]# umount /mnt/		
#将处于主目录的gpmall-repo移动到/opt目录
[root@zookeeper1 ~]# mv gpmall-repo /opt/gpmall-repo
#删除系统自带的默认源
[root@zookeeper1 ~]# rm -rf /etc/yum.repos.d/*
#创建新的仓库文件	
[root@zookeeper1 ~]# vi /etc/yum.repos.d/local.repo    
[centos]
name=centos
baseurl=file:///opt/centos
enabled=1
gpgcheck=0
[gpmall]
name=gpmall
baseurl=file:///opt/gpmall-repo
enabled=1
gpgcheck=0
#检查可用性,查出3888个包就没问题
[root@zookeeper1 ~]# yum clean all && yum repolist
#xnode2和xnode3是没有CentOS的系统镜像的,所以我们在xnode1安装ftp服务,让它们通过ftp服务使用xnode1的软件仓库
#安装ftp服务
[root@mycat ~]# yum -y install vsftpd
...
Complete!
#修改ftp服务的配置文件,共享/opt目录(这也是为什么前面要移动gpmall-repo位置的原因)
[root@mycat ~]# echo "anon_root=/opt" >> /etc/vsftpd/vsftpd.conf   
#启动ftp服务并设置开机自启
[root@mycat ~]# systemctl start vsftpd && systemctl enable vsftpd
...
#zookeeper2和zookeeper3删除系统默认源,只演示zookeeper2的步骤,和zookeeper3的操作是一模一样的
#是Xshell操作就可以通过关闭xnode1会话的发送全部会话功能,在xnode2会话操作以下内容,xnode3会接收到相同输入
[root@zookeeper2 ~]# rm -rf /etc/yum.repos.d/*
#zookeeper创建新的仓库文件
[root@zookeeper2 ~]# vi /etc/yum.repos.d/local.repo
[centos]
name=centos
baseurl=ftp://zookeeper1/centos
enabled=1
gpgcheck=0
[gpmall]
name=gpmall
baseurl=ftp://zookeeper1/gpmall-repo
enabled=1
gpgcheck=0
#检查可用性,3888个包就没问题
[root@zookeeper2 ~]# yum clean all && yum repolist

安装JDK环境

#3个节点安装Java JDK环境
#zookeeper1/2/3:
yum install -y java-1.8*

#同样可以看一下版本
[root@zookeeper1 ~]# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

安装配置ZooKeeper

#xnode2和xnode3没有zookeeper的软件压缩包,需要从xnode1搞过去
#可以使用远程连接软件的传输功能,也可以用scp命令
[root@zookeeper1 ~]# scp zookeeper-3.4.14.tar.gz root@zookeeper2:/root/zookeeper-3.4.14.tar.gz 
...
Are you sure you want to continue connecting (yes/no)? yes
...
root@zookeeper2's password: #输入密码
zookeeper-3.4.14.tar.gz                                                 100%   36MB  35.9MB/s   00:01    
[root@zookeeper1 ~]# scp zookeeper-3.4.14.tar.gz root@zookeeper3:/root/zookeeper-3.4.14.tar.gz 
#同理

#解压Zookeeper软件压缩包
#zookeeper1/2/3:
tar -zxf zookeeper-3.4.14.tar.gz 
#切换至Zookeeper的conf目录
cd zookeeper-3.4.14/conf
#修改示例文件的名称为zoo.cfg,这样就变成了实际的配置文件
mv zoo_sample.cfg zoo.cfg
#在配置文件末尾添加三行配置,指定集群服务器节点信息
cat >> zoo.cfg << EOF
> server.1=192.168.200.11:2888:3888
> server.2=192.168.200.12:2888:3888
> server.3=192.168.200.13:2888:3888
> EOF
#修改后文件内容如下
[root@zookeeper1 conf]# grep -n '^'[a-Z] zoo.cfg 
2:tickTime=2000
5:initLimit=10
8:syncLimit=5
12:dataDir=/tmp/zookeeper
14:clientPort=2181
29:server.1=192.168.200.11:2888:3888
30:server.2=192.168.200.12:2888:3888
31:server.3=192.168.200.13:2888:3888
#initLimit:ZooKeeper集群模式下包含多个zk进程,其中一个进程为leader,余下的进程为follower。当follower最初与leader建立连接时,它们之间会传输相当多的数据,尤其是follower的数据落后leader很多。initLimit配置follower与leader之间建立连接后进行同步的最长时间。
#syncLimit:配置follower和leader之间发送消息,请求和应答的最大时间长度。
#tickTime:它是上述两个超时配置的基本单位,例如对于initLimit,其配置值为5,说明其超时时间为 2000ms * 5 = 10秒。
#server.id=host:port1:port2:其中id为一个数字,表示zk进程的id,这个id也是dataDir目录下myid文件的内容。host是该zk进程所在的IP地址,port1表示follower和leader交换消息所使用的端口,port2表示选举leader所使用的端口。
#dataDir:其配置的含义跟单机模式下的含义类似,不同的是集群模式下还有一个myid文件。myid文件的内容只有一行,且内容只能为1 - 255之间的数字,这个数字亦即上面介绍server.id中的id,表示zk进程的id。

#创建myid文件,ZooKeeper会根据该文件决定ZooKeeper集群各个机器的身份分配
#三个节点先创建好目录
mkdir /tmp/zookeeper
#zookeeper1在目录下创建myid并写入内容1
[root@zookeeper1 conf]# echo '1' > /tmp/zookeeper/myid
#另外两台机分别是2和3,这些数字就是上面zoo.cfg配置文件中指定的值
[root@zookeeper2 conf]# echo '2' > /tmp/zookeeper/myid
[root@zookeeper3 conf]# echo '3' > /tmp/zookeeper/myid

启动ZooKeeper服务

#三个节点均切换至zookeeper的bin目录
#zookeeper1/2/3:
cd ../bin/
#启动服务
[root@zookeeper1 bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
#查看服务状态
[root@zookeeper1 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower
[root@zookeeper2 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: leader
[root@zookeeper3 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower
#可以看到,zookeeper2是leader,其余两台是follower

结语

Leader主要有3个功能:

  1. 恢复数据;
  2. 维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型
  3. Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理

PING消息是指Learner的心跳信息;REQUEST消息是Follower发送的提议信息,包括写请求及同步请求;ACK消息是Follower的对提议的回复,超过半数的Follower通过,则commit该提议;REVALIDATE消息是用来延长SESSION有效时间。

Follower主要有4个功能:

  1. 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息)
  2. 接收Leader消息并进行处理
  3. 接收Client的请求,如果为写请求,发送给Leader进行投票
  4. 返回Client结果

Follower的消息循环处理如下几种来自Leader的消息:

  1. PING消息:心跳消息;
  2. PROPOSAL消息:Leader发起的提案,要求Follower投票;
  3. COMMIT消息:服务器端最新一次提案的信息;
  4. UPTODATE消息:表明同步完成;
  5. REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待REVALIDATE的SESSION 还是允许其接受消息;
  6. SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新
  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值