zookeeper 就是做分布式一致性
1.产生背景
任务 100个节点 集群
分布式情景下 如何实现数据一致性?
一致性:
强一致性:
写入什么 就读到什么
例如:从任意一个节点写入数据 其他节点读取到写入后的数据
集群中只有一个节点 一致性最强的 集群中节点个数越多 强一致性越难保证
弱一致性:
写入什么 尽量保证读到什么
不保证最终读取的结果一定对的
最终一致性:
弱一致性的特殊情况
允许一定的时间延迟的
是什么:
zookeeper 就是做分布式一致性
来源:
paxos 过半选举
zookeeper 是paxos算法的最完美的实现
(注:Paxos 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。一个典型的场景是,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点执行相同的操作序列,那么他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致。一个通用的一致性算法可以应用在许多场景中,是分布式计算中的重要问题。因此从20世纪80年代起对于一致性算法的研究就没有停止过。节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。Paxos 算法就是一种基于消息传递模型的一致性算法。)
分布式算法 演变:
CAP
c:强一致性 一个节点
a:高可用性 节点越多可用性越高
p:机架策略
实验环境下
base:
c-- 最终一致性 a :基本可用
2.安装
安装版本:
3.4.10
安装准备:
jdk1.8
安装节点:
最好是奇数台 至少3台 3-11
安装步骤:
1)上传
2)解压
tar -xvzf zookeeper-3.4.10.tar.gz
3)配置环境变量
export ZOO_HOME=/home/hadoop/app/zookeeper-3.4.10
export PATH=
P
A
T
H
:
PATH:
PATH:ZOO_HOME/bin
source /etc/profile
4)修改zookeeper配置文件
/home/hadoop/app/zookeeper-3.4.10/conf
mv zoo_sample.cfg zoo.cfg
The number of milliseconds of each tick 每次心跳的时间间隔
tickTime=2000
The number of ticks that the initial
synchronization phase can take 初始化 接受的心跳次数
initLimit=10
The number of ticks that can pass between
sending a request and getting an acknowledgement 发送请求 接受响应 5次心跳
syncLimit=5
the directory where the snapshot is stored. 快照存储目录
zookeeper的核心文件存储目录 快照目录:存储每一个节点的id
do not use /tmp for storage, /tmp here is just
example sakes.
dataDir=/home/hadoop/data/zookeeperdata
the port at which the clients will connect
clientPort=2181
the maximum number of client connections.
increase this if you need to handle more clients
#maxClientCnxns=60
绑定节点 和 id
server.id = 主机:2888:3888 一行一个节点
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
zk中每一个节点都会有一个id int 0-255 便于投票使用
同一个集群中 不同节点的id 不可重复
hadoop01 1
hadoop02 2
hadoop03 3
5)添加id文件
/home/hadoop/data/zookeeperdata 下创建文件名myid的文件
myid存储当前节点的id
myid 不要有多余的空格 也不要有多余的换行符
6)远程发送zk的安装包 其他节点
scp -r zookeeper-3.4.10 hadoop02:/home/hadoop/app/
scp -r zookeeper-3.4.10 hadoop03:/home/hadoop/app/
sudo scp /etc/profile hadoop02:/etc/
sudo scp /etc/profile hadoop03:/etc/
source /etc/profile
7)到hadoop02 hadoop03 创建 myid文件
先创建目录
8)启动
注意:启动之前一定保证防火墙关闭的 时间同步的
三个节点都要执行
启动hadoop01
zkServer.sh start
21698 QuorumPeerMain zookeeper的进程
有这个进程 不代表启动成功
验证启动成功 zk的状态
zkServer.sh status
Error contacting service. It is probably not running.
启动hadoop02
zkServer.sh start
Mode: leader
hadoop01上
Mode: follower
启动hadoop03
zkServer.sh start
Mode: follower
3.全新集群的选主
zookeeper的架构:
主 leader
从 follower
启动顺序 和 myid 有关
启动顺序 hadoop01–1 —》 hadoop02—2 —》 hadoop03—3
1)hadoop01启动,找集群中的leader,发现没有leader,发起选主,但是集群中只有一个节点 他自己, 这个时候hadoop01 就将选票投给自己,这时候hadoop01获取1票,没有过半,选主失败,这个时候hadoop01的状态 无状态(It is probably not running)
2)hadoop02启动,找集群中的leader,发现没有leader,发起选主,集群中有hadoop01–1 hadoop02—2,每个节点开始投票,zk内部规定id小的节点强制将自己的票投给id大的,hadoop01 —id=2 hadoop02—id=2,id=2(hadoop02)获取两票,已经过半了,hadoop02就是选举的leader , hadoop01 就主动的将自己的状态切为follower
3)hadoop03启动,找集群leader,发现集群中已经有leader,主动将自己的状态切为follower
(未完)