0


项目练习:ZooKeeper集群部署

文章目录


前言

根据项目练习开始搭建ZooKeeper,希望能帮到你

本次项目目标:

  1. 了解ZooKeeper分布式应用程序协调服务。
  2. 使用3台机器搭建ZooKeeper集群。
  3. 使用ZooKeeper集群。

项目准备

镜像

  1. Linux-CentOS7

软件

  1. VMware Workstation 15.5 Pro
  2. MobaXterm_Personal_22.0

软件包

  1. zookeeper-3.4.14.tar.gz
  2. gpmall-repo

主机配置

  1. 2vCPU/4GB内存/50GB硬盘

节点规划

  1. (见下表)

IP主机名节点172.16.51.23zookeeper1集群节点172.16.51.32zookeeper2集群节点172.16.51.41zookeeper3集群节点

  1. 提示:以下是本篇文章正文内容,下面案例可供参考

一、关于Zookeeper


ZooKeeper

1.ZooKeeper简介

  1. ZooKeeper 是一种分布式同步协调服务与集中式组管理服务,用于管理大型场合。

2.ZooKeeper目录

  1. [root@zookeeper3 zookeeper-3.4.14]# ls -l | grep ^d #只显示文件夹
  2. drwxr-xr-x. 2 2002 2002 223 Sep 21 06:52 bin
  3. drwxr-xr-x. 2 2002 2002 70 Sep 21 06:46 conf
  4. drwxr-xr-x. 2 2002 2002 4096 Mar 6 2019 dist-maven
  5. drwxr-xr-x. 4 2002 2002 4096 Mar 6 2019 lib
  6. drwxr-xr-x. 3 2002 2002 22 Mar 6 2019 src
  7. drwxr-xr-x. 3 2002 2002 47 Mar 6 2019 zookeeper-client
  8. drwxr-xr-x. 12 2002 2002 4096 Mar 6 2019 zookeeper-contrib
  9. drwxr-xr-x. 7 2002 2002 4096 Mar 6 2019 zookeeper-docs
  10. drwxr-xr-x. 3 2002 2002 35 Mar 6 2019 zookeeper-it
  11. drwxr-xr-x. 4 2002 2002 46 Mar 6 2019 zookeeper-jute
  12. drwxr-xr-x. 5 2002 2002 176 Mar 6 2019 zookeeper-recipes
  13. drwxr-xr-x. 3 2002 2002 32 Mar 6 2019 zookeeper-server

  • bin:放置运行脚本与工具脚本(如果是Linux,还有运行日志zookeeper.out文件)
  • conf:zookeeper配置文件
  • zookeeper-docs:zookeeper相关文档

3.ZooKeeper集群角色

(图片来源于网络,侵删)

  • Leader: ZooKeeper 集群工作的核心 事务请求(写操作)的唯一调度和处理者,保证集群事务处理的顺序性;集群内部各个服务的调度者。 对于 create,setData,delete 等有写操作的请求,则需要统一转发给 leader 处理,leader 需要决定编号、执行操作,这个过程称为一个事务。

  • Follower: 处理客户端非事务(读操作)请求 转发事务请求给 Leader 参与集群 leader 选举投票2n-1台可以做集群投票 此外,针对访问量比较大的 zookeeper 集群,还可以新增观察者角色

  • Observer: 观察者角色,观察ZooKeeper集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给Leader服务器处理 不会参与任何形式的投票只提供服务,通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力 扯淡:说白了就是增加并发的请求。

4.ZooKeeper的作用

  1. ZooKeeper主要用于分布式应用管理,他可以做到:统一配置管理、统一命名服务、分布式锁、集群管理。

二、使用步骤

1.基础配置

  • 改名

zookeeper1:

  1. [root@localhost ~]# hostnamectl set-hostname zookeeper1
  2. [root@localhost ~]# su
  3. su
  4. [root@zookeeper1 ~]#

zookeeper2:

  1. [root@localhost ~]# hostnamectl set-hostname zookeeper2
  2. [root@localhost ~]# su
  3. su
  4. [root@zookeeper2 ~]#

zookeeper3:

  1. [root@localhost ~]# hostnamectl set-hostname zookeeper3
  2. [root@localhost ~]# su
  3. su
  4. [root@zookeeper3 ~]#
  • 配置网卡(主要信息)

