Zookeeper集群部署

发布时间 2023-10-08 09:30:37作者: 小糊涂90
1.#ZooKeeper 使用场景
ZooKeeper 是一个分布式服务框架,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:命名服务、状态同步、配置中心、集群管理等。

#命名服务:
命名服务是分布式系统中比较常见的一类场景。命名服务是分布式系统最基本的公共服务之一。在分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等——这些我们都可以统称它们为名字(Name),其中较为常见的就是一些分布式服务框架(如 RPC、RMI)中的服务地址列表,通过使用命名服务,客户端应用能够根据指定名字来获取资源的实体、服务地址和提供者的信息等。

#状态同步:
每个节点除了存储数据内容和 node 节点状态信息之外,还存储了已经注册的APP 的状态信息,当有些节点或 APP 不可用,就将当前状态同步给其他服务。

#配置中心:
现在我们大多数应用都是采用的是分布式开发的应用,搭建到不同的服务器上,我们的配置文件,同一个应用程序的配置文件一样,还有就是多个程序存在相同的配置,当我们配置文件中有个配置属性需要改变,我们需要改变每个程序的配置属性,这样会很麻烦的去修改配置,那么可用使用 ZooKeeper 来实现配置中心,ZooKeeper 采用的是推拉相结合的方式: 客户端向服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应的客户端发送Watcher 事件通知,客户端接收到这个消息通知后,需要主动到服务端获取最新的数据。

#集群管理:
所谓集群管理,包括集群监控与集群控制两大块,前者侧重对集群运行时状态的收集,后者则是对集群进行操作与控制,在日常开发和运维过程中,我们经常会有类似于如下的需求:希望知道当前集群中究竟有多少机器在工作。对集群中每台机器的运行时状态进行数据收集。对集群中机器进行上下线操作。

#ZooKeeper 具有以下两大特性。
客户端如果对 ZooKeeper 的一个数据节点注册 Watcher 监听,那么当该数据节点的内容或是其子节点列表发生变更时,ZooKeeper 服务器就会向订阅的客户端发送变更通知。对在 ZooKeeper 上创建的临时节点,一旦客户端与服务器之间的会话失效,那么该临时节点也就被自动清除。

Watcher(事件监听器),是 Zookeeper 中的一个很重要的特性。Zookeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,

ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 Zookeeper实现分布式协调服务的重要特性。

2.#Zookeeper 集群部署
ZooKeeper 集群用于解决单点和单机性能及数据高可用等问题。
zookeeper 集群特性:整个集群中只要有超过集群数量一半的 zookeeper 工作只正常的,那么整个集群对外就是可用的,假如有 2 台服务器做了一个 zookeeper集群,只要有任何一台故障或宕机,那么这个 zookeeper 集群就不可用了,因为剩下的一台没有超过集群一半的数量,但是假如有三台 zookeeper 组成一个集群,那么损坏一台就还剩两台,大于 3 台的一半,所以损坏一台还是可以正常运行的,但是再损坏一台就只剩一台集群就不可用了。那么要是 4 台组成一个zookeeper 集群,损坏一台集群肯定是正常的,那么损坏两台就还剩两台,那么2 台不大于集群数量的一半,所以 3 台的 zookeeper 集群和 4 台的 zookeeper 集群损坏两台的结果都是集群不可用,以此类推 5 台和 6 台以及 7 台和 8 台都是同理,所以这也就是为什么集群一般都是奇数的原因。

2.1#配置zookeeper集群
官方文档:https://zookeeper.apache.org/doc/r3.4.14/zookeeperAdmin.html
服务器环境:
	zk-node1:10.0.0.150
	zk-node2:10.0.0.160
	zk-node3:10.0.0.170

2.2#zk-node1部署过程
http://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

