写点什么

Facebook 面向未来的 LAD: 规模化配置服务器

  • 2018-08-22
  • 本文字数:2693 字

    阅读完需:约 9 分钟

Facebook 的基础设施由许多分布在不同地理区域的数据中心组成,它们承载着数百万台服务器。这些服务器运行许多系统,从前端 web 服务器到新闻摘要聚合器,再到我们的消息和实时视频应用程序。除了常规的代码推送之外,我们每天还会向服务器推送数千个配置更改。因此,我们的服务器执行数万亿次配置检查是相当常见的。配置检查的其中一项是 web 服务器个性化用户体验,例如它文本对一个用户以英文显示,对另一个用户以葡萄牙语显示。

在本文中,我们将介绍位置感知分发系统 (Location-Aware Distribution,LAD),这是一个新的对等系统,用于处理对数百万台服务器的配置更改的分发。我们发现,LAD 在发布大型更新方面明显优于之前的程序系统,支持文件现在是 100MB,而之前为 5MB,同时每个发布者支持约 40000 个订阅者,而之前为 2500 个订阅者。

背景:在 LAD 之前,我们是如何分发配置的?

正如我们在 SOSP 2015 年的论文中所描述的,Facebook 的配置管理系统 (称为 Configerator) 使用开源的分布式同步服务 ZooKeeper 来分发配置更新。

ZooKeeper 中的所有数据都存储在一个统一的数据存储中。每个 ZooKeeper 节点 (znode) 可以包含数据或其他子 znode。可以使用分层路径 (例如 /root/znode/my-node) 访问每个 znode。从 ZooKeeper 中读取数据的客户端可以在 znode 上设置观察器;当 znode 被更新时,ZooKeeper 会通知这些客户端,以便他们可以下载更新。

ZooKeeper 强大的数据一致性和严格的分发保证是我们可靠地扩展和运行系统的关键。然而,随着我们的基础设施发展到数百万台机器,我们发现 ZooKeeper 变成了瓶颈。

  • 严格的排序保证:ZooKeeper 的一个关键特性是它提供了严格的排序保证,这意味着写操作总是被一个线程按顺序处理。为了确保读操作不被中断,ZooKeeper 会交叉进行读和写处理。我们发现,对特定 znode 的更新可能会触发大量的监控,而这反过来又可能触发大量来自客户端的读取动作。一些这样的写操作可能导致更新阻塞。
  • 巨大的集群:当数据 znode 被更新时,ZooKeeper 会通知所有感兴趣的客户端。当传入的客户端请求大于 ZooKeeper 处理能力时,这可能会引发一个巨大的集群问题。
  • 大型更新可能会使 NICs 饱和:我们的一些配置文件的大小最多为 5 MB。给定一个 10gb /s NIC,我们发现一个盒子只能服务大约 2000 个客户。如果经常更新这样的文件,我们发现更新文件可能需要 10 秒的时间传播到所有需要的客户端。

为未来设计一个系统

当我们开始设计新的分发系统时,我们提出了几个要求,包括:

  • 支持大型更新:将文件大小从 5 MB 增加到 100 MB。
  • 独立的数据存储:ZooKeeper 将一个数据存储与它的分发框架结合在一起。我们希望将数据存储和分发组件分开,以便我们能够分别对每个组件进行大小和规模的调整。
  • 分发能力:可以支持数百万客户。
  • 延迟:将发布延迟限制在 5 秒以内。
  • 配置文件:相较于我们以前基于 zookeeper 的系统,这个系统支持 10x 配置文件的数量,
  • 可以满足巨量集群和更新率激增的情况。

介绍位置感知分发系统 (LAD)

LAD 由两个主要组件组成,它们通过 Thrift RPC 相互通信:

  • 代理:每个机器上运行的守护进程,为任何有需要的应用程序提供配置文件。
  • 分发器:该组件担当两个角色。首先,它对数据存储进行轮询以获取新的更新。其次,它为一组对更新感兴趣的代理构建一个分发树。



上图显示了 LAD 如何将代理组织到一个分发树中,它本质上是一个组织良好的对等网络。如步骤 1 所示,代理代表运行在该框上的应用程序向分发服务器发送“订阅”请求。分发服务器通过发送“添加对等点”请求 (步骤 2) 将代理添加到分发树中。一旦代理被添加到树中,它就开始接收元数据 (步骤 3) 更新。这些内容被过滤,代理通过内容请求进行响应 (步骤 4)。如果父类拥有内容,它将立即将其发送给子类;否则,它将从父服务器下载内容 (步骤 5)。

通过对树的使用,LAD 确保更新只推送给感兴趣的代理,而不是队列中的所有机器。此外,父机器可以直接向子机器发送更新,从而确保根服务器附近的任何一台机器都不会过载。

我们在使用 ZooKeeper 上的一个重要经验是将元数据更新和发布从内容分发中分离出来。LAD 的架构依赖于代理不断接收元数据更新。如果每个代理都接收所有元数据更新,那么请求的数量就会太高。我们通过使用 shards 来解决这个问题:我们没有将整个数据树作为一个分发树的一部分,而是将它分割成较小的分发树,每个分发树都服务于数据树的一部分。

我们实现分片设计的方法是让每个分片位于目录结构中的一个特定点,并递归地包含它下面的所有对象。分片为订阅提供了一个可靠的媒介:它限制了树的总数,同时平衡了每个代理接收的元数据量。

控制数据流



