深入了解ZooKeeper(二)

1.内容思维导图2.ZooKeeper提供了什么?2.1设计原则(1)最终一致性client不论连接到哪个Server,展示给它的都是同一个视图(2)可靠性具有简单、健壮、良好的性能

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

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

1. 内容思维导图

深入了解ZooKeeper(二)

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中的角色主要有以下三类,如下表所示:

  深入了解ZooKeeper(二)

2.3 文件系统

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

  深入了解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 系统模型

  深入了解ZooKeeper(二)

3. 我们用Zookeeper能做什么?

3.1 命名服务

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

3.2 配置管理

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

  深入了解ZooKeeper(二)

3.3 集群管理

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

(1)机器退出和加入

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

(2)master选举

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

  深入了解ZooKeeper(二)

3.4 分布式锁

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

(1)保存独占

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

(2)控制时序

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

  深入了解ZooKeeper(二)

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台)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120097.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月28日 下午9:00
下一篇 2021年12月28日 下午9:00


相关推荐

  • k8s 超详细总结,面试必问

    k8s 超详细总结,面试必问一个目标 容器操作 两地三中心 四层服务发现 五种 Pod 共享资源 六个 CNI 常用插件 七层负载均衡 八种隔离维度 九个网络模型原则 十类 IP 地址 百级产品线 千级物理机 万级容器 相如无亿 K8s 有亿 亿级日服务人次 一个目标 容器操作 Kubernetes k8s 是自动化容器操作的开源平台 这些容器操作包括 部署 调度和节点集群间扩展 具体功能 自动化容器部署和复制 实时弹性收缩容器

    2026年3月17日
    2
  • git常用命令大全「建议收藏」

    git常用命令大全「建议收藏」1.强制推送(慎用,除非你认为其他冲突等可以丢弃或者不是很重要)gitpush–force2.创建文件等小命令toucha//创建一个a文件echo1234>>a//把1234这个内容放入a文件cata//打开a文件读取出a文件中的内容mkdirtest//创建test文件夹rm文件名//删除文件pwd//打印…

    2022年5月30日
    45
  • Android Studio使用技巧系列教程(二)

    Android Studio使用技巧系列教程(二)

    2022年1月31日
    63
  • Android基于百度OCR识别图片中的文字

    Android基于百度OCR识别图片中的文字    OCR(OpticalCharacterRecognition),即光学字符识别,指的是针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。简单的来说,OCR技术就是可以把图片上的文字识别出来,并以文本格式的形式提取出来。    该技术已广泛应用于生活中。比如很多翻译软件都有的拍照翻译功能,就利用了该技术。这里尝试使用百度OCR接口实现Android拍照识别文字功能。请求模块定义   

    2022年5月13日
    46
  • 长亮科技(300348.SZ):公司在AI智能体上早在2025年已经有相关的研发与布局

    长亮科技(300348.SZ):公司在AI智能体上早在2025年已经有相关的研发与布局

    2026年3月13日
    2
  • 如何实现分布式缓存_分布式数据库缓存

    如何实现分布式缓存_分布式数据库缓存本文转载自https://msdn.microsoft.com/zh-cn/library/ff384253.aspx,主要内容是对msdn中对AppFabric分布式缓存的介绍的整合以及一些自己的理解。AppFabric是什么  AppFabric是微软提供的可以集成到Web应用程序和桌面应用程序的分布式缓存。其原名为Velocity,后更名为AppFabric。AppFabric能够提高

    2022年10月16日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号