当前位置:   article > 正文

进阶分布式系统架构系列(三):Zookeeper 部署(单机与集群)实践

zk单机部署

点击下方名片,设为星标

回复“1024”获取2TB学习资源!

前面介绍了 Zookeeper 基础概念应用场景等相关的知识点,今天我将详细的为大家介绍 Zookeeper 安装部署相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!

Zookeeper 有三种部署模式:

  • 单机部署:一台集群上运行;

  • 集群部署:多台集群运行;

  • 伪集群部署:一台集群启动多个 Zookeeper 实例运行。

下面就介绍一下这三种模式的部署过程。

Zookeeper 单机安装

环境准备

zookeeper服务器是用Java创建的,运行在JVM之上。需要安装JDK7以上版本(最好JDK8或以上)。

下载

官网下载地址:https://zookeeper.apache.org/releases.htmlb275ef4ddc17eb219faef4eb5f0b4339.png

上传并安装

下载在本地之后可以把安装包上传到服务器或者虚拟机中,我使用的是服务器并远程shell连接

使用xshell 远程连接服务器,在opt目录下新建一个zookeeper目录2ae16f9a19cad47e65661adf355fa752.png使用xftp将刚才下载的安装包上传到zookeeper目录下d19bc2d2f346b14ac3575c86072be456.png进入zookeeper目录下解压

tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz
1857ea6cc50884d5ff9879f54e56ffd5.png
安装成功
167b38766f466a17b037f7f0b84dc9ac.png
配置

进入conf配置目录530aca2134b46ff91d50a5fe9b1397be.pngzoo_sample.cfg就是配置文件,但是此文件不能生效,需要名称为zoo.cfg的文件才能生效。

改名复制一份配置文件

0ff084278467b5067f189e84f3d99e5a.png编辑配置文件zoo.cfg /tmp/zookeeper这个目录是zookeeper用于存储持久化的数据到本地的,但是服务器默认是没有的。42a66ac232c22ee70b8e7fc871f72e4a.png进入opt/zookeeper目录下,新建一个目录zkdata(目录名随意取)用于存放zookeeper的持久化数据。62e359fcc97998e57d3d2649e86ad201.png复制此目录/opt/zookeeper/zkdata,将zoo.cfg配置文件中的dataDir修改为/opt/zookeeper/zkdata。8f2006cae80e29bb80ac20e143306cbd.png保存退出!

启动zookeeper

058d11766dc6cc6b643eaeae5223b189.png启动成功!

配置文件参数说明
b85c1820665803e67b6b576ed009e115.png

集群部署

伪分布式部署

说明:伪分布即在一台服务器上通过不同端口模拟出分布式集群的效果,分布式一般 3 台起,一主两从。

说明:伪分布安装在了 Windows 开辟的虚拟机上,主机名为 bigdata。

将 zookeeper 安装包 zookeeper-3.4.10.tar.gz 导入 Linux。解压并重命名

  1. [root@bigdata ~]# cd /software/
  2. [root@bigdata software]# tar -zxvf zookeeper-3.4.10.tar.gz -C .
  3. [root@bigdata software]# mv zookeeper-3.4.10 zk
配置环境变量
  1. # /etc/profile
  2. export ZOOKEEPER_HOME=/software/zk
  3. export PATH=.:$PATH:$ZOOKEEPER_HOME/bin

备份及修改 zk 配置文件** zoo_sample.cfg.bak

  1. [root@bigdata software]# cd zk/conf
  2. [root@bigdata conf]# cp zoo_sample.cfg zoo1.cfg
  3. [root@bigdata conf]# vi zoo1.cfg  # 修改该文件,注意一下两点即可,其他按默认即可
  4. # 客户端端口,三个节点需要指定不同端口避免端口冲突
  5. clientPort=2181
  6. # 存放数据的目录,自定义,后边创建
  7. dataDir=/software/zk/data/bigdata1
  8. # 服务器列表及端口,三个节点需要指定不同的端口避免端口冲突
  9. server.1=bigdata:2887:3887
  10. server.2=bigdata:2888:3888
  11. server.3=bigdata:2889:3889
  • 说明1:需要修改或添加的配置项

    • 修改 clientPortdataDir

    • 下边三行是需要添加的,指定各节点信息端口,格式为:

