在上篇博客<<深入了解ZooKeeper(一)>>中我们知道了分布式协调技术、分布式锁的实现和zookeeper服务机制,接下来将进一步了解zookeeper究竟能为我们做了什么以及如何去实现的!

1. 内容思维导图

2. ZooKeeper提供了什么?

2.1 设计原则

(1)最终一致性

  client不论连接到哪个Server,展示给它的都是同一个视图

(2)可靠性

  具有简单、健壮、良好的性能,如果消息messgae被一台服务器接受,那么它将被所有的服务器接受

(3)实时性

  Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口

(4)等待无关(wait-free)

  慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待

(5)原子性

  更新智能成功或者失败,没有中间状态

(6)顺序性

  包括全局有序和偏序两种,全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面

2.2 角色

  Zookeeper中的角色主要有以下三类,如下表所示:

  

2.3 文件系统

  Zookeeper维护一个类似文件系统的数据结构:

  

  每个子目录都被称为znode,和文件系统一样可以增加、删除和修改,唯一不同的是znode可以存储数据,znode有四种类型:

(1)PERSISTENT-持久化目录节点

  客户端与zookeeper断开连接后,该节点依旧存在

(2) PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点

  客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号

(3)EPHEMERAL-临时目录节点

  客户端与zookeeper断开连接后,该节点被删除

(4)EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点

  客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

2.4 通知机制

  客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。watch触发器实现zookeeper的通知机制,关于watch的触发机制看上篇博客。

2.5 系统模型

  

3. 我们用Zookeeper能做什么?

3.1 命名服务

   这个似乎最简单,在zookeeper的文件系统里创建一个目录,即有唯一的path。在我们使用tborg无法确定上游程序的部署机器时即可与下游程序约定好path,通过path即能互相探索发现,不见不散了。

3.2 配置管理

     程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难。好吧,现在把这些配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中就好。

  

3.3 集群管理

  所谓集群管理无在乎两点:是否有机器退出和加入、选举master

(1)机器退出和加入

  所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它上船了。新机器加入 也是类似,所有机器收到通知:新兄弟目录加入,highcount又有了。

(2)master选举

  我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为master就好

  

3.4 分布式锁

   有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。

(1)保存独占

  我们将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。厕所有言:来也冲冲,去也冲冲,用完删除掉自己创建的distribute_lock 节点就释放出锁。

(2)控制时序

   /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次进行

  

3.5 队列管理

  两种类型的队列:

(1) 同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达

  在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目

(2)队列按照 FIFO 方式进行入队和出队操作

  和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号

4. Zookeeper如何实现集群维护一个文件系统的?

4.1 分布式与数据复制

  Zookeeper作为一个集群提供一致的数据服务,自然,它要在所有机器间做数据复制。

4.1.1 数据复制的好处

(1)容错

  一个节点出错,不致于让整个系统停止工作,别的节点可以接管它的工作

(2)提高系统的扩展能力

  把负载分布到多个节点上,或者增加节点来提高系统的负载能力

(3)提高性能

  让客户端本地访问就近的节点,提高用户访问速度

4.1.2 数据复制集群系统分类

  从客户端读写访问的透明度来看,数据复制集群系统分下面两种:

(1)写主(WriteMaster)

  对数据的修改提交给指定的节点。读无此限制,可以读取任何一个节点。这种情况下客户端需要对读与写进行区别,俗称读写分离

(2)写任意(Write Any)

  对数据的修改可提交给任意的节点,跟读一样。这种情况下,客户端对集群节点的角色与变化透明  

  对zookeeper来说,它采用的方式是写任意。通过增加机器,它的读吞吐能力和响应能力扩展性非常好,而写,随着机器的增多吞吐能力肯定下降(这 也是它建立observer的原因),而响应能力则取决于具体实现方式,是延迟复制保持最终一致性,还是立即复制快速响应。我们关注的重点还是在如何保证数据在集群所有机器的一致性,这就涉及到paxos算法。

4.2 数据一致性与paxos算法 

  据说Paxos算法的难理解与算法的知名度一样令人敬仰,所以我们先看如何保持数据的一致性,这里有个原则就是:

  在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致的状态。

Paxos算法解决的什么问题呢,解决的就是保证每个节点执行相同的操作序列。好吧,这还不简单,master维护一个全局写队列,所有写操作都必须 放入这个队列编号,那么无论我们写多少个节点,只要写操作是按编号来的,就能保证一致性。没错,就是这样,可是如果master挂了呢。

Paxos算法通过投票来对写操作进行全局编号,同一时刻,只有一个写操作被批准,同时并发的写操作要去争取选票,只有获得过半数选票的写操作才会被 批准(所以永远只会有一个写操作得到批准),其他的写操作竞争失败只好再发起一轮投票,就这样,在日复一日年复一年的投票中,所有写操作都被严格编号排 序。编号严格递增,当一个节点接受了一个编号为100的写操作,之后又接受到编号为99的写操作(因为网络延迟等很多不可预见原因),它马上能意识到自己 数据不一致了,自动停止对外服务并重启同步过程。任何一个节点挂掉都不会影响整个集群的数据一致性(总2n+1台,除非挂掉大于n台)。

