极客时间已完结课程限时免费阅读

22 | 从阿里内部产品看海量数据处理系统的设计(下):架构与创新

22 | 从阿里内部产品看海量数据处理系统的设计(下):架构与创新-极客时间

22 | 从阿里内部产品看海量数据处理系统的设计(下):架构与创新

讲述:李智慧

时长10:34大小9.65M

上一期,Doris 提出了目前阿里巴巴海量 KV 存储方面的问题,给出了 Doris 的业务价值、设计目标和技术指标。但是 Doris 项目组还必须证明自己有已经经过论证的架构技术方案,可以实现前面设定的目标,立项后可以迅速启动执行,不需要再去摸索尝试,风险可以把控。
因此,PPT 后面的内容主要就是阐述Doris 的架构方案和创新设计
Doris 是一种支持 Key、Value 数据结构的分布式存储系统,核心要解决的问题是分布式路由、分布式集群伸缩、分布式数据冗余与失效转移。所以 Doris 把分布式存储系统很重要的一块,也就是数据存储部分转移出去,使用第三方软件完成,当时选择 Berkeley DB 作为 Doris 的底层存储 Store,Doris 自己专注于分布式技术实现。
Doris 的主要访问模型是,应用程序 KV Client 启动后,连接控制中心 Administration,从控制中心获得整个 Doris 集群的服务器部署信息及路由算法,Client 使用 Key 作为参数进行路由计算,计算得到集群中某些服务器作为当前 Key、Value 数据存储的服务器节点;然后 KV Client 使用自定义的通信协议将数据和命令传输给服务器上的 Data Server 组件,DataServer 再调用本地的 Berkeley DB 将数据存储到本地磁盘。
Doris 的核心技术就是这个架构模型上创新性地实现了自己独特的分区路由算法、失效转移策略、集群伸缩设计方案。并在项目开发过程中,将这个三个技术创新申请了技术专利。下面我们重点看下这三个技术创新。

分区路由算法

Doris 采用一种基于虚拟节点的分区路由算法,Key 使用余数 Hash 算法计算得到虚拟节点下标。
虚拟节点下标 = hash(md5(key)) mod 虚拟节点个数
虚拟节点和物理服务器节点之间计算建立一个映射关系,通过映射关系查找实际要访问的物理服务器 IP 地址。
路由算法在初始化的时候就预先设立一个较大的数字,比如 100000,当存储服务器集群需要伸缩的时候,要增加一个服务器,虚拟节点和下标计算算法不变,仅仅调整虚拟节点和物理服务器节点的映射关系就可以了,如 PPT 中图 2 所示。
这种基于虚拟节点的分区路由算法相对于传统的一致性 Hash 路由算法,可以获得更好的数据负载均衡,即数据在各个服务器上的存储分布更加均衡。在集群伸缩、增加服务器的时候可以做到更少迁移数据。在实践中,这种算法的一个更大优势是,如果将物理存储的文件系统和虚拟节点关联,即一个虚拟节点对应一个物理存储文件,那么当集群扩容,进行数据迁移的时候,就可以以文件为单位进行数据拷贝,这样迁移速度和运维成本都非常低。
这个基于虚拟节点的分区路由算法的关键难点是,如何计算虚拟节点与物理节点的映射关系,特别是在增加服务器的时候,如何重新计算这个映射关系,使新的映射关系依然处于负载均衡的状态,也就是每个物理节点映射的虚拟节点个数差不太多相同。
项目组抽象了一个数学公式完成映射关系的计算,你可以看上面 PPT 示例。

失效转移策略

