10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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:131740

评论 1 条评论

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

京东前端一面面试题

bb_xiaxia1998

JavaScript 前端

Nvm的安装及使用(Nodejs版本管理器)

node.js NVM 9月月更

中秋阅读计划 | 有趣不枯燥的“小薄书”

图灵教育

程序员 科普 计算机 书单 中秋节

开始思考吧

吴京

学习 思考 思想

力扣15 - 三数之和【奇妙的双指针】

Fire_Shield

双指针 LeetCode 9月月更

Python 教程之变量(2)—— Python中整数的最大可能值是多少?

海拥(haiyong.site)

Python 9月月更

极速导入elasticsearch测试数据

程序员欣宸

elasticsearch 9月月更

力扣349 - 两个数组的交集【哈希表+数组+双指针】

Fire_Shield

双指针 哈希表 9月月更

中秋阅读计划 | 有趣不枯燥的“小薄书”

图灵社区

程序员 科普 计算机 书单 中秋

Qt实现文本编辑器(一)

中国好公民st

c++ qt 9月月更

LeetCode-164. 最大间距(Java)

bug菌

9月日更 Leet Code 9月月更

TCP/IP参考模型

StackOverflow

编程 计算机网络 9月月更

如何刻意练习-中秋读书随笔

刘旭东

刻意练习

数据治理(十三):Ranger 安装与启动

Lansonli

数据治理 9月月更

【iOS逆向】某不知名App越狱检测

小陈

iOS逆向

python小知识-日志处理logging

AIWeker

Python python小知识 9月月更

库调多了,都忘了最基础的概念-《死锁与范式的碰撞》

知识浅谈

死锁 范式 9月月更

算法基础(一)| 快速排序和归并排序详解

timerring

算法 9月月更

5分钟教你如何利用华为云IoT进行物联网设备上云

wljslmz

物联网 IoT 华为云 9月月更

关于 SAP UI5 所有控件的共同祖先 - sap.ui.base.ManagedObject

汪子熙

SAP Fiori SAP UI5 ui5 9月月更

【Nacos云原生】阅读源码第一步,本地启动Nacos

石臻臻的杂货铺

云原生 nacos 9月月更

AQS 阻塞队列机制源码分享

new life

AQS

腾讯前端面试题合集

beifeng1996

JavaScript 前端

C++学习------cmath头文件的源码学习04

桑榆

c++ 源码阅读 9月月更

Java进阶(十四)实现每天定时对数据库的操作

No Silver Bullet

Java 数据库 9月月更

架构师的十八般武艺:架构边界

agnostic

架构边界

LeetCode-454. 四数相加 II(Java)

bug菌

9月日更 Leet Code 9月月更

许世伟老师架构课笔记分享

AiDaddy

架构师 需求设计

Python 教程之变量(3)—— 全局变量和局部变量

海拥(haiyong.site)

Python 9月月更

一张图告诉你出海服务商怎么选:中国互联网出海服务商生态图谱

易观分析

报告 出海服务商

在线编码、格式转换

人生如梦

React 在线格式化 在线编码 转码工具

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