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.7
2、装备环境变量
vim /etc/profile
# 参加下列内容
ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.5.7
export PATH=$PATH:$ZOOKEEPER_HOME/bin
# 从头加载环境变量
source /etc/profile
3、修正装备文件
# 切换到装备文件目录
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:3888
4、新建相关目录及文件
cd /usr/local/soft/zookeeper-3.5.7
# 创立ZK数据寄存方位
mkdir data
cd data
# 在data目录下创立myid文件
touch myid
5、同步到其它节点
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 --> 2
8、发动与中止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 /test
10、重置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 zk
3.增加以下内容:
#!/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
};;
esac
4.修正文件权限
chmod 777 zk
5.直接运转
zk start
6.其他指令
zk stop
zk status
zk restart
今日的共享就到这了,之后会共享hbase相关的内容。