热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Delos中虚拟化共识以实现快速升级和让工程师更Happy!

一种基于VirtualLog的协议。每个协议由在每个终端主机上执行的日志结构协议引擎(简称:引擎)组成,通过VirtualLog与其对应方进行交互。Delos平台代码被组织为此类引

Delos 起始于 2017 年,目标是为 Facebook 的控制面开发一个新的存储系统。我们的第一个场景是需求一个提供 Table API 的数据库。但是,最终我们需要支持其它多种 APIs(例如 ZooKeeper )。


为了快速地实现并部署 Delos ,我们利用了一种叫做 “virtual consensus” 的新技术,这种技术通过 VirtualLog 的抽象来存储和定序命令,以此来保持数据库多个副本间保持同步。VirtualLog 本身是架构在不同的共识协议之上的一层,这些不同的共识协议我们叫做 Loglets 并可以在它们之间切换,允许 Delos 在不停机的情况下改变它们的共识子系统。


“Virtual consensus” 交付到生产环境的第一个基于 Delos 的数据(DelosTable),使用 ZooKeeper 作为其底层的 Loglet 。简单地说,我们使用了久经考验 ZooKeeper 的共识协议,同时在基础之上支持 Table API。后来,我们将 DelosTable 切换到自定义构建的 NativeLoglet 协议以获得更好的性能并删除 ZooKeeper 作为关键路径依赖项。


但是,Delos 的最终目标不是构建一个具有固定 API 的单一数据库。相反,我们希望支持多种具有不同 APIs 的数据库,这样应用可以选择最适合他们场景的 API 。具体来说,我们紧接着的一个目标就是构建了另外一种数据库,它拥有和 ZooKeeper 一样的 APIs,并通过这个数据库替换了 Facebook 的 ZooKeeper 服务集群。随之而来的事情是,我们必须扩展 Delos :不仅在吞吐量和容量的常规维度上,更重要的是从需要理解、扩展和操作 Delos 的代码工程师的视角,来扩展和构建系统能力。


抽象使工程师快乐……对吧?



为了让开发和(运维)操作多个数据库更友好,我们将 Delos 设计为一个平台,这个平台用于构建数据库。每一个基于 Delos 的数据库(例如 DelosTable)都构建在 Delos 平台上,由非常薄的一层 API 相关的代码来承载。这个平台提供常见但非常复杂的基础支撑,例如:共识、本地存储、备份等。如此一来,通过自定义的 APIs 构建、部署、操作新的数据库变得非常简单,大多数代码和操作工具在多个数据库之间都是一样的。


这种分离能力允许 Facebook 的 ZooKeeper 团队开始在 Delos 平台开发 Zelos ,一个和 ZooKeeper APIs 完全一样的 ZooKeeper 替换系统。这样的直接受益是,ZooKeeper 团队可以专注于在 Delos 上实现复杂的 ZooKeeper API,并将之前的用户迁移过来。DelosTable 团队可以专注于开发 Table API。与此同时,Delos 平台团队则专注于改进共识和存储的底层代码,以获得更好的可靠性和性能。每一个团队都可以专注于自己的目标和核心竞争力,同时分摊开发和运营复杂服务的成本。换句话说,我们都是快乐的工程师!


但好景不长,我们很快就遭遇到了一些挑战。在 Zelos 需要的大多数 API 都和 DelosTable 相同的同时,它仍需要一定程度上的自定义能力。例如,ZooKeeper 需要 session 级别的有序,这个需求比其它数据库系统要强很多。因此,Zelos 团队需要对平台进行改进(例如,通过 Batch 模式来满足 ZooKeeper 的性能)。最终,通过单一代码库的统一平台将不同的团队联系起来的愿望,并没有实现!


虚拟化再一次出场!



“Use a good idea again.” — Butler Lampson, Hints for Computer System Design



为了打破这种僵局,我们发明了一种叫做「日志结构协议」的抽象:一种基于 VirtualLog 的协议。每个协议由在每个终端主机上执行的日志结构协议引擎(简称:引擎)组成,通过 VirtualLog 与其对应方进行交互。Delos 平台代码被组织为此类引擎的集合,每个引擎都提供特定的功能。每个数据库(例如 DelosTable 或 Zelos)都可以在一组自定义的这些协议上运行。