zookeeper1:

  1. [root@zookeeper1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
  2. {
  3. BOOTPROTO=static
  4. ONBOOT=yes
  5. IPADDR=172.16.51.23
  6. NETMASK=255.255.255.0
  7. GATEWAY=172.16.51.254
  8. DNS1=223.5.5.5 #阿里免费公共DNS
  9. }
  10. [root@zookeeper1 ~]# systemctl restart network #重启网卡

zookeeper2:

  1. [root@zookeeper2 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
  2. {
  3. BOOTPROTO=static
  4. ONBOOT=yes
  5. IPADDR=172.16.51.32
  6. NETMASK255.255.255.0
  7. GATEWAY=172.16.51.254
  8. DNS1=223.5.5.5
  9. }
  10. [root@zookeeper2 ~]# systemctl restart network

zookeeper3:

  1. [root@zookeeper3 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
  2. {
  3. BOOTPROTO=static
  4. ONBOOT=yes
  5. IPADDR=172.16.51.41
  6. NETMASK=255.255.255.0
  7. GATEWAY=172.16.51.254
  8. DNS1=223.5.5.5
  9. }
  10. [root@zookeeper3 ~]# systemctl restart network
  • 配置hosts文件(3个节点都要)

zookeeper1/2/3:

  1. [root@zookeeper1/2/3 ~]# vi /etc/hosts #修改hosts配置文件
  2. {
  3. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  4. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  5. 172.16.51.23 zookeeper1
  6. 172.16.51.32 zookeeper2
  7. 172.16.51.41 zookeeper3
  8. }
  • 配置yum源(三个节点都要)

zookeeper1/2/3:

  1. [root@zookeeper1/2/3 ~]# mv /etc/yum.repos.d/* /media/ #备份源
  2. #将gpmall-repo包上传到虚拟机/opt/目录下#
  3. [root@zookeeper1/2/3 ~]# vi /etc/yum.repos.d/local.repo
  4. {
  5. [gpmall]
  6. name=gpmall
  7. baseurl=file:///opt/gpmall-repo
  8. enabled=1
  9. gpgcheck=0
  10. }
  11. [root@zookeeper1/2/3 ~]# yum clean all #清除yum缓存

2.项目实施

  • 搭建JDK环境(三个节点都要)

  1. [root@zookeeper1/2/3 ~]# yum -y install java* #具体版本为“java-1.8.0-openjdk java-1.8.0-openjdk-devel”
  2. Complete! #完成安装JDK环境)
  3. [root@zookeeper1/2/3 ~]# java -version #检查是否成功安装JDK环境
  4. openjdk version "1.8.0_262"
  5. OpenJDK Runtime Environment (build 1.8.0_262-b10)
  6. OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
  • 解压ZooKeeper的gz软件包(三个节点都要)

  1. #先将zookeeper-3.4.14.tar.gz软件包上传至root用户家目录下
  2. [root@zookeeper1/2/3 ~]# tar -zxvf zookeeper-3.4.14.tar.gz #解压.tar.gz包命令
  • 修改zookeeper配置文件(三个节点都要)

  1. [root@zookeeper1/2/3 ~]# cd zookeeper-3.4.14/conf/ #进入zokeeper的配置目录
  2. [root@zookeeper1/2/3 conf]# ls
  3. configuration.xsl log4j.properties zoo_sample.cfg
  4. [root@zookeeper1/2/3 conf]# mv zoo_sample.cfg zoo.cfg #zoo.cfg是zookeeper启动文件
  5. [root@zookeeper1/2/3 conf]# ls
  6. configuration.xsl log4j.properties zoo.cfg
  7. [root@zookeeper1/2/3 conf]# vi zoo.cfg #此处十分重要,不能出错!!!
  8. { :set nu #末行模式显示行数
  9. 2:tickTime=2000
  10. 5:initLimit=10
  11. 8:syncLimit=5
  12. 12:dataDir=/tmp/zookeeper
  13. 14:clientPort=2181
  14. 29:server.1=172.16.51.23:2888:3888 #29-31行上下不要有空行
  15. 30:server.2=172.16.51.32:2888:3888 #server1.2.3分别对应三个节点,请不要弄错
  16. 31:server.3=172.16.51.41:2888:3888 #2888端口用于集群内机器互相通讯,3888端口用来选举leader
  17. }

知识点:

  • tickTime :用于做心跳,是zookeeper的基本时间单位(毫秒)。

  • initLimit:用于限制仲裁中的ZooKeeper服务器必须连接到领导者的时间长度。

    1. ZooKeeper集群模式下包含多个zk进程,其中一个进程为leader,余下的进程为follower。当follower最初与leader建立连接时,它们之间会传输相当多的数据,尤其是follower的数据落后leader很多。initLimit配置followerleader之间建立连接后进行同步的最长时间。
  • syscLimit:配置follower和leader之间发送消息,请求和应答的最大时间长度。

  • dataDir:存储内存数据库快照的位置,除非另有说明,否则存储数据库更新的事务日志。

  • dataLogDir:用于存储日志,若不指定日志将和快照都存放到dataDir 中

  • clientPort:用于侦听客户端连接的端口

  • server.id=host:port1:port2:其中id为一个数字,表示zk进程的id,这个id也是dataDir目录下myid文件的内容。host是该zk进程所在的IP地址,port1表示follower和leader交换消息所使用的端口,port2表示选举leader所使用的端口。

  • 创建myid文件

zookeeper1:

  1. [root@zookeeper1 conf]# mkdir /tmp/zookeeper
  2. [root@zookeeper1 conf]# vi /tmp/zookeeper/myid
  3. {
  4. 1 #与zoo.cfg的server.1对应
  5. }

zookeeper2:

  1. [root@zookeeper2 conf]# mkdir /tmp/zookeeper
  2. [root@zookeeper2 conf]# vi /tmp/zookeeper/myid
  3. {
  4. 2 #与zoo.cfg中的server.2对应
  5. }

zookeeper3:

  1. [root@zookeeper3 conf]# mkdir /tmp/zookeeper
  2. [root@zookeeper3 conf]# vi /tmp/zookeeper/myid
  3. {
  4. 3 #与zoo.cfg的server.3对应
  5. }
  • 启动ZooKeeper服务

zookeeper1:

  1. [root@zookeeper1 conf]# cd ~/zookeeper-3.4.14/bin/ #进入zookeeper目录下的bin目录
  2. [root@zookeeper1 bin]# ls
  3. README.txt zkCli.cmd zkEnv.cmd zkServer.cmd zkTxnLogToolkit.cmd
  4. zkCleanup.sh zkCli.sh zkEnv.sh zkServer.sh zkTxnLogToolkit.sh
  5. [root@zookeeper1 bin]# ./zkServer.sh start #启动服务
  6. #启动完成
  7. ZooKeeper JMX enabled by default
  8. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  9. Starting zookeeper ... STARTED
  10. [root@zookeeper1 bin]# ./zkServer.sh status #查看服务状态
  11. ZooKeeper JMX enabled by default
  12. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  13. Error contacting service. It is probably not running.

zookeeper2:

  1. [root@zookeeper2 conf]# cd ~/zookeeper-3.4.14/bin/ #进入zookeeper目录下的bin目录
  2. [root@zookeeper2 bin]# ls
  3. README.txt zkCli.cmd zkEnv.cmd zkServer.cmd zkTxnLogToolkit.cmd
  4. zkCleanup.sh zkCli.sh zkEnv.sh zkServer.sh zkTxnLogToolkit.sh
  5. [root@zookeeper2 bin]# ./zkServer.sh start #启动服务
  6. #启动完成
  7. ZooKeeper JMX enabled by default
  8. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  9. Starting zookeeper ... STARTED
  10. [root@zookeeper1 bin]# ./zkServer.sh status #查看服务状态
  11. ZooKeeper JMX enabled by default
  12. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  13. Mode: follower #角色为follower

zookeeper3:

  1. [root@zookeeper3 conf]# cd ~/zookeeper-3.4.14/bin/ #进入zookeeper目录下的bin目录
  2. [root@zookeeper3 bin]# ls
  3. README.txt zkCli.cmd zkEnv.cmd zkServer.cmd zkTxnLogToolkit.cmd
  4. zkCleanup.sh zkCli.sh zkEnv.sh zkServer.sh zkTxnLogToolkit.sh
  5. [root@zookeeper3 bin]# ./zkServer.sh start #启动服务
  6. #启动完成
  7. ZooKeeper JMX enabled by default
  8. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  9. Starting zookeeper ... STARTED
  10. [root@zookeeper3 bin]# ./zkServer.sh status #查看服务状态
  11. ZooKeeper JMX enabled by default
  12. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  13. Mode: leader #角色为leader

发现错误:三个节点服务状态都显示异常,开始debug后

  1. zookeeper1的原因是防火墙的问题,返回关闭防火墙。
  2. zookeeper2zookeeper3是因为启动服务的顺序不同,先将三个节点的服务关闭,将选举为leader的节点先开启服务,剩下两个节点依次开启,最后再查看状态,发现配置成功。
  1. 以下为具体操作:(此处我复盘了我老师的排错手法)

3.debug

  • 查看三个节点的zoo.cfg配置文件,主要查看server.id行

  1. [root@zookeeper1/2/3 bin]# cat ~/zookeeper-3.4.14/conf/zoo.cfg
  2. #无误
  3. server.1=172.16.51.23:2888:3888
  4. server.2=172.16.51.32:2888:3888
  5. server.3=172.16.51.41:2888:3888
  • 查看三个节点的myid文件是否与zoo.cfg对应

zookeeper1:

  1. [root@zookeeper1 bin]# cat /tmp/zookeeper/myid
  2. 1

zookeeper2:

  1. [root@zookeeper2 bin]# cat /tmp/zookeeper/myid
  2. 2

zookeeper3:

  1. [root@zookeeper3 bin]# cat /tmp/zookeeper/myid
  2. 3
  • 查看zookeeper.out运行日志,发现有好几个报错:连接被阻止

java.net.ConnectException: Connection refused (Connection refused)

  • 查看端口状态

  1. [root@zookeeper1 bin]# netstat -ntpl
  2. Active Internet connections (only servers)
  3. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  4. tcp6 0 0 :::2181 :::* LISTEN 2061/java

发现属于zookeeper的2181端口属于进程名是java,所以没有被占用

  • 查看防火墙

  1. [root@zookeeper1 bin]# getenforce #查看SELinux状态
  2. Enforcing #强制模式
  3. [root@zookeeper1 bin]# systemctl status firewalld
  4. Active: active (running) …… #running状态——运行中
  5. #查出原因,开始关闭防火墙
  6. [root@zookeeper1 bin]# setenforce 0 #切换SELinux模式
  7. [root@zookeeper1 bin]# getenforce #重新检查
  8. Permissive #宽容模式
  9. [root@zookeeper1 bin]# systemctl stop firewalld #关闭防火墙
  10. [root@zookeeper1 bin]# systemctl status firewalld
  11. Active: inactive (dead)…… #dead状态——已关闭
  • 依次停止并开启zookeeper服务,并推选zookeeper1为leader

zookeeper1:

  1. [root@zookeeper1 bin]# ./zkServer.sh stop #停止服务
  2. ZooKeeper JMX enabled by default
  3. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  4. Stopping zookeeper ... STOPPED
  5. [root@zookeeper1 bin]# ./zkServer.sh start #重新开启服务
  6. ZooKeeper JMX enabled by default
  7. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  8. Starting zookeeper ... STARTED
  9. [root@zookeeper1 bin]# ./zkServer.sh status #查看服务角色
  10. ZooKeeper JMX enabled by default
  11. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  12. Mode: leader #角色为leader

zookeeper2:

  1. [root@zookeeper2 bin]# ./zkServer.sh stop
  2. ZooKeeper JMX enabled by default
  3. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  4. Stopping zookeeper ... STOPPED
  5. [root@zookeeper2 bin]# ./zkServer.sh start
  6. ZooKeeper JMX enabled by default
  7. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  8. Starting zookeeper ... STARTED
  9. [root@zookeeper2 bin]# ./zkServer.sh status
  10. ZooKeeper JMX enabled by default
  11. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  12. Mode: follower #角色为follower

zookeeper3:

  1. [root@zookeeper3 bin]# ./zkServer.sh stop
  2. ZooKeeper JMX enabled by default
  3. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  4. Stopping zookeeper ... STOPPED
  5. [root@zookeeper3 bin]# ./zkServer.sh start
  6. ZooKeeper JMX enabled by default
  7. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  8. Starting zookeeper ... STARTED
  9. [root@zookeeper3 bin]# ./zkServer.sh status
  10. ZooKeeper JMX enabled by default
  11. Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg
  12. Mode: follower #角色为follower

至此,zookeeper集群管理配置完成!

参考来源

Zookeeper 端口说明 - 简书 (jianshu.com)

3.0 Zookeeper linux 服务端集群搭建步骤 | 菜鸟教程 (runoob.com)

Zookeeper入门看这篇就够了_java_66666的博客-CSDN博客_zookeeper

Zookeeper 概述_w3cschool

什么是ZooKeeper? - 知乎 (zhihu.com)

ZooKeeper 详解 - 知乎 (zhihu.com)

如果有人问你ZooKeeper是什么,就把这篇文章发给他 - 知乎 (zhihu.com)

总结

这是第二篇项目练习博客,一周至少会更一次知道这个项目结束。如果你发现了文章的数据、科学性、知识点错误的话,还请指正,我会马上修改。如果你还想了解更多关于ZooKeeper的信息可以去官网Apache ZooKeeper、我提供的参考来源等。最后,感谢您的阅读。


本文转载自: https://blog.csdn.net/weixin_73760816/article/details/126973728
版权归原作者 李是名 所有, 如有侵权,请联系我们删除。

“项目练习:ZooKeeper集群部署”的评论:

还没有评论