[root@centos8 ~]#wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
[root@centos8 ~]#scp zookeeper-3.4.6.tar.gz 10.0.0.160:/usr/local/src
[root@centos8 ~]#scp zookeeper-3.4.6.tar.gz 10.0.0.170:/usr/local/src
#修改主机名
[root@centos8 ~]#hostnamectl set-hostname zk-node1
[root@centos8 ~]#bash
#安装jdk
[root@zk-node1 ~]# yum install -y java-1.8.0-openjdk
[root@zk-node1 ~]#cd /usr/local/src/
[root@zk-node1 src]#ls
zookeeper-3.4.6.tar.gz
[root@zk-node1 src]#tar xf zookeeper-3.4.6.tar.gz
[root@zk-node1 src]#ln -sv /usr/local/src/zookeeper-3.4.6 /usr/local/zookeeper
'/usr/local/zookeeper' -> '/usr/local/src/zookeeper-3.4.6'
[root@zk-node1 src]#cd /usr/local/zookeeper/conf
[root@zk-node1 conf]#cp zoo_sample.cfg zoo.cfg
[root@zk-node1 conf]#mkdir /usr/local/zookeeper/data
root@zk-node1 conf]#grep "^[a-Z]" zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
clientPort=2181
maxClientCnxns=128
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
server.1=10.0.0.150:2888:3888
server.2=10.0.0.160:2888:3888
server.3=10.0.0.170:2888:3888
[root@zk-node1 conf]#echo 1 >/usr/local/zookeeper/data/myid
[root@zk-node1 ~]#scp /usr/local/src/zookeeper-3.4.6/conf/zoo.cfg  10.0.0.160:/usr/local/src/zookeeper-3.4.6/conf/zoo.cfg
[root@zk-node1 ~]#scp /usr/local/src/zookeeper-3.4.6/conf/zoo.cfg  10.0.0.170:/usr/local/src/zookeeper-3.4.6/conf/zoo.cfg


2.3#zk-node2部署过程
[root@centos8 ~]#hostnamectl set-hostname zk-node2
[root@zk-node2 ~]# yum install -y java-1.8.0-openjdk
[root@zk-node2 conf]#cd /usr/local/src/
[root@zk-node2 src]#ls
zookeeper-3.4.6.tar.gz
[root@zk-node2 src]#tar xf zookeeper-3.4.6.tar.gz
[root@zk-node2 src]#ls
zookeeper-3.4.6  zookeeper-3.4.6.tar.gz
[root@zk-node2 src]#ln -sv /usr/local/src/zookeeper-3.4.6 /usr/local/zookeeper
'/usr/local/zookeeper' -> '/usr/local/src/zookeeper-3.4.6'
[root@zk-node2]#cat /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
clientPort=2181
maxClientCnxns=128
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
server.1=10.0.0.150:2888:3888
server.2=10.0.0.160:2888:3888
server.3=10.0.0.170:2888:3888
[root@zk-node2 conf]#mkdir /usr/local/zookeeper/data
[root@zk-node2 conf]#echo 2 >/usr/local/zookeeper/data/myid

2.4#zk-node3部署过程
[root@centos8 ~]#hostnamectl set-hostname zk-node3
[root@zk-node3 ~]# yum install -y java-1.8.0-openjdk
[root@zk-node3 ~]#cd /usr/local/src/
[root@zk-node3 src]#ls
zookeeper-3.4.6.tar.gz
[root@zk-node3 src]#tar xf zookeeper-3.4.6.tar.gz
[root@zk-node3 src]#ls
zookeeper-3.4.6  zookeeper-3.4.6.tar.gz
[root@zk-node3 src]#ln -sv /usr/local/src/zookeeper-3.4.6 /usr/local/zookeeper
'/usr/local/zookeeper' -> '/usr/local/src/zookeeper-3.4.6'
[root@zk-node3]#cat /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
clientPort=2181
maxClientCnxns=128
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
server.1=10.0.0.150:2888:3888
server.2=10.0.0.160:2888:3888
server.3=10.0.0.170:2888:3888
[root@zk-node3 conf]#mkdir /usr/local/zookeeper/data
[root@zk-node3 conf]#echo 3 >/usr/local/zookeeper/data/myid

2.5#启动zk
[root@zk-node1 ~]#/usr/local/zookeeper/bin/zkServer.sh  start
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@zk-node2 conf]#/usr/local/zookeeper/bin/zkServer.sh  start
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@zk-node3 conf]#/usr/local/zookeeper/bin/zkServer.sh  start
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

2.6#查看zk集群状态
[root@zk-node1 ~]#/usr/local/zookeeper/bin/zkServer.sh  status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower

[root@zk-node2 ~]#/usr/local/zookeeper/bin/zkServer.sh  status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader

[root@zk-node3 ~]#/usr/local/zookeeper/bin/zkServer.sh  status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower