系统环境:Centos6.9
Zookeeper 的介绍
分布式系统-CAP 定理
1. 分区容错性
2. 一致性
3. 可用性
不可以同时满足以上三个
4. 一致性和可用性的平衡方案
最终一致性 案例:Zookeeper
Zookeeper 的应用实践
- 最终一致性:保证最终数据到达一致
- 顺序性:从同一个客户端发起的事物请求,最终会严格按照发送顺序被用到 Zookeeper 中
- 可靠性:一旦服务器应用的一个事物,并完成了客户端的相应,那么该事物引起的服务端状态将会一致保留下去
- 实时性:不能保证两个客户端能同时得到刚刚更新的数据,如果需要最新数据,在读取数据前调用 sync()接口
- 原子性:一次数据更新要么成功,要么失败。
- 单一视图:无论客户端连接那个服务器,看到的数据模型一致
Zookeeper中的三个角色
- Server Leader (从Follower客户端中选取出来的)
- Server Follower 跟随者 (为客户端提供读写服务,发起选举,写请求转发给 Leader)
- Server Observer 观察者 (状态同步,客户端读请求,状态永远不会改变)
Zookeeper 写入
- 数据写入最终一致性核心算法 ZAB 算法
- Leader 负责助理写事物请求
- Follower 负责向 Leader 转发写请求,相应 Leader 发出的提议
Zookeeper 读取
访问 Follower 直接返回结果,如果要求数据同步就调用 sync 接口
Zookeeper 选举
1)服务器的四种状态
-LOOKING:寻找 Leader 状态,处于该状态需要进入选举流程
-LEADING:领导者状态,表明当前服务角色为 Leader
-FOLLOWING:跟随者状态,Leader 已经选举出来,表明该角色为 Follower
-OBSERVER:观察者状态,表明该服务角色 Observer
事物 ID:用 ZXID 表示,是64位的数,由 Leader 统一分配,全局唯一,不断递增。
事物请求就是对文件(Znode 操作)进行写请求,不更改就是非事物请求
2)全新启动过程
1. 每个 Server 发出一个投票,内容(myid(机器的文件号码),ZXID)
2. 接受来自各个 Server 的投票
3. 处理投票(首先比较事物 ID(谁的大谁当 Leader,一开始默认都是0),其次比较(myid),谁的 myid 大谁当)
4. 统计投票
5. 改变服务状态
3)运行期间选举
- 所有 Server 切换状态为 LOOKING,每个 Server 发出一个投票
- 接受来自 Server 的投票
- 处理投票
- 统计投票
- 改变服务器状态
数据模型 Znode(Zookeeper 的数据存储节点)
- 特有的数据节点 Znode结构类似 Linux,咩有目录和文件的概念
- Znode 是 Zookeeper 中数据的最小单元
- Znode 上可以保存数据,通过挂载子节点构成一个树状的层次化命名空间
- Znode 树的跟由”/”开始
Zonde-Watcher 机制
1)Client ——》 Zookeeper 集群 注册
2)Client ——》WatchManager 存储
3)Zookeeper 集群 ——》Client 通知
4)WatchManager ——》Client 执行回调
配置管理
1)将配置信息写入 Zookeeper 的一个 Zonde 上
2)各个节点监听这个 Znode
3)一旦 Znode 中的数据被修改,将通知各个节点更新。
Zookeeper 并不能解决脑裂问题,只能通过分布式系统内部解决
Zookeeper 功能
1)存储
2)监听
Zookeeper 的安装
1.下载 Zookeeper 安装包
https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.11/
2.集群规划
主机名称 IP 部署软件
node1 192.168.183.100 zookeeper
node2 192.168.183.101 zookeeper
node3 192.168.183.102 zookeeper
部署三台机器,每台启动一个 zookeeper 进程
3.root 用户登录
useradd hadoop 创建一个 hadoop 用户
切换 hadoop 用户
cd /home/hadoop
创建 apps 目录,存放以后使用的软件
mkdir apps
4.上传 zookeeper 安装包
在 apps 内解压 tar -zxvf zookeeper-3.4.10.tar.gz
5.创建软连接
使用 root 用户
创建软连接ln -s /home/hadoop/apps/zookeeper-3.4.10 /usr/local/zookeeper
6.修改环境变量
使用 root 用户
vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin
使环境变量生效`source /etc/profile`
7.修改 zookeeper 软连接主人为 Hadoop
使用 root 用户
chown -R hadoop:hadoop /usr/local/zookeeper
8.修改 zookeeper 配置文件
cd /usr/local/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
编辑 zoo.cfg 文件
添加内容
dataDir=/usr/local/zookeeper/data #快照文件存储目录
dataLogDir=/usr/local/zookeeper/log #事务日志文件目录
#注意node1、node2、node3是安装zookeeper的主机名,根据自己的虚拟机自行修改
server.1=node1:2888:3888 (主机名, 心跳端口、数据端口)
server.2=node2:2888:3888
server.3=node3:2888:3888
9.创建 data、log 目录,只有 hadoop 用户有写权限
mkdir -m 755 data
mkdir -m 755 log
10.在 data 文件下创建 myid 文件,文件内容为编号
cd data
touch myid
echo 1 > myid
11.拷贝文件到其余机器中
提前在node2和node3创建好/home/hadoop/apps目录
scp -r /home/hadoop/apps/zookeeper-3.4.10 hadoop@node2:/home/hadoop/apps
scp -r /home/hadoop/apps/zookeeper-3.4.10 hadoop@node3:/home/hadoop/apps
12.修改其他节点下的 mydi 内容
node2的 myid 文件内容是2
node3的 myid 文件内容是3
13.启动
cd $ZOOKEEPER/bin
启动命令:./zkServer.sh satrt
查看状态命令:./zkServer.sh status
期间遇到的问题
1.之前要配置好 JDk 环境
2.启动命令运行后,使用 jps 命令查看,是不是增加进程QuorumPeerMain
3.使用./zkServer.sh status不能显示运行状态,查看自己的配置文件内容是否正确,以及 myid 书写进去的内容。
4.运行成功后,node2是 Leader,node1和 node3是follower
5.防火墙没有关闭
安装好之后,为以后的高可用打下基础。