zoukankan      html  css  js  c++  java
  • ZooKeeper 到底解决了什么问题?

    点击上方“开源Linux”,选择“设为星标”
    回复“学习”获取独家整理的学习资料!
    

    目标

    ZooKeeper 很流行,有个基本的疑问:

    • ZooKeeper 是用来做什么的?

    • 之前没有ZK,为什么会诞生 ZK?

    OK,解答一下上面的疑问:(下面是凭直觉说的)

    • ZooKeeper 是用于简化分布式应用开发的,对开发者屏蔽一些分布式应用开发过程中的底层细节

    • ZooKeeper 对外暴露简单的 API,用于支持分布式应用开发

    • ZooKeeper 在提供上述功能的同时,其还是一个 高性能、高可用、高可靠的分布式集群

    上面说这么多,总结一下,ZK 能解决分布式应用开发的问题,ZK 能很好的解决问题。到这一步,疑问就更多了:

    1. 分布式应用开发,有哪些常见问题?ZK 是如何屏蔽这些底层细节的?

    2. ZooKeeper 对外暴露了哪些 API?这些 API 如何支持分布式应用开发的?这些 API 还能简化吗?API 的语义性怎么样?

    3. ZooKeeper 自身是一个高性能、高可用、高可靠的分布式集群,那有个简单的问题:

    • 高性能是指什么?ZooKeeper 为了达到高性能,做了哪些工作?

    • 高可用同上

    • 高可靠同上

    Note:本篇 wiki 就是为了解决上述第一个疑问的。(其他疑问请持续关注公众号互联网架构师,会逐步进行解答)

    为什么有 ZooKeeper

    一个应用程序,涉及多个进程协作时,业务逻辑代码中混杂有大量复杂的进程协作逻辑。

    上述多进程协作逻辑,有 2 个特点:

    • 处理复杂

    • 处理逻辑可重用

    因此,考虑将多进程协作的共性问题拎出,作为基础设施,让 RD 更加专注业务逻辑开发,即:

    ZooKeeper 就是上述多进程协作基础服务的一种。

    ZooKeeper 的特点

    ZooKeeper 有几个简单特点:

    • ZooKeeper 的 API:从 文件系统 API 得到的启发,提供简单的 API

    • ZooKeeper 运行在专用服务器上,跟业务逻辑分离,保证了高容错性可扩展性

    ZooKeeper 是存储设施,但特别注意

    • ZK上存储的数据聚焦为:协作数据元数据),而不是应用数据,应用数据有自己的存储方案,例如 HDFS 等

    • ZK 本质上,可以看作一种特殊的 FS

    特别说明:

    应用数据和元数据,由于使用场景不同,对一致性和持久性的要求有差异, 因此,架构设计、数据治理过程中,应将 2 类数据独立看待、独立存储。

    ZooKeeper 的使命

    ZK 要解决的核心问题:

    ZK 目标:简化分布式应用开发中,多进程协作问题。为分布式应用,提供高效可靠的分布式协调服务(基础服务),例如:

    • 统一的命名服务

    • 分布式锁

    • 进程崩溃检测

    • Leader 选举

    • 配置管理:配置变更时,及时下发到各个 Client。

    一个简单的问题:多进程的协作是什么?面对这个问题,还是回答一下。

    多进程协作,整体分为 2 类:

    1. 协作:多进程需要一同处理某些事情,一些进程采取行动使得其他进程能够正常工作,例如:主从结构,M 向 S 分配任务,S 才会执行,否则 S 就保持空闲状态

    2. 竞争:两个进程不能同时工作,一个进程必须等待另个进程执行完毕,例如:主从结构,M 节点失效后,很多 S 都想成为 M,这时,就需要互斥锁,只有第一个获得锁的 S 成为 M

    特别说明:

    1. 不跨网络协作:多进程,可以在同一台物理主机上,同步原语很方便(比如?管道、共享内存、消息队列、信号量)

    2. 跨网络协作:多进程,分布在不同的物理主机上,ZK 关注这一类

    跨网络多进程协作,进程通信,基本思路有 2 个:

    1. 消息机制:通过网络,直接信息交换,多消息传递算法,实现同步原语

    2. 共享存储:利用外部共享存储,实现多进程协作,要求共享存储提供有序访问,ZK 采用这种方式

    真实系统中,跨网络通信,有几个共性问题:

    1. 消息延迟:由于网络原因,后发送先到达

    2. 处理器性能:由于系统调度原因,消息到达后,延迟处理

    3. 时钟偏移:不同物理主机,时钟发生偏移

    ZK 精心设计用于屏蔽上述 3 个共性问题,使得这些问题在应用服务层面完全透明化。

    ZooKeeper 特性

    ZooKeeper 解决的本质问题

    分布式系统的一致性问题:

    1. 消息传递:延迟性,先发送的消息,不一定先到达;

    2. 消息传递:丢失性,发送的消息,可能丢失;

    3. 节点崩溃:分布式系统内,任何一个节点都可能崩溃;

    在这种情况下,如何保证数据的一致性?

    1. 提案投票:基于投票策略,2PC

    2. 选举投票:基于投票策略,投出优先级最高的节点(包含最新数据的节点)

    Paxos 目标:解决分布式一致性问题,提高分布式系统容错性的一致性算法。

    Paxos 本质:基于消息传递高度容错一致性算法

    ZooKeeper 定位

    ZooKeeper :

    1. 分布式协调服务

    2. 高效、可靠

    3. 方便应用程序,聚焦业务逻辑开发,而不需要过多关注分布式进程间协作细节

    ZooKeeper 不直接暴露原语,而是,暴露一部分调用方法组成的 API,类似文件系统的 API,支持应用程序实现自己的原语

    ZooKeeper 特性

    ZooKeeper 可以保证如下分布式一致性特性:

    • 顺序一致性:同一个 Client 发起的事务请求,严格按照发起顺序执行

    • 原子性:事务请求,要么应用到所有节点,要么一个节点都没有应用

    • 单一视图:Client 无论连接到哪个节点,看到的服务端数据都是一致的(Note:不准确,其实是最终一致性

    • 可靠性:事务一旦执行成功,状态永久保留

    • 实时性:事务一旦执行成功,Client 并不能立即看到最新数据,但 ZooKeeper 保证最终一致性

    ZooKeeper 设计目标

    ZooKeeper 致力于提供高性能高可用顺序一致性的分布式协调服务,保证数据最终一致性。关注公众号互联网架构师回复2T可以获取 Zookeeper 及 Java系列架构视频。

    目标一:高性能(简单的数据模型)

    1. 采用树形结构组织数据节点;

    2. 全量数据节点,都存储在内存中;

    3. Follower 和 Observer 直接处理非事务请求;

    目标二:高可用(构建集群)

    1. 半数以上机器存活,服务就能正常运行

    2. 自动进行 Leader 选举

    目标三:顺序一致性(事务操作的顺序)

    1. 每个事务请求,都会转发给 Leader 处理

    2. 每个事务,会分配全局唯一的递增id(zxid,64位:epoch + 自增 id)

    目标四:最终一致性

    1. 通过提议投票方式,保证事务提交的可靠性

    2. 提议投票方式,只能保证 Client 收到事务提交成功后,半数以上节点能够看到最新数据

    ZooKeeper 出现之前

    ZK 出现之前,分布式系统常用两种方式,实现多进程协作:

    1. 分布式锁管理器

    2. 分布式数据库

    ZK 更专注于进程协作,而不提供任何锁接口和通用的存储数据接口。(疑问:ZK 也可以提供啊,我们不使用就行了)

    应用服务器,常见的 2 种需求:

    1. Master-Slave Leader 选举:要求提供Master节点选举功能

    2. 进程响应跟踪 崩溃检测:要求提供进程存活状态的跟踪

    3. 分布式锁:互斥排它锁

    ZK 为上述 2 种策略提供了基础 API。

    ZooKeeper 不适用的场景:

    1. 海量数据存储:ZK 本质是特殊的 FS,但 ZK 用于存储元数据,需要单独存储应用数据

    术语介绍

    术语解释
    分布式系统跨多个物理主机,由多个独立运行的节点组成的系统
    原语业务上不可分割的元素/过程,举例:分布式锁原理,可以暴露创建查询释放几个方法


    作者:NingG

    地址:http://ningg.top/zookeeper-positioning/

    参考资料

    [1]

    ZooKeeper-Distributed Process Coordination: http://shop.oreilly.com/product/0636920028901.do

    [2]

    从Paxos到Zookeeper分布式一致性原理与实践: https://book.douban.com/subject/26292004/

    - End -

    关注「开源Linux」加星标,提升IT技能
    
    
    十年磨一剑
  • 相关阅读:
    关于下拉框在页面加载时候选中值得问题
    《锋利的jQuery》要点归纳(二) jQuery中的DOM操作(上)
    《锋利的jQuery》要点归纳(三) jQuery中的事件和动画(下:动画篇)
    《锋利的jQuery》要点归纳(四)jQuery对表单、表格的操作及更多应用(上:表单应用)
    getElementById函数的一些发现
    《锋利的jQuery》要点归纳(三) jQuery中的事件和动画(上:事件篇)
    《锋利的jQuery》要点归纳(四)jQuery对表单、表格的操作及更多应用(中:表格应用)
    BENNY妙笔生花博皮博客园即将发布
    《锋利的jQuery》要点归纳(二) jQuery中的DOM操作(下)
    《锋利的jQuery》要点归纳(一) jQuery选择器
  • 原文地址:https://www.cnblogs.com/qinlulu/p/14671450.html
Copyright © 2011-2022 走看看