在前面在技术指标上,曾经承诺 Doris 的可用性为 99.997%,保证数据可用性的策略主要是数据存储冗余备份和数据访问失效转移。
我们先看下 Doris 如何实现冗余备份。
Doris 将存储服务器集群分成多个 group(默认情况下为 2 个 group),数据写操作的时候,根据分区路由算法,在每个 group 里计算一个服务器地址,异步并发同时向多个 group 的服务器上写入数据,以此保证数据有多个备份。
当 KV Client 访问某台服务器失败的时候,Doris 会启动失效转移策略。具体来说,Doris 将失效分为三种情况:瞬时失效、临时失效、永久失效,不同情况采用不同的失效转移策略。
当第一次不能访问服务器的时候,Doris 认为这是瞬时失效,会进行访问重试,如果三次重试后仍然失败,就会把失败信息提交给控制中心。控制中心检测该服务器心跳是否正常,并进行尝试访问,如果访问失败,就将该服务器标记为临时失效,并通知所有 KV Client 应用程序。
KV Client 应用程序收到服务器失效通知的时候,启动临时失效策略,将原本需要写入到失效节点(图中的物理节点 2)的数据写入临时日志节点(图中的物理节点 X),而读操作则只访问正常的物理节点 1。
当临时失效节点 2 恢复正常运行,系统会将失效期间写入临时日志节点 X 的数据合并恢复到物理节点 2,这段时间物理节点 2 只提供写服务,不提供读服务。当所有数据恢复完毕,集群访问恢复正常。
而对于永久失效的节点,需要添加新的服务器以代替下线的服务器,基本策略就是将另一个 group 正常使用的服务器数据拷贝到新添加的服务器上即可。
需要说明的是,上述三种失效转移过程,除了服务器永久失效后,需要工程师手动添加服务器,并到控制中心添加新服务器配置、激活启用外,其他情况不需要任何人工干预,全部自动化完成。

集群伸缩设计

分布式系统的一个重要设计目标是集群弹性可伸缩,如果当前的服务器数目不能满足业务的负载压力要求,那么就添加更多的服务器去增强处理能力。对于分布式数据存储服务器的伸缩性扩容而言,必然伴随着数据的迁移,就是将原先服务器中的部分数据迁移到新的服务器上。
具体过程为:
1. 向集群中一个分组 group 添加新的物理服务器,部署并启动 Doris 服务器进程。
2. 将这个 group 的所有服务器设置为临时失效。
3. 使用路由算法重新计算加入服务器后的虚拟节点分布,并把需要迁移的虚拟节点对应的物理文件拷贝到新服务器上。
4. 设置 group 所有服务器临时失效恢复,将扩容期间的数据更新写回到这些服务器。
至此,PPT 最前面提出的设计目标,经过一系列的关键技术设计分析,证明是技术是可行的,风险是可控的,可以启动开发了。
实际上当时项目组大概花了半年的时间开发 Doris 系统,部署上线以后,阿里巴巴多个业务产品接入 Doris,并在极少运维的情况下,无故障运行了数年。后来服务器集群经过几次扩容,规模达到数百台服务器,实践证明当时的设计是经得起考验的。
最后,我想再说一下关于专利的事。公司一般都是希望能够申请更多的技术专利,这样在跟其他公司进行专利大战的时候才能做到“手中有枪,心中不慌”,特别是在遇到“专利流氓”的时候。所以大部分公司对工程师申请技术专利都比较支持。
大一点的公司法务部门通常会有专门的知识产权律师,他们会帮助工程师申请技术专利,工程师只要按照一般写技术文档的写法写一个技术交底书给公司律师,律师审核后会让专门的专利代理公司帮助编写专门的技术专利申请书,所以工程师申请专利的工作量并不大。
很多公司为了支持申请技术专利,会有很多奖励,比如申请成功一个专利会有几万的奖励,这对于工程师也是一笔不错的收入。做技术的同学可以关注下自己公司的专利奖励政策,如果还没有相关的专利奖励,正好你也可以借此机会说服公司管理层在这方面增加一些激励,这是一件利国家、利公司、利自己的好事。

小结

分布式数据存储系统是分布式系统中最有技术挑战的领域之一。其他的各种分布式系统,由于对数据的一致性和系统的可用性要求并没有那么高 ,所以技术难度和挑战相对没有分布式存储系统这么高。自己参与设计、开发这样的系统,会对分布式系统,乃至大数据系统有更深刻地理解,希望这两期专栏能引导你从开发者的视角,看待分布式大数据系统是如何设计开发出来的,从而对大数据技术有新的认识和领悟。
如果你在工作中遇到有技术挑战的项目,可以尽量找机会去参与,你能收获的不仅仅是最终开发出来的产品和公司的认可,还有自己技术的提升和更有想象力的职业前景。

