Zookeeper 学习

216 阅读4分钟

ZooKeeper 是一个分布式协调服务

Zookeeper数据保存在内存中,可实现高吞吐量和低延迟

1 Zookeeper 基础学习

1.1 Zookeeper 基本概念

Zookeeper 是一个目录树结构,由 znode 组成。** znode 最大存储 1M 数据 **

节点分类

持久节点
临时节点(session 控制生命周期)
序列节点(分为临时序列节点和持久序列节点)

znode 信息

cZxid = 0x200000003 创建节点的Id
mZxid = 0x200000003 修改节点时更新
pZxid = 0x200000004 修改节点的子节点时更新
ephemeralOwner = 0x0 记录临时节点属于哪个session,0x0表示持久节点

1.2 Zookeeper 特性

  • 顺序一致性 — 客户端的更新按发送顺序应用
  • 原子性 — 更新成功或者失败,没有部分结果
  • 统一视图 — 无论服务连接到哪个数据库,客户端都将看到相同的数据视图
  • 可靠性 — 一旦应用了更新,它将一直持续到客户端覆盖更新为止。
  • 及时性 — 系统的客户视图在特定时间范围内是最新的

1.3 Zookeeper 集群的工作状态

  1. 可用状态
  2. 不可用状态

不可用状态恢复到可用状态 — 越快越好(200ms恢复)

1.4 Zookeeper 提供服务

  • 统一配置管理 -> 1M 数据
  • 分组管理 -> path 结构
  • 统一命名 -> 顺序节点
  • 同步 -> 临时节点
  • 分布式锁 —> 临时节点
  • HA 选择 -> 顺序节点

1.5 Zookeeper 集群安装

准备工作

  • 准备4台机器 192.168.64.135,192.168.64.136,192.168.64.137,192.168.64.138
  • 安装jdk 环境
  • 防火墙中打开需要端口,测试环境可关闭防火墙

** 下载安装包并解压到指定文件夹**

cd /home/soft/zk/
wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz
tar xf apache-zookeeper-3.6.1-bin.tar.gz
mv apache-zookeeper-3.6.1-bin zookeeper3.6.1

修改配置文件

cd /home/soft/zk/zookeeper3.6.1/conf
cp zoo_sample.cfg  zoo.cfg
vi zoo.cfg

修改 dataDir=/home/soft/zk/data
添加集群配置

server.1=192.168.64.135:2888:3888
server.2=192.168.64.136:2888:3888
server.3=192.168.64.137:2888:3888
server.4=192.168.64.138:2888:3888

tickTime=2000

leader 和 follower 之间心跳时间 2s

initLimit=10

follower 和leader 建立链接的时候,leader容许等待 10 * 2000 ,20s

syncLimit=5

leader 和 follower 数据同步,5 * 2000 10s 之后flower还不回复,leader认为 follower 有问题

2888:leader 接受write请求
3888:选主投票用

创建myid

mkdir -p /home/soft/zk/data
vi myid

在 192.168.64.135 机器上输入 1
在 192.168.64.136 机器上输入 2
在 192.168.64.137 机器上输入 3
在 192.168.64.138 机器上输入 4

添加环境变量

vi /etc/profile
source /etc/profile

配置文件中添加
export ZOOKEEPER_HOME=/home/soft/zk/zookeeper3.6.1
export PATH=PATH:PATH:ZOOKEEPER_HOME/bin

启动集群

使用 zkServer.sh start / zkServer.sh start-foreground

** 注意 **

  • 以上步骤分别在4台机器上执行
  • 或者可以先配置一台机器,再分别拷贝到其他三台机器

scp -r ./zookeeper3.6.1/ 192.168.64.136:pwd

2 Zookeeper 原理学习

zookeeper是一个分布式协调服务,保证了扩展性,可靠性,时序性,快速。

2.1 扩展性

  • 框架架构

角色: leader,follower,observer

  • 读写分离

observer 方法查询能力
只有follower 才能选举

2.2 可靠性

  • 快速恢复leader
  • 数据可用,可靠,一致性

分布式:ZAB — 作用在可用状态,leader存在时

2.3 时序性

ZAB 协议发送消息使用队列,FIFO,保证顺序行

2.4 ZAB — 原子广播协议

Zookeeper 数据一致性协议。

2.5 Zookeeper 崩溃恢复

Leader 选举

  1. 先比较 zxid
  2. 如果 zxid 相等,再比较myid

3888 造成两两通信
只要任何人投票,都会促发准 leader 发起自己的投票
Zookeeper 选举是退选制,如果 zxid 相同,再比较 myid

2.6 Zookeeper Watch 机制watcher

watcher事件只监听一次

3 Zookeeper 应用

3.1 分布式配置

使用 watch 机制监听配置节点,修改后促发监听

3.2 分布式锁

  • 多个服务间争抢锁,只有一个人才能获取锁
  • 获得锁的人,临时节点(session)
  • 获取锁的人成功了,释放锁
  • 锁被释放、删除,别人怎么知道

主动轮询,心跳

弊端:延时、压力

Watch 解决延时问题

弊端:压力(多个服务重新争抢锁)

sequence + watch

每个节点都 watch 前一个节点
最小的节点获取锁
最小的释放锁,成本:zk 只需要给第二个节点发事件回调