server.id=hostname:port1:port2
参数解释
  1. tickTime:#zk 服务器和客户端会话心跳超时间间隔,单位为毫秒
  2. initLimit:#在 zk follower 和 leader 之间进行数据同步最大超时次数,比如 initLimit = 5 ,tickTime = 2000,则允许最大延迟则为 5 * 2000 = 10000 毫秒
  3. syncLimit:#在 follower 和 leader 之间数据同步和消息发送时,请求和应答不能超过多少个 tickTIme
  4. dataDir:#zk 内部存储数据的磁盘位置,默认情况下 zk 的日志文件也保存在这个目录中。zk 运行期间会将数据存储在内存,保证访问速度
  5. server.x:#zk 的服务器列表,格式如下:server.x = hostname:port1:port2 ,x 为从 1 -N 的数字,说明该节点 zk 集群中的编号,该编号在 myid 中配置,hostname 为当前服务器主机名或 IP,port1 为 follower 和 leader 之间通讯端口,port2 为 leader 失效后选举端口
  6. myid:#在各自的 dataDir 目录中,内容就是当前服务器的编号

zoo1.cfg 配置完后为其他两个节点复制两份,并修改 clientPort 和 dataDir:

  1. [root@bigdata conf]# cp zoo1.cfg zoo2.cfg
  2. [root@bigdata conf]# cp zoo1.cfg zoo3.cfg
  3. [root@bigdata conf]# vi zoo2.cfg
  4. clientPort=2182
  5. dataDir=/software/zk/data/bigdata2
  6. [root@bigdata conf]# vi zoo3.cfg
  7. clientPort=2183
  8. dataDir=/software/zk/data/bigdata3
创建节点数据存放目录及 myid

根据 zoox.cfg 中 dataDir 创建目录

  1. [root@bigdata conf]# mkdir /software/zk/data
  2. [root@bigdata conf]# cd /software/zk/data
  3. [root@bigdata data]# mkdir bigdata1 bigdata2 bigdata3
  4. [root@bigdata data]# vi bigdata1/myid
  5. 1
  6. [root@bigdata data]# vi bigdata2/myid
  7. 2
  8. [root@bigdata data]# vi bigdata3/myid
  9. 3
启动 zk 并查看
  1. # 在 zk/bin 目录下
  2. zkServer.sh start zoo1.cfg
  3. zkServer.sh start zoo2.cfg
  4. zkServer.sh start zoo3.cfg
查看进程
  1. [root@bigdata zk]# jps
  2. 2320 Jps
  3. 2050 QuorumPeerMain
  4. 2008 QuorumPeerMain
  5. 1980 QuorumPeerMain
查看节点状态:一个 leader,两个 follower
  1. [root@bigdata zk]# bin/zkServer.sh status zoo1.cfg
  2. ZooKeeper JMX enabled by default
  3. Using config: /software/zk/bin/../conf/zoo1.cfg
  4. Mode: follower
  5. [root@bigdata zk]# bin/zkServer.sh status zoo2.cfg
  6. ZooKeeper JMX enabled by default
  7. Using config: /software/zk/bin/../conf/zoo2.cfg
  8. Mode: leader
  9. [root@bigdata zk]# bin/zkServer.sh status zoo3.cfg
  10. ZooKeeper JMX enabled by default
  11. Using config: /software/zk/bin/../conf/zoo3.cfg
  12. Mode: follower

根据 zk 选举机制,一共 3 台,当第二台启动后就会根据 serverid 选举出 myid 大的作为 leader,myid 小的和第三台作为 follower。

图示:340117068d1e9531a6d8d317d0a5dd70.png

分布式集群安装
上传解压名命名
  1. # 将zookeeper解压后文件夹重命名为zk
  2. mv zookeeper-3.4.10.tar.gz /software
  3. tar -zxvf zookeeper-3.4.10.tar.gz
  4. mv zookeeper-3.4.10 zk
配置环境变量
  1. export ZOOKEEPER_HOME=/software/zk
  2. export PATH=.:$PATH:$ZOOKEEPER_HOME/bin
  3. # 配置完source一下,使其生效:
  4. source /etc/profile
修改配置文件
  1. cd /software/zk/conf
  2. mv zoo_sample.cfg zoo.cfg
  3. vi zoo.cfg
  4. # 在 /software/zk/ 下创建zk的数据存放目录data,并配置到此
  5. dataDir=/software/zk/data
  6. # 在最后添加上以下内容,其中2888是通讯端口,3888是选举端口
  7. server.0=hadoop0:2888:3888
  8. server.1=hadoop1:2888:3888
  9. server.2=hadoop2:2888:3888