思考题

今天的文中提到,Doris 的分区路由算法在设计的时候,提出了一个数学模型计算虚拟节点和物理节点的映射关系。但是最后在开发过程中,项目组并没有使用这个数学模型进行计算,你能想到的实现算法还有什么呢?
你也可以在 Doris 的源代码中找到相关代码,分析 Doris 的最终实现算法和你的思考有什么异同。
欢迎你点击“请朋友读”,把今天的文章分享给好友。也欢迎你写下自己的思考或疑问,与我和其他同学一起讨论。
扩展阅读:
对专利感兴趣的同学可以进一步阅读 Doris 产品申请的三个技术专利:
Doris 源代码地址:
分享给需要的人,Ta购买本课程,你将得20
生成海报并分享

赞 8

提建议

上一篇
21 | 从阿里内部产品看海量数据处理系统的设计(上):Doris的立项
下一篇
23 | 大数据基准测试可以带来什么好处?
unpreview
 写留言

精选留言(22)

  • vigo
    2019-01-28
    智慧书,不仅说技术,还育人😄
    16
  • 你为啥那么牛
    2021-03-06
    遵循老师的5-20-2原则,5分钟没看进去,放弃,等待下一次偶遇
    共 1 条评论
    11
  • 吴小智
    2019-07-17
    专栏真的是从 0 开始学大数据吗?看哭了,只能看懂一二两章
    10
  • 玉剑冰锋
    2018-12-18
    您好老师,请教几个问题1.架构设计中数据压缩比及数据存储时效策略是如何设计的?2.数据的完整性如何验证?3.后期运行过程中尤其是某个节点存储空间低于其他节点时,是否会发生数据倾斜的问题?

    作者回复: 1.Doris没有做数据压缩 2.Doris当时版本没有做完整性(正确性)验证,但是可以简单做多读,然后进行数据对比验证,不过这样要求的数据备份数要更多。 3.不会,路由算法保证负载均衡,但是如果虚拟节点数和物理节点数相差不大时,会有数据倾斜,所以要求一开始设计的虚拟节点要足够多,是未来最大物理节点数的十倍以上

    9
  • 大京京
    2019-01-23
    有部分ppt内容是不准确的。新增一个物理节点,你前面说的算法是无法保证key1的路由节点pn1不移动的。只是数据迁移的时候,你是每个现有节点都各自迁移自己的一部分去新节点,现有节点之间不做迁移而已。
    4
  • 观弈道人
    2018-12-18
    老师你好,请问下,关于fail over部分,物理节点1,物理节点2是分别存储两片数据,当物理节点2挂掉的时候,文章中说物理节点1提供所有的read操作,我想问的是,节点1,2负责两片不同的数据,节点1如何承担原本访问节点2的读操作?谢谢。

    作者回复: 分片在group内分片,这里节点1,2分属不同group,存放的是同一份数据的两个拷贝

    2
  • 2019-09-28
    和redis的分片方式类似呀😄,你是虚拟节点,她是哈希槽。和一致性哈希也挺像的,只是虚拟节点和物理节点的映射更加的灵活可控。 老师牛逼,致敬!

    作者回复: 谢谢😄

    共 2 条评论
    1
  • weiruan85
    2019-08-02
    老师,文章中还有几个重要的问题没有提交:1. 这种设计下,cap是如何抉择的。 在发生网络分区的时候,是选择C 还是A ? 按照文章中的内容,感觉Doris没有采用逻辑日志复制的技术实现,而是采用了双写的实现思路,当时在设计时为什么这么考虑呢。 如果是双写,那么cap理论是不是就不太适用了,备份的数据和primary数据一定是一致的。 当网络发生分区后,执行故障转移,一直保证数据的一致性。

    作者回复: 在临时失效和恢复过程中,同一份数据的值在不同服务器上可能是不同的,不满足CAP中的C。但是Doris会选择正确的服务器读取数据,保证用户访问的数据是一致的,即用户一致性,失效恢复结束,多个数据拷贝的值也会恢复一致,即最终一致性。

    1
  • 纯洁的憎恶
    2018-12-20
    感谢老师分享阿里巴巴的内部分布式数据库系统的立项过程。能了解行业头部的大公司,是如何作出如此重大决定,并快速落地支持、加速公司的成长。 我虽然是计算机专业毕业,但并没有计算机工业领域的工作经历,所以可能对其中的一些细节缺乏应有的感知力,这个慢慢来吧。 我目前在大型国企总部工作,在互联网+的大势下,公司立项了采购监督信息化课题,旨在借助大数据技术,实现采购管理全过程,事前、事中、事后的风险防控与预警体系。有效降低违法违规行为,提高效率。我正在参与这个课题,但是对项目中大数据技术的切入点,没有明确的思路,想听听老师建议。谢谢
    展开
    1
  • William
    2018-12-19
    还有一个疑问请帮忙解答一下: 在集群伸缩设计方案中,假如一开始只有两台物理机,有10000个虚拟节点,那么每台物理机各存储5000个虚拟节点的数据;现在增加一台物理机,那么最后的数据存储效果是物理机分别存储5000,2500,2500个虚拟节点的数据吗?这样算不算数据倾斜?

    作者回复: 虚拟节点数分别是3333 3333 3334

    1
  • 高志权
    2022-03-23
    评论一下
  • 张伟建
    2021-12-28
    好难,努力学多点
  • garlic
    2020-12-11
    把虚拟节点均分到物理节点上,每次新增物理节点,重新计算均值,把新增前物理节点上大于均值部分放到新增物理节点上。 算法实现上由于依赖前一次分配状态,需要从一个物理节点开始计算,虚拟节点和物理节点不会很多的话,这部分运算时间可以忽略不计。 数据分布还是需要调整虚拟节点个数达到均衡
  • Kerry
    2020-11-28
    “路由算法在初始化的时候就预先设立一个较大的数字,比如 100000”,这个数字是用来做什么的呢?
  • Knuth
    2020-03-01
    doris是如何判定一个节点是瞬时失效、临时失效、永久失效 在做failover的第一个问题就是,如何判定节点失效,这里老板你定义了几个状态,具体是怎么量化来判定呢? 在实际的过程中是否存在误判的情况以及如何应对呢
  • Jun
    2020-01-05
    李老师,你好。感觉老师是山西人。如果是,那么老乡你好。这一章的数学公式是从物理节点映射的虚拟节点。实际请求到来时,应该是虚拟节点到物理节点,有公式吗?还是直接用一个映射表?另外使用一致性哈希加虚拟节点也是比较好的方案,不需要复杂的节点映射了。亚麻的dynamo就是这么做的。

    作者回复: 有公式,具体可以参考专利文献 http://www2.soopat.com/Patent/201110294092?lx=FMSQ 或者项目源码。 这个算法相对一致性hash的优势文中有比较。

    共 2 条评论
  • 送普选
    2019-10-14
    虚拟节点设计的很多,再和物理节点映射,和Redis的数据Slot再映射到物理机有点像。 另外存储系统单独分离出来有更大的灵活性,和 Apache Pulsar有点类似。 故障检测通过心跳,加请求时汇报广播,想起之前公司基于做的一个中间件的数据层也是这样。 技术要解决的问题有很多是一样的,原理和实现都是相通的。
    共 1 条评论
  • Hunter Liu
    2019-05-14
    一遍不太能吃透,待我多读几遍,看到各种大牛留言也很开阔视野
  • 张飞
    2019-03-06
    老师,节点映射关系个公式没看明白,可以解释一下吗? 一个虚拟节点对应两个对等的物理节点是什么意思?两个公式分别用来计算什么的呢?
  • Sam.张朝
    2018-12-25
    请教下,作为android开发工程师,小程序、H5、后台Java开发都有一定经验,对从事大数据研发工作的优势有哪些,特别是在和招聘HR,或者公司技术Leader 沟通时,如何阐明自己的优势,有何更有效的沟通,拿下一份工作?