ZooKeeper-定位:能解决什么问题?不能解决什么问题?

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

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

    • ZooKeeper 是用于简化分布式应用开发的,对开发者屏蔽一些分布式应用开发过程中的底层细节
    • ZooKeeper 对外暴露简单的 API,用于支持分布式应用开发
    • ZooKeeper 在提供上述功能的同时,其还是一个 高性能、高可用、高可靠的分布式集群

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

      1. 分布式应用开发,有哪些常见问题?ZK 是如何屏蔽这些底层细节的?
      2. ZooKeeper 对外暴露了那些 API?这些 API 如何支持分布式应用开发的?这些 API 还能简化吗?API 的语义性怎么样?
      3. ZooKeeper 自身是一个高性能、高可用、高可靠的分布式集群,那有个简单的问题:
      • 高性能是指什么?ZooKeeper 为了达到高性能,做了哪些工作?
      • 高可用同上
      • 高可靠同上

        Note:本篇 wiki 就是为了解决上述第一个疑问的。(其他疑问会在其他 blog 中逐步解答)

        为什么有 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 发起的事务请求,严格按照发起顺序执行

                  最后

                  自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

                  深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

                  因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

                  既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

                  如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

                  由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

                  容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618191877)

                  由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!