zookeeper底子知识分享(一)
写在前面今天来学习Zookeeper部门的知识,之后会学习hbase的知识。
Zookeeper简介
Zookeeper是一个高效的分布式协调服务,可以提供以下功能:
[*]设置信息管理
[*]定名
[*]分布式同步
[*]集群管理
[*]数据库切换等服务
它不适适用来存储大量信息,而是用于存储一些设置信息、发布与订阅等少量数据。以下是Zookeeper的范例应用场景:
[*]Hadoop
[*]Storm
[*]消息中央件
[*]RPC服务框架
[*]分布式数据库同步系统
Zookeeper集群
Zookeeper集群中节点的个数一般为奇数(>=3)。假如集群中的Master节点挂掉,且剩余节点数凌驾半数时,集群可以通过选举推举新的主节点继续对外提供服务。
客户端发起变乱请求时,变乱的结果在整个Zookeeper集群中全部机器上的应用是同等的。不会出现集群中部门机器应用了该变乱,而其他机器未应用该变乱的情况。Zookeeper确保集群中全部机器的数据模型同等。
Zookeeper能够保证客户端请求的次序,每个请求都会分配一个全局唯一的递增编号,用来反映变乱操作的先后次序。
Zookeeper将全量数据生存在内存中,并直接服务于全部的非变乱请求。因此,在以读操作为主的场景中,Zookeeper性能非常突出。
Zookeeper的数据布局与节点脚色
Zookeeper使用的主要数据布局是树形布局,根节点为/。Zookeeper集群中的节点有以下几种身份:
[*]Leader:负责客户端写请求(writer类型的请求)。
[*]Follower:负责客户端读请求(reader类型的请求),并参与Leader选举。
[*]Observer:是特殊的Follower节点,可以接收客户端的读请求,但不会参与选举。Observer可以用来扩展系统的读能力,提升读取性能。
Zookeeper的设计理念
Zookeeper是一个基于观察者模式设计的分布式服务管理框架。它负责存储和管理相关数据,并接收观察者的注册。一旦这些数据的状态发生变化,Zookeeper会关照已注册的观察者,以便观察者实行相关操作。
Zookeeper的协议与同等性保障
Zookeeper使用ZAB原子广播协议,节点之间的数据同等性算法接纳Paxos算法,能够保障分布式环境中数据的同等性。
ZAB(Zookeeper原子广播协议)
详细介绍ZAB协议
Paxos算法
Paxos算法解决的问题是,如安在分布式系统中就某个值(决议)告竣同等。范例的应用场景包括:分布式数据库系统中,假如各节点的初始状态同等,且实行相同的操作序列,则它们终极会得到同等的状态。
为了确保每个节点实行相同的命令序列,需要通过同等性算法来保证每个节点看到的指令同等。Paxos算法就是为了解决分布式系统中的同等性问题,它是基于消息传递模型的同等性算法。
Paxos算法不但可以用于分布式系统中的同等性保证,也适用于多个进程/线程需要告竣同等的场景,包括:
[*]一台机器中多个进程/线程的数据同等性
[*]分布式文件系统或数据库中的并发读写
[*]分布式存储中多个副本响应读写请求的同等性
Zookeeper全解析——Paxos作为灵魂
Zookeeper(ZK)Server最底子的东西是什么呢?我想应该是Paxos。因此,本文将介绍Paxos及其在ZK Server中的实现。
什么是Paxos?
Paxos是一种基于消息传递的同等性算法,由Leslie Lamport于1990年提出,近年来被广泛应用于分布式盘算中。Google的Chubby、Apache的Zookeeper都基于Paxos的理论进行实现。Paxos被认为是如今为止唯一成熟的分布式同等性算法,其他算法每每是对Paxos的改进或简化。
需要指出的是,Paxos有一个前提:没有拜占庭将军问题。意思是,Paxos只有在一个可信的盘算环境中才华建立,这个环境不应受到入侵或破坏。
Paxos算法的描述
Paxos描述了这样一个场景:有一个叫做Paxos小岛(Island)的地方,岛上住着一批住民,他们的变乱由一些特殊的人来决定,这些人被称为议员(Senator)。议员的数量是固定的,不可更改。
岛上的每次变乱变动都需要通过发起(Proposal),每个发起都有一个编号(PID),这个编号是递增的,不能倒退。每个发起必须得到凌驾半数议员的同意才华生效。假如某个议员收到的发起编号小于等于他当前的编号,他会拒绝该发起,并告知对方“你的发起已经有人提过了”。
这个编号是每个议员在本身的记事本上记录的数字,随着时间的推移,议员会更新这个编号,确保发起按照准确的次序进行。整个议会的目标是:保证全部议员对于发起告竣同等的看法。
举个例子
假设岛上有三个议员:S1、S2、S3。
[*]S1发起将电费设定为1元/度,这时他将发起编号定为1。
[*]其他议员收到S1的发起后,查找本身的记事本,发现当前编号为0,以是接受这个发起,并记录编号为1。
[*]假如S1收到了凌驾半数(即2个议员)的同意,他就会宣布“1号发起生效!”
冲突解决
假设S1和S2同时发起了发起:
[*]S1发起设定电费为1元/度(发起编号为1)。
[*]S2发起设定电费为2元/度(发起编号也是1)。
S3先收到S1的发起并同意,接着收到S2的发起,但发现S2的发起编号小于等于本身当前的编号,因此拒绝了S2的发起,S1的发起生效。
Paxos在Zookeeper中的应用
如今让我们将Paxos的概念与Zookeeper(ZK Server)中的实现对应起来:
[*]小岛(Island)—— Zookeeper集群(ZK Server Cluster)
[*]议员(Senator)—— Zookeeper Server节点
[*]发起(Proposal)—— ZNode的变动操作(如Create、Delete、SetData等)
[*]发起编号(PID)—— Zxid(ZooKeeper变乱ID)
[*]正式法令 —— 全部ZNode及其数据
只管概念对得上,但是Zookeeper中有一个特殊脚色——Leader。这个脚色在Paxos中并不明显,但实际上它是解决“活锁”问题的关键。Paxos的作者Leslie Lamport在《The Part-Time Parliament》中提到,只有一个总统(President)可以发出发起,以避免多个议员同时发起导致的冲突。
总统——ZK Server中的Leader
Zookeeper的Leader脚色正是Paxos中的总统。在Zookeeper集群中,Leader负责协调变乱的处理并保证同等性,而Follower节点则跟随Leader的决议。
总统选举
总统(Leader)的选举机制是Paxos的一部门,选举过程可能比较复杂,Zookeeper使用Paxos来确保集群中的Leader同等性。你可以阅读相关博客了解更多详细信息:如何选出总统
ZK Server的操作
让我们通过几个景象来更好地理解Zookeeper是如何实施Paxos算法的。
情况一:
[*]客户端甲到某个ZK Server扣问某条法令的情况(比方ZNode的数据)。ZK Server直接查看本地存储(local storage),并告诉客户端结果。ZK Server会声明:“我的数据不一定是最新的。”假如客户端想要最新的数据,ZK Server会同步到Leader并返回最新结果。
情况二:
[*]客户端乙到某个ZK Server请求修改数据(比方ZNode数据)。ZK Server会将该请求提交给Leader,Leader会扣问集群中的其他ZK Server的意见。当凌驾半数的ZK Server同意后,Leader会发布命令,完成数据的修改,ZK Server返回给客户端。
情况三:
[*]假如ZK Server的Leader忽然挂掉,其他ZK Server会发现无法接洽上Leader。此时,ZK集群会启动Leader选举,选举出一个新的Leader。在此期间,客户端请求会被拒绝,直到选举完成。
总结
Paxos是Zookeeper的灵魂,它提供了分布式系统中告竣同等性的底子。通过Paxos,Zookeeper保证了在分布式环境下的同等性与容错性。只管Zookeeper还有其他特性(如Session、Watcher、Version等),但Paxos的核心原理仍然是理解Zookeeper工作的关键。
Zookeeper安装文档
1、上传并解压
上传安装包到master并解压
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /usr/local/soft
# 重命名
cd /usr/local/soft
mv apache-zookeeper-3.5.7-bin/ zookeeper-3.5.72、设置环境变量
vim /etc/profile
# 加入下列内容
ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.5.7
export PATH=$PATH:$ZOOKEEPER_HOME/bin
# 重新加载环境变量
source /etc/profile3、修改设置文件
# 切换到配置文件目录
cd /usr/local/soft/zookeeper-3.5.7/conf
# 复制默认配置文件并重命名
cp zoo_sample.cfg zoo.cfg
# 修改配置
vim zoo.cfg
# 找到dataDir并修改
dataDir=/usr/local/soft/zookeeper-3.5.7/data
# 在文件尾部增加
server.0=master:2888:3888
server.1=node1:2888:3888
server.2=node2:2888:38884、新建相关目录及文件
cd /usr/local/soft/zookeeper-3.5.7
# 创建ZK数据存放位置
mkdir data
cd data
# 在data目录下创建myid文件
touch myid5、同步到其它节点
cd /usr/local/soft/
scp -r zookeeper-3.5.7 node1:`pwd`
scp -r zookeeper-3.5.7 node2:`pwd`6、设置从节点的环境变量
设置node1和node2的环境变量
同步调2中环境变量设置同等
最后记得source
7、修改myid文件
每台都需修改,并且myid都差异
cd /usr/local/soft/zookeeper-3.5.7/data
vim myid
# master ---> myid--> 0
# node1 ---> myid--> 1
# node2 ---> myid--> 28、启动与停止ZK
三台都需要实行
[*]启动
zkServer.sh start
[*]停止
zkServer.sh stop
[*]查看ZK状态
通过jps可以查看zk的进程:QuorumPeerMain
当有一个leader的时间启动成功
zkServer.sh status
9、ZK基本操作
zk是一个目录布局 ,每个节点可以存数据,同时可以有子节点
# 连接ZK
zkCli.sh
# 创建目录
create /test testData
create /test/a aData
# 获取数据
get /test
# 查看目录
ls /test
# 删除节点
delete /test
# 如果节点非空
deleteall /test10、重置zk
如遇故障,可进行重置
重置将清除ZK中全部数据,慎用!!!
[*]杀掉全部zk进程
# 找到ZK的进程编号pid
kill -9 {pid}
[*]删除数据
删除data目录下的version文件, 全部节点都要删除
rm -rf /usr/local/soft/zookeeper-3.5.7/data/version-2
[*]重新启动zk
zkServer.sh start
11、设置启停脚本
1.进入脚本运行目录
cd /usr/local/bin 2.创建脚本文件
vim zk3.添加以下内容:
#!/bin/sh
case $1 in
"start"){
for i in master node1 node2
do
echo "********$i --> zkServer.sh start **********"
ssh $i 'source /etc/profile; /usr/local/soft/zookeeper-3.8.4/bin/zkServer.sh start;exit'
done
};;
"stop"){
for i in master node1 node2
do
echo "********$i --> zkServer.sh stop **********"
ssh $i 'source /etc/profile; /usr/local/soft/zookeeper-3.8.4/bin/zkServer.sh stop;exit'
done
};;
"status"){
for i in master node1 node2
do
echo "********$i --> zkServer.sh status **********"
ssh $i 'source /etc/profile; /usr/local/soft/zookeeper-3.8.4/bin/zkServer.sh status;exit'
done
};;
"restart"){
for i in master node1 node2
do
echo "********$i --> zkServer.sh restart **********"
ssh $i 'source /etc/profile; /usr/local/soft/zookeeper-3.8.4/bin/zkServer.sh restart;exit'
done
};;
esac4.修改文件权限
chmod 777 zk5.直接运行
zk start6.其他命令
zk stop
zk status
zk restart今天的分享就到这了,之后会分享hbase相关的内容。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]