Zookeeper 从入门到入土①:概述

1. 概述

ZooKeeper 是一个分布式协调中间件,是 Google 的 Chubby 一个开源的实现。它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

特性:

  • 顺序一致性: 客户端的更新将按顺序执行。因其写操作完全由单一 Leader 节点来执行(事务 id)
  • 原子性:         操作要么成功要么失败(事务)
  • 单一视图:     无论连接到哪个节点,客户端都能看到相同的视图。(恢复模式 + 广播模式)
  • 及时性:         在特定时间范围内的数据是最新的。由最终一致性保证,同步需一定时间(数据同步)
  • 可靠性:
    • 数据不会丢失。zk 是将数据存储到内存中的,所以肯定会有持久化(日志 + 快照)
    • 快速恢复 Leader。恢复模式(选主 + 数据同步)

2. 配置

conf/zoo.cfg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 计算时间的基本单元 ms
tickTime=2000
# 允许从节点连接并同步到主节点的初始化连接时间,以 tickTime 为单位
initLimit=10
# 主节点与从节点请求和应答(心跳)的时间长度,以 tickTime 为单位
syncLimit=5
# 快照及 Log 存储位置
dataDir=/usr/local/zookeeper/dataDir
dataLogDir=/usr/local/zookeeper/dataLogDir
# 服务端口
clientPort=2181
# host1
server.1=0.0.0.0:2888:3888
# host2
server.2=121.43.178.178:2888:3888
# host3
server.3=47.99.220.125:2888:3888
# host4,observer 角色
server.4=49.56.165.144:2888:3888:observer

集群:

  1. 创建 dataDir/myid,内容为 1 代表 id 为 1。其他实例同上创建不同 id 的 myid 文件
  2. server. 服务器 id = 服务器 ip: 服务器之间的通信端口:服务器之间的投票选举端口
    1
    2
    3
    4
    5
    6
    # host1 当前机器的 host,用 0.0.0.0 表示
    server.1=0.0.0.0:2888:3888
    # host2
    server.2=121.43.178.178:2888:3888
    # host3
    server.3=47.99.220.125:2888:3888

3. 启动

启动服务:

1
./zkServer.sh start

启动客户端:

1
./zkCli.sh

查看启动状态:

1
./zkServer.sh status

4. Session

  • 每当客户端连接到服务端会创建一个 SessionId。创建 / 删除 SessionId 也是事务操作,会有 zxid,会被同步到所有节点中
  • Session 过期,则根据该 Session 创建的临时节点 znode 都会被抛弃
  • 可设置超时时间。未超时的情况下,客户端 api 若保存了 SessionId,重连后 Session 不会消失(还是原来的 Session)
  • 心跳机制

5. 基本模型

5.1. Zookeeper 抽象模型

Zookeeper 提供了一种树形结构级的命名空间
为了保证高吞吐和低延迟,Zookeeper 在内存中维护了这个树状的目录结构,这种特性使得 Zookeeper 不能用于存放大量的数据,每个节点的存放数据上限为 1M

5.2. 节点类型

  • 永久无序节点: 不会因为会话结束或者超时而消失
  • 永久有序节点: 不会因为会话结束或者超时而消失,且有序
  • 临时无序节点: 如果会话结束或者超时就会消失
  • 临时有序节点: 如果会话结束或者超时就会消失,且有序

    有序节点:会在节点名的后面加一个数字后缀,并且是有序的,例如生成的有序节点为 /lock/node-0000000000,它的下一个有序节点则为 /lock/node-0000000001,以此类推