什么是zookeeper呢, 使用官方的话是分布式远程协调服务
那为什么要有zookeeper呢? 到底是解决了什么问题呢???
上述是我们分布式部署架构. 我们会把会员系统
等服务独立部署. 但是很少能有服务独立完成工作的, 所以肯定会牵扯服务之间的相互调用.
但是依据上述服务架构而言的话, 肯定会在服务内部写死IP/ 域名. 服务之间都是正常运行还好,一旦牵扯服务宕机的话, 一是: 必须手动做出反应 二是: 启动一个新的服务,牵扯到的其余服务都必须手动修改IP/ 域名等
可以理解为服务之间是强耦合的. 这个时候我们就需要有别的服务来管理所有的服务. 只需要告诉调用者, 被调用服务是否存在, 是否可以正常调用就行了. 基于这种服务治理的目的, zookeeper
出现了
所以就连zookeeper
logo 都是一个人, 用来治理协调服务的
本身zookeeper
就是管理 以及治理服务的, 所以其本身的高可用
不言而喻, 所以一般我们部署的时候, 直接就是上集群. 接下来我们会对集群做重点描述
zookeeper的集群机制采用的是半数存活机制,也就是整个集群节点中有半数以上的节点存活,那么整个集群环境可用。这也就是说们的集群节点最好是奇数个节点
在这里可能会有人好奇, 为什么是奇书节点呢???
首先我们要理解, 如果存活机制是半数存活机制
, 说明 运行的节点 > 总节点/ 2的
如果是三台节点的话, 详情看下图:
部署的节点为三台的话, 如果一台服务器宕机了, 整个架构还是属于正常运行状态, 如果两台宕机了, 整个集群服务都宕机了
如果是四台节点的话, 详情看下图:
如果部署的节点是四台的话, 如果一台服务器宕机了,整个架构还是属于正常运行状态, 如果两台宕机了,整个集群服务都宕机了
综上所属, 同样的宕机频率, 实现同样的部署, 还是奇数台节点更加节省服务资源
下面是准备的三台服务器
192.168.56.10
192.168.56.11
192.168.56.12
这里配置静态站点, 避免了手动输入IP的痛苦, 毕竟在TCP过程解析域名的时候, 可以自主解析出IP的
vi /etc/hosts
# 列表为添加内容
192.168.56.10 vagrant01
192.168.56.11 vagrant02
192.168.56.12 vagrant03
通过上述截图可以看到, 是可以ping
通的.
创建密钥, 避免服务器之间发送内容的时候 需要登录
firewall-cmd --state
查看防火墙状态systemctl stop firewall.service
停止防火墙systemctl disable firewall.service
禁止开机启动创建目录
mkdir -p ~/soft
cd ~/soft
执行命令
sudo wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1-bin.tar.gz --no-check-certificate
通过命令tar -xf
进行解压, 解压后通过命令mv
进行名称修改
执行命令 cd ~/soft/zookeeper/conf
vi zoo.cfg
修改配置文件名称
创建myid
配置文件
我们需要在Zookeeper的数据存储的目录中创建一个myid文件,文件中的内容只有一行信息,即表示我们集群几点的标识,范围是1-255,每个节点的myid的数字和我们在zoo.cfg中配置的server.数字是对应的
执行命令
mkdir -p ~/soft/zookeeper/data
cd ~/soft/zookeeper/data
echo 1 > myid
最好保证 别的服务也拥有相同的文件夹. 例如:
/home/vagrant/soft
执行如下命令
cd ~/soft
scp -r zookeeper vagrant02:
pwd``scp -r zookeeper vagrant03:
pwd``修改服务vagrant02``vagarnt03
中的myid
文件内容
/home/vagrant/soft
tar -xf jdk-8u361-linux-x64.tar.gz
mv jdk1.8.0_361 jdk1.8
sudo vi /etc/profile.d/jdk.setup.sh
, 将下列内容 复制到文件内#!/bin/bash
JAVA_HOME=/home/vagrant/soft/jdk1.8
export PATH=$PATH:${JAVA_HOME}/bin
source /etc/profile
上述是以服务
vagrant01
来进行演示, 将服务vagrant02
以及vagrant03
执行同样的步骤
执行如下命令 启动服务
cd ~/soft/zookeeper/bin
./zkServer.sh start
服务vagrant02``vagrant03
执行相同的命令
- Leader 主要作用是保证分布式数据一致性,即每个节点的存储的数据同步。遇到以下两种情况需要进行Leader选举
- 服务器初始化启动
- 服务器运行期间无法和leader 保持连接, leader节点崩溃
leader 的选举有两个关键性的字段:
SID``ZXID
SID
表示每个节点配置文件myid
的数字ZXID
表示业务id, 表示数据更新程度, 值越大, 表示服务对ZNode
操作越新
Zookeeper运行期间,如果有新的Server加入,或者非Leader的Server宕机,那么Leader将会同步数据到新Server或者寻找其他备用Server替代宕机的Server。若Leader宕机,此时集群暂停对外服务,开始在内部选举新的Leader。
假设当前集群中有Server1、Server2、Server3三台服务器,Server2为当前集群的Leader,由于意外情况,Server2宕机了,便开始进入选举状态
所以我们在上述zookeeper 部署
过程中, 如果是按配置顺序启动的话, 一定是第二台服务器 是leader
. 因为在ZXID
相同的情况下, 第二台服务的myid
比 第一台大.
因为已经选择出leader
, 所以第三台服务不会参与竞选, 只会进行数据同步