控制平面 (上图左) 是分发者和每个订阅者之间的轻量级的 Thrift RPC。分发服务器使用它来发送树命令,这些命令通知父节点与其相关的新子节点,并检查订阅者的活跃度。订阅服务器还使用控制平面向分发服务器发送订阅请求。分发服务器将这些请求映射到该订阅所属的分片,并将订阅服务器添加到分发树中。

数据流平面 (在上图右侧) 是位于分发树对等点间的 Thrift RPC,它任务非常艰巨。父节点用它向子节点发送来自分发服务器的元数据更新。数据流平面也会被用来接收来自子节点的内容请求。

拥有独立的控制和数据流平面后,每个分发服务器可以处理大约 40,000 个订阅者;而 ZooKeeper 只能处理大约 2500 个订阅者。

经验教训

我们在构建和部署 LAD 时学到了一些有用的经验。以下是一些重点总结:

  • 工具化和可监控对于生产部署至关重要。从经验来看,基于 P2P 的系统在操作和调试方面很具有挑战性,因为不清楚给定请求的发送或接收路径中有哪些节点。
  • 故障提醒和灾备测试在规模上是至关重要的。除了文档化良好的操作过程之外,我们还发现运行一些测试用例及开发策略,有利于在出现问题时有效地做出反应。具体来说,我们运行了一系列测试,引入了各种类型的应用程序、主机、网络和集群级别的故障,以在不影响任何客户机的情况下验证 LAD 的弹性。这是一次令人满意的过程,因为我们发现了程序和工具中的 bug 及不足点。
  • 连续和定期测试对系统的长期可靠性至关重要。仅仅只将上面列出的测试运行一次是不够的,因为在 Facebook 上事情发展变化很快,关于系统或工具的假设可能不会一直成立。我们正在对测试过程进行自动化,以便能够及时发现并处理系统产生的问题。

LAD 下一步规划是怎样的?

现在,作为配置管理系统的数据分发框架,LAD 已经被部署到生产环境中。我们也在评估发现其他优秀的大规模内容分发应用程序。

英文原文: Location-Aware Distribution: Configuring servers at scale

2018-08-22 18:131705

评论 1 条评论

发布
暂无评论
发现更多内容

共享洗车机多少钱一台?看品牌

共享电单车厂家

自助洗车机价格 自助洗车加盟 共享洗车机多少钱

虚拟化是什么意思?包含哪些技术?与私有云有什么区别?

行云管家

云计算 运维 虚拟化 IT运维

图像搜索应用场景(个人见解,欢迎补充)

Geek_e369a5

什么是图像搜索 图像搜索的应用场景 拍照购物用图像搜索的作用

车白兔:自助共享洗车机哪家好

共享电单车厂家

自助洗车机 自助洗车加盟 车白兔自助洗车

红象云腾完成与龙蜥操作系统兼容适配,产品运行稳定

OpenAnolis小助手

开源 龙蜥社区 龙蜥操作系统 红象云腾 兼容适配

全上链哈希游戏dapp系统定制(方案设计)

开发微hkkf5566

超大规模AI异构计算集群的设计和优化

Baidu AICLOUD

大模型训练 异构计算

共享自助洗车24小时不打烊受青睐

共享电单车厂家

共享自助洗车 自助洗车 自助洗车加盟

模块五

Geek_2ce415

【计算讲谈社】第三讲:如何提出关键问题?

大咖说

逻辑学 辩证思维 关键问题

无界共创,明道云参与广汽本田IT新技术展

明道云

共享智能自助洗车现在市场如何

共享电单车厂家

自助洗车加盟 自助洗车市场 共享智能自助洗车

等保备案是等保测评吗?两者是什么关系?

行云管家

备案 等保 等级保护 等保备案 等级测评

科创人·味多美CIO胡博:数字化是不流血的革命,正确答案藏在业务的田间地头

科创人

NFT质押流动性挖矿系统开发技术

薇電13242772558

NFT 流动性挖矿

如何实现一套容器(C 语言版)2

祖维

c 容器 泛型 迭代器 双向链表

全链路业务追踪落地实践方案

云智慧AIOps社区

运维 AIOPS 解决方案 全链路追踪

leetcode 139. Word Break 单词拆分(中等)

okokabcd

LeetCode 动态规划 算法与数据结构

Java—Servlet

武师叔

6月月更

特尔携手微软发挥边云协同势能,推动AI规模化部署

科技之家

Vue项目的创建和托管

Python研究所

6月月更

【6.16-6.24】写作社区精彩技术博文回顾

InfoQ写作社区官方

优质创作周报

效率提升 100%,YRCloudFile 让自动驾驶安全更有保障

焱融科技

人工智能 自动驾驶 大数据 数据存储

制造业项目MDM主数据项目实施心得

agileai

数据治理 数据集成 企业服务总线 项目实施 制造业项目

NFT双币质押流动性挖矿系统开发

开发微hkkf5566

Bytebase加入阿里云PolarDB开源数据库社区

阿里云数据库开源

阿里云 开源数据库 polarDB PolarDB-X 阿里云数据库

左手代码,右手开源,开源路上的一份子

开源社

开源

CentOS中实现基于Docker部署BI数据分析

葡萄城技术团队

Docker centos BI 分析工具

传统的IO存在什么问题?为什么引入零拷贝的?

源字节1号

实时渲染:实时、离线、云渲染、混合渲染的区别

Finovy Cloud

渲染 云渲染

解密安卓微信聊天信息存储

ooooooh灰灰

Go sqlite 微信 后端 SqlCipher

Facebook面向未来的LAD:规模化配置服务器_Meta_ALI HAIDER ZAVERI_InfoQ精选文章