$ 《ZooKeeper分布式过程协同技术详解》笔记

$ 第一章

$ 1.1 ZooKeeper的使命

它可以在分布式系统 中协作多个任务。一个协作任务是指一个包含多个进程的任务,这个任务可以是为了协作或者是为了竞争。

ZooKeeper客户端功能包括:

  • 保障强一致性、有序性和持久性
  • 实现通用的同步原语的能力
  • 提供了一种简单的并发处理机制

ZooKeeper不适用于海量数据存储。

$ 1.2 示例:主-从应用

主-从架构:一个在分布式系统中得到广泛应用的架构。主节点进程负责跟踪从节点状态和任务的有效性,并分配任务到从节点。对于ZooKeeper来说,这个架构风格具有代表性,阐述了大多数流行的任务,如:

  • 选举主节点
  • 跟踪有效的从节点
  • 维护应用元数据

要实现主从模式的系统,必须解决以下三个关键问题:

  • 主节点崩溃(备份主节点故障转移,避免脑裂)
  • 从节点崩溃(主节点检测从节点崩溃的能力,消除崩溃副作用)
  • 通信故障(从节点适应多个从节点执行相同任务的可能性)

主从架构需求:

  • 主节点选举
  • 崩溃检测
  • 组成员关系管理
  • 元数据管理

$ 第2章

$ 2.1 ZooKeeper基础

ZooKeeper并不直接暴露原语,它暴露了由一小部分调用方法组成的类似文件系统的API,以便允许应用实现自己的原语。

$ API概述

  • create /path data
  • delete /path
  • exists /path
  • setData /path data
  • getData /path
  • getChildren /path

ZooKeeper不允许局部写入或读取znode的数据。

$ znode类型

  • persistent
  • ephemeral
  • persistent_sequential
  • ephemeral_sequential

$ 监视与通知

为了替换客户端的轮询,选择了基于通知的机制。

客户端必须在每次通知后设置一个新的监视点。

通知机制的一个重要保障是,对同一个znode的操作,先向客户端传送通知,然后再对该节点进行变更。保证客户端以全局的顺序观察zookeeper的状态。

$ 版本

使用版本来阻止并行操作的不一致性。

每个znode都有一个版本号,它随着每次数据变化而自增。

两个API setData和delete调用以版本号为传入参数,只有当传入参数的版本号与服务器上的版本号一致时调用才会成功。

$ zookeeper仲裁

$ 会话

客户端提交给zookeeper的所有操作均关联在一个会话上,会话终止=>会话期间创建的临时节点消失。

会话提供了顺序保证。

会话的状态:

NOT_CONNECTED => CONNECTING <=> CONNECTED => CLOSED
                     |_________________________↑

客户端尝试连接到一个不同的服务器时,这个服务器的状态要与最后连接的服务器的zookeeper状态保持最新。

$ 主从模式例子的实现

主从模式的模型包括三个角色:

  • 主节点
  • 从节点
  • 客户端

实现过程:

创建主节点:

create -e /master "master2.example.com:223"

创建一些必要节点:

create /workers ""
create /tasks ""
create /assign "" 

主节点监视/workers, /tasks子节点变化:

ls /workers true
ls /tasks true

从节点创建:

create -e /workers/worker1.example.com "worker1.example.com:2224"

从节点准备接收任务:

create /assign/worker1.example.com "" 

从节点等待任务分配:

ls /assign/worker1.example.com true

客户端提交任务,并监视新建的/tasks/task-0000000000子字节:

create -s /tasks/task- "cmd"

从节点执行完毕,更新任务状态:

setData /tasks/task-0000000000/status "done"

客户端检查结果:

get /tasks/task-0000000000

$ 第三章

一个对象的构造函数没有返回前不要调用其他函数。

更新时间: 8/29/2020, 9:01:17 AM