简介:
ApacheZooKeeper是一项致力于开发和维护开源服务器的工作,它能够实现高度可靠的分布式协调。
ZooKeeper是一个集中的服务,用于维护配置信息、命名、提供分布式同步以及提供组服务。
应用场景 :提供了文件系统(存储信息)和通知机制(watch)
命名服务naming(注册中心):
常见的就是一些分布式服务框架(如RPC、RMI)中的服务地址列表,通过使用命名服务,客户端应用能够根据指定名字来获取资源的实体、服务地址和提供者的信息等
配置管理:
1, 将公共的配置存放在Zookeeper的节点中
2,应用程序可以连接到Zookeeper中并对Zookeeper中配置节点进行读取或者修改(对于写操作可以进行权限验证设置)
分布式锁 (zk)
队列管理(MQ) :
集群的搭建:
单机版已经完成,可以使用 zkServer.sh start 启动 zkCli.sh 连接
1,解压下载的安装包:
tar -xzvf /root/software/apache-zookeeper-3.6.2-bin.tar.gz -C /usr/
2,重命名目录并配置环境变量:
mv /usr/apache-zookeeper-3.6.2-bin/ /usr/zookeeper
3.配置环境变量: vim /etc/profile
export ZK_HOME=/usr/zookeeper
export PATH=JAVAHOME/bin:JAVA_HOME/bin:JAVAHOME/bin:ZK_HOME/bin:$PATH
4,复制配置文件(启动默认加载conf/zoo.cfg文件):
cp /usr/zookeeper/conf/zoo_sample.cfg /usr/zookeeper/conf/zoo.cfg
5.讲解理解配置,并添加集群配置(注意:cluster1,cluster2,cluster3是机子名称,需要配置本地的/etc/hosts配置,如果没有配置,需要用ip地址,不能写机子名称,2888是集群节点的通信端口3888是集群投票端口)
6.和该配置对应的配置:
7.按照dataDir配置路径新建目录
mkdir /usr/zookeeper/data
8.在data配置的目录下新建myid文件里面和server.1,server.2,server.3对应 vim /usr/zookeeper/data/myid 并写入1 保存退出 自动生成该文件
9.,配置好的zk分发
10.启动集群
集群投票选举leader原理:
SID: 服务器ID (myid=1 myid=2…)
SID是一个数字,用来唯一标识一台ZooKeeper集群中的机器,每台机器不能重复,和myid的值一致
事务ID (ZXID) :
事务是指能够改变Zookeeper服务器状态的操作,一般包括数据节点的创建与删除、数据节点内容更新和客户端会话创建与失效等操作。对于每个事务请求,zk都会为其分配一个全局唯一的事务ID,即ZXID,是一个64位的数字,高32位表示该事务发生的集群选举周期(集群每发生一次leader选举,值加1),低32位表示该事务在当前选择周期内的递增次序(leader每处理一个事务请求,值加1,发生一次leader选择,低32位要清0)。
Vote:投票(核心原则,zxid一样时投票给sid大的服务器
Leader选举,就是通过投票来实现,当集群中的机器发现自己无法检测到Leader机器的时候,就会开始尝试进行投票。一旦选出一个Leader,那么所有服务器的集群角色一般不会再发生变化,也就是说,Leader服务器将一直作为集群的Leader,即使集群中有非Leader挂了或有新机器加入集群也不会影响Leader。但是一旦Leader所在机器挂了,那么整个集群将暂时无法对外提供服务,而是进入新一轮的Leader选举。服务器运行期间的Leader选举和启动时期的Leader选举基本过程一致的。
Quorum:过半机器数(过半原则,防脑裂):
这个是整合Leader选举算法中最重要的一个术语,我们可以理解为一个量词,指的是ZooKeeper集群中过半的机器数,公式为quorum=(n/2+1)。例如:如果集群机器总数为3,那么quorum就是2 1, 2 ,3 ,4,5
Zookeeper节点状态:
LOOKING:寻找Leader状态,处于该状态需要进入选举流程
LEADING:领导者状态,处于该状态的节点说明是角色已经是LeaderFOLLOWING:跟随者状态,表示Leader已经选举出来,当前节点角色是follower
OBSERVER:观察者状态,表明当前节点角色是observer,不参与选举
选举过程:
Zookeeper集群初始化启动时Leader选举
Zookeeper集群运行期间Leader重新选:
启动集群麻烦,编写脚本启动:
#!/bin/bash
zkpsnum=ps -ef|grep zookeeper-root-server|grep -v grep|wc -l
if [ zkpsnum−eq0];thenecho′zk集群开始启动′foriin1..3dosshclusterzkpsnum -eq 0 ];then
echo 'zk集群开始启动'
for i in {1..3}
do
ssh clusterzkpsnum−eq0];thenecho′zk集群开始启动′foriin1..3dosshclusteri “source /etc/profile;zkServer.sh start;jps”
done
echo ‘zk集群启动结束’
else
echo ‘zk集群开始关闭’
for i in {1…3}
do
ssh cluster$i “source /etc/profile;zkServer.sh stop”
done
echo ‘zk集群关闭结束’
fi
zk节点和节点类型:
常用命令: