Let’s Encrypt 通过为超过 2.35 亿个网站 提供 TLS 证书来帮助保护很大一部分 Web。数据库是 Let’s Encrypt 管理证书颁发的方式的核心。如果此数据库的性能不够好,可能会导致 API 错误和我们的订阅者的超时。数据库性能是我们能够在满足服务级别目标的同时扩展的最关键因素。在 2020 年底,我们升级了我们的数据库服务器,并且对结果非常满意。

我们到底在这些服务器上做了什么?

我们的 CA 软件 Boulder 使用 MySQL 风格的模式和查询来管理订阅者帐户和整个证书颁发过程。它被设计为与单个 MySQL、MariaDB 或 Percona 数据库配合使用。我们目前使用 MariaDB,使用 InnoDB 数据库引擎。

我们针对单个数据库运行 CA,以最大限度地减少复杂性。最大限度地减少复杂性有利于安全、可靠性和减少维护负担。我们始终有许多数据库副本处于活动状态,并且我们将一些读操作定向到副本数据库服务器,以减少对主服务器的负载。

这种设计的其中一个结果是,我们的数据库机器需要非常强大。最终我们可能需要对单个数据库进行分片或将其拆分为多个数据库,但硬件的进步使我们能够到目前为止避免这种情况。

硬件规格

上一代数据库硬件功能强大,但经常被推到极限。对于下一代,我们希望在相同的 2U 外形尺寸中将几乎所有性能指标提高一倍以上。为了实现这一点,我们需要 AMD EPYC 芯片,而戴尔的 PowerEdge R7525 非常理想。以下是规格

上一代 下一代
CPU 2x 英特尔至强 E5-2650
总计 24 个内核 / 48 个线程
2x AMD EPYC 7542
总计 64 个内核 / 128 个线程
内存 1TB 2400MT/s 2TB 3200MT/s
存储 24x 3.8TB 三星 PM883
SATA SSD
560/540 MB/s 读写速度
24x 6.4TB 英特尔 P4610
NVMe SSD
3200/3200 MB/s 读写速度
Dell PowerEdge R7525 Chassis
戴尔 PowerEdge R7525 内部结构。中间的两个银色矩形是 CPU。每个 64GB 的 RAM 棒位于 CPU 上方和下方。24 个 NVMe 驱动器位于服务器的前面,最左边。

通过使用 AMD EPYC,我们能够在保持较高时钟速度的同时获得 64 个物理 CPU 内核:2.9GHz 基本频率,3.4GHz 提升频率。更重要的是,EPYC 提供了 128 条 PCIe v4.0 通道,这使我们能够将 24 个 NVMe 驱动器放入一台机器中。NVMe 非常快(比上一代数据库服务器中的 SATA SSD 快约 5.7 倍),因为它使用 PCIe 而不是 SATA。但是,PCIe 通道通常非常有限:现代消费类芯片通常只有 16 条通道,英特尔的至强芯片有 48 条通道。AMD EPYC 通过提供每芯片 128 条 PCI 通道(v4.0,不低于),使将大量 NVMe 驱动器打包到一台机器中成为可能。我们将在后面详细讨论 NVMe。

性能影响

我们将从查看处理请求的中位时间开始,因为它最能反映订阅者的体验。在升级之前,我们以约 90 毫秒的时间完成了中位数 API 请求。升级将此指标降低到了约 9 毫秒!

API Latency

我们可以清楚地看到,旧的 CPU 已经达到了极限。在我们升级主数据库服务器之前的一周内,其 CPU 使用率(来自 /proc/stat)平均超过 90%

CPU Usage Before Upgrade

新的 AMD EPYC CPU 处于约 25%。您可以在此图表中看到,我们在 9 月 15 日将新的数据库服务器从副本(只读)提升为主服务器(读写)。

CPU Usage After Upgrade

升级极大地降低了我们的整体数据库延迟。平均查询响应时间(来自 INFORMATION_SCHEMA)过去约为 0.45 毫秒。

Database Latency Before Upgrade

查询现在平均快三倍,约为 0.15 毫秒。

Database Latency After Upgrade

OpenZFS 和 NVMe

NVMe 驱动器由于其惊人的性能而越来越受欢迎。但是,直到最近,由于 NVMe 使用 PCIe 通道,几乎不可能在一台机器中获得许多 NVMe 驱动器。这些通道非常有限:英特尔的至强处理器仅配备 48 条 PCIe v3 通道,其中许多通道被芯片组和附加卡(例如网络适配器和 GPU)占用。您无法在剩余的通道中容纳太多 NVMe 驱动器。

AMD 最新一代的 EPYC 处理器配备了 128 条 PCIe 通道——是英特尔提供的通道数的两倍以上——并且它们是 PCIe v4!这足以将一个 2U 服务器塞满 NVMe 驱动器(在我们的例子中是 24 个)。

有了装满 NVMe 驱动器的服务器后,您必须决定如何管理它们。我们上一代数据库服务器在 RAID-10 配置中使用了硬件 RAID,但没有有效的 NVMe 硬件 RAID,因此我们需要另一种解决方案。一种选择是软件 RAID(Linux mdraid),但我们收到了几个关于 OpenZFS 的推荐,并决定尝试一下。我们对它非常满意!

关于如何为 NVMe 驱动器池和数据库工作负载最佳设置和优化 OpenZFS 的信息并不多,因此我们想分享我们学到的知识。您可以在 此 GitHub 存储库 中找到有关我们设置的详细信息。

结论

随着越来越多的人依赖 Let’s Encrypt 来提供 TLS/SSL 带来的安全性和隐私,这种数据库升级是必要的。这些设备非常昂贵,对于我们的 SRE 团队来说,计划和执行过渡是一项艰巨的任务,但我们在这个过程中学到了很多。

支持 Let’s Encrypt

我们依赖于支持者的贡献来提供我们的服务。如果您所在的公司或组织希望 赞助 Let’s Encrypt,请发送电子邮件至 sponsor@letsencrypt.org。我们要求您在力所能及的情况下进行 个人捐款