配置 myid
  1. mkdir /software/zk/data
  2. cd /software/zk/data
  3. vi myid
  4. # 把 0 写到该文件的最上边,Hadoop1的就写1,Hadoop2的就写2
复制到其他节点上
  • 若 zk 在之前就安装好了,只需修改配置文件和创建 ZooKeeper 的数据存放目录

环境变量的赋值
  • 按 serverID 命名须知,修改 /etc/myid 里的数值(myid 就是 serverID,0~255)

关闭防火墙和 selinux
  1. # 查看防火墙状态
  2. systemctl status firewalld.service
  3. # 停止防火墙命令
  4. systemctl stop firewalld
  5. # 开机禁止启动命令
  6. systemctl disable firewalld
  7. # 查看selinux状态,非 disabled 则需要禁用
  8. sestatus
  9. # 修改selinux配置文件
  10. vi /etc/selinux/config
  11. sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
  12. # 然后重启机器
  13. reboot
启动测试

分别在三台机器下启动

  1. cd /software/zk/bin  # 配置了zk的环境变量可以不切到该目录,在任意目录执行start都可以
  2. zkServer.sh start
  3. # 查看服务器的各个角色:
  4. zkServer.sh status
  5. 有Follower、Leader等等

说明:

  • leader 不一定是在第一个节点上面,是由 Zookeeper 内部的选举机制产生的

  • QuorumPeerMain 进程是 ZooKeeper 的进程名字

集群中有哪些角色?

在一个集群中,最少需要 3 台。或者保证 2N + 1 台,即奇数。为什么保证奇数?主要是为了举算法。6c5ed204a1d8ff56dc7a37773086eb3e.png

Zookeeper集群中是怎样选举leader的?

流程:开始投票 -> 节点状态变成 LOOKING -> 每个节点选自己-> 收到票进行 PK -> sid 大的获胜 -> 更新选票 -> 再次投票 -> 统计选票,选票过半数选举结果 -> 节点状态更新为自己的角色状态。

当Leader崩溃了,或者失去了大多数的Follower,这时候 Zookeeper 就进入恢复模式,恢复模式需要重新选举出一个新的Leader,让所有的Server都恢复到一个状态LOOKING 。Zookeeper 有两种选举算法:基于 basic paxos 实现和基于 fast paxos 实现。

Zookeeper 是如何保证事务的顺序一致性的呢?

Zookeeper 采用了递增的事务 id 来识别,所有的 proposal (提议)都在被提出的时候加上了zxid 。zxid 实际上是一个 64 位数字。高 32 位是 epoch 用来标识 Leader 是否发生了改变,如果有新的Leader 产生出来, epoch 会自增。低 32 位用来递增计数。当新产生的 proposal 的时候,会依据数据库的两阶段过程,首先会向其他的 Server 发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。

ZooKeeper集群中个服务器之间是怎样通信的?

Leader 服务器会和每一个 Follower/Observer 服务器都建立 TCP 连接,同时为每个Follower/Observer 都创建一个叫做 LearnerHandler 的实体。LearnerHandler 主要负责 Leader 和Follower/Observer 之间的网络通讯,包括数据同步,请求转发和 proposal 提议的投票等。Leader 服务器保存了所有 Follower/Observer 的 LearnerHandler 。

参考文章:https://blog.csdn.net/weixin_45579026/article

/details/131080333  https://blog.csdn.net/qq_52595134/

article/details/123467180

读者专属技术群

构建高质量的技术交流社群,欢迎从事后端开发、运维技术进群(备注岗位,已在技术交流群的请勿重复添加)。主要以技术交流、内推、行业探讨为主,请文明发言。广告人士勿入,切勿轻信私聊,防止被骗。

扫码加我好友,拉你进群

55b1d97fdabff88b149a5c1311748168.jpeg

推荐阅读 点击标题可跳转

北京西二旗和上海张江程序员的终极悲惨宿命。。。

操作系统政府采购标准出台!Windows 将逐步出局

扔掉笨重的 ELK!来试试这套 Nginx 日志解决方案

又一知名平台宣布:正式关停!

Git不能只会pull和push,学学这5条提高效率的命令

面试官:如何构建自定义的 Docker 镜像?问倒一大片

9e7be8b4fc2b37c6924d73405e76cc31.png

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下在看,加个星标,这样每次新文章推送才会第一时间出现在你的订阅列表里。点在看支持我们吧!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/724491
推荐阅读
相关标签
  

闽ICP备14008679号