深入了解ZooKeeper(二)的更多相关文章

  1. Zookeeper(二) zookeeper集群搭建 与使用

    一.zookeeper集群搭建 鉴于 zookeeper 本身的特点,服务器集群的节点数推荐设置为奇数台.我这里我规划为三台, 为别为 hadoop01,hadoop02,hadoop03    1. ...

  2. Hadoop 部署之 ZooKeeper (二)

    目录 一.Zookeeper功能简介 二.ZooKeeper基本概念 1.集群角色 三.ZooKeeper 的安装 1.下载安装(在datanode节点安装) 2.配置ZooKeeper环境变量 3. ...

  3. 1.9 分布式协调服务-Zookeeper(二)

    zoo.cfg配置文件分析 tickTime=2000  zookeeper中最小的时间单位长度 (ms) initLimit=10  follower节点启动后与leader节点完成数据同步的时间 ...

  4. Zookeeper(二)数据模型

    Zookeeper数据模型ZNode 问题 ZK的数据模型ZNodes是什么样的: 树形结构,每个叶子节点都存储着数据,且可挂载子节点: 路径作为叶子节点名称,数据作为叶子节点内的数据: Znode可 ...

  5. Dubbo+Zookeeper(二)Dubbo架构

    上次更新博客已经是一年前,这一年发生了很多事,并不顺利,甚至有些痛苦,不过不管怎样,不要停止学习,只有学习才能让你变强,应对更多不安定. 一.RPC概念 Dubbo服务是一个RPC框架,那我们首先就要 ...

  6. zookeeper (二) paxos & fast paxos & FastLeaderElection

    参考文章: http://blog.csdn.net/xhh198781/article/details/10949697 paxos->fast paxos->FastLeaderEle ...

  7. solrCloud+tomcat+zookeeper配置

    一.环境准备: Solr版本:4.7.0 下载地址:http://www.apache.org/dyn/closer.cgi/lucene/solr/4.7.0 Tomcat版本:6.0.39 下载地 ...

  8. zookeeper环境搭建及使用

    本文只讲解搭建步骤,先不讲原理相关知识 一.zookeeper下载地址 本文使用版本为zookeeper-3.4.10.tar.gz 地址:http://mirrors.shuosc.org/apac ...

  9. Zookeeper安装使用

    一:zookeeper介绍 Zookeeper 分布式协调组件.本质一个软件. Zookeeper常用功能 1 发布订阅功能.把zookeeper当作注册中心原因. 2 分布式/集群管理功能. 使用j ...

  10. java 操作zookeeper

    java 操作zookeeper(一) 首先要使用java操作zookeeper,zookeeper的javaclient 使我们更轻松的去对zookeeper进行各种操作,我们引入zookeeper ...

随机推荐

  1. js 三元表达式 复杂写法

    a = 0 b = 0 a === 0 && (a = 1,b = 2) a === 1 ? (a = 3,alert(b)) : (b = 4) a === 1 || alert(a ...

  2. dojo 官方翻译 dojo/aspect

    官网地址:http://dojotoolkit.org/reference-guide/1.10/dojo/aspect.html after() 定义:after(target, methodNam ...

  3. 一个linux命令(6/12):cat 命令

    cat主要有三大功能:1.一次显示整个文件.$ cat filename2.从键盘创建一个文件.$ cat > filename     只能创建新文件,不能编辑已有文件.3.将几个文件合并为一 ...

  4. CAS单点登出的原理

    单点登出功能跟单点登录功能是相对应的,旨在通过Cas Server的登出使所有的Cas Client都登出. Cas Server的登出是通过请求“/logout”发生的,即如果你的Cas Serve ...

  5. app自动化测试-appium

    一.环境准备(windows) 1.安装Microsoft .NET Framework 4.5 双击运行如下文件:net4.5.1.exe 2.安装node-v6.11.4-x64.msi 双击运行 ...

  6. 饭卡管理系统学生E-R图

    - 2 - 1.1 可行性分析 1.1.1 项目背景 近年来学生食堂饭卡的使用给高校餐饮管理带来了一次革命, 从结算方式到账户管理, 从卫生便捷到数据统计等,不仅给就餐者带来了方便,也使餐饮结算手段发 ...

  7. 定制kali linux

    Kali Linux Ps: Kali发布撸~ 写了个如此装13的标题.这是一个Guide… 都是些基本操作撸.定制为王实推 ArchLinux.  各位看官继续………………………………………号外.L ...

  8. python 读取libsvm文件

    以下三种方式 # -*- coding:utf-8 -*- import numpy as np import os from sklearn import datasets def data_gen ...

  9. Effective C++ 条款01:视C++为一个语言联邦

    四个次语言 C Object-Oriented C++ Template C++ STL

  10. 标记语言XML

    标记语言概述 标记语言,是一种将文本(Text)以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码.一部分是标记,一部分是标记中的内容,两部分构成标记语言   <标记 ...