从某种意义上说,这种方法代表了一种形式的虚拟化。每个日志结构协议都是 VirtualLog 上的复制虚拟状态机。我们不是将数据库的功能构建为单个复制状态机,而是将其模块化为多个可重用的虚拟状态机。一个日志结构的协议只能访问它自己的本地数据库状态分区,从而实现协议之间的隔离。


此外,日志结构协议 — 顾名思义 — 是可以在应用程序和 VirtualLog 之间分层的协议。此类协议以与传统点对点网络中的网络协议相同的方式在 VirtualLog 之上添加功能。新的日志条目沿分层向下流向 VirtualLog,而日志中的现有条目沿分层向上流向数据库。与传统网络分层中的协议一样,引擎可以在上面生成的日志条目上搭载标头。它可以在日志条目到达更高层之前对其进行过滤或重新排序;并在它们到达较低层之前进行批处理、加密、压缩或其它动作。


Delos 中的日志结构协议,使具有不同目标、客户和理念的多个团队能够利用公共代码库。我们能够通过两个团队的个别工程师解锁创新,他们可以编写新协议而无需担心副作用和与其他代码的交互。例如:


  • 我们只需添加新引擎即可在不停机的情况下逐步升级生产数据库。例如,DelosTable 团队部署了一个 LogBackupEngine,用于协调 VirtualLog 到备份存储的上传。

  • 我们跨数据库重用代码,重新利用已经应用于生产环境的 DelosTable 的技术栈来开发 Zelos;例如,Zelos 重用了 DelosTable ViewTrackingEngine 来跟踪数据库的持久副本数量。

  • 我们通过特定引擎为每个数据库定制了行为。例如,Zelos 团队通过在其分层栈中插入一个额外的 SessionOrderingEngine 来实现更强大的会话排序保证。

  • 我们通过开发通用引擎来提高不同数据库的性能。例如,Zelos 团队实施了一个 BatchingEngine,它可以无缝地工作以提高 DelosTable 的性能。

  • 最后,我们在每个数据库中自定义了角色,支持被动只读副本执行协议层的精简子集。


此外,日志结构的协议允许 Delos 平台团队的工程师专注于具有挑战性的“最后一英里”,以实现一致性和持久性;不同数据库都可以受益,保护平台免受极端情况故障带来的影响。此外,由于存在用于不同数据库的单一、统一的工具链,工程师的 oncall 得到了显着简化。


从某种意义上说,虚拟化为复制数据库提供了与其他系统领域相同的好处:更快的开发和部署周期,以及更简单的操作。创新和影响在多个团队和角色中民主化:任何工程师都可以为新功能编写日志结构的协议,而无需对复杂的故障场景进行推理。最终,虚拟化对真正重要的指标产生了最大的影响:我们的工程师都很 Happy !





推荐阅读
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 触发器的稳态数量分析及其应用价值
    本文对数据库中的SQL触发器进行了稳态数量的详细分析,探讨了其在实际应用中的重要价值。通过研究触发器在不同场景下的表现,揭示了其在数据完整性和业务逻辑自动化方面的关键作用。此外,还介绍了如何在Ubuntu 22.04环境下配置和使用触发器,以及在Tomcat和SQLite等平台上的具体实现方法。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 在本文中,我们将探讨如何在Docker环境中高效地管理和利用数据库。首先,需要安装Docker Desktop以确保本地环境准备就绪。接下来,可以从Docker Hub中选择合适的数据库镜像,并通过简单的命令将其拉取到本地。此外,我们还将介绍如何配置和优化这些数据库容器,以实现最佳性能和安全性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 针对MySQL Undo空间满载及Oracle Undo表空间溢出的问题,本文详细探讨了其原因与解决策略。首先,通过启动SQL*Plus并以SYS用户身份登录数据库,查询当前数据库的UNDO表空间名称,确认当前状态。接着,分析导致Undo空间满载的常见原因,如长时间运行的事务、频繁的更新操作等,并提出相应的解决方案,包括调整Undo表空间大小、优化事务管理、定期清理历史数据等。最后,结合实际案例,提供具体的实施步骤和注意事项,帮助DBA有效应对这些问题。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
author-avatar
工商领域LW
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有