对Linux系统进行补丁升级,看似简单,但当需要面对成千上万台服务器时,在不停机的情况下完成补丁就变得极具挑战。本文将详细介绍Meta公司是如何解决此类大规模Linux补丁部署的技术难题。
译自 How Meta Patches Linux at Hyperscale,作者 Steven J. Vaughan-Nichols。
任何具有技术头脑的人都可以修补 Linux 服务器。但是,在不停机的情况下修补成千上万台服务器,这可不容易。
在本月早些时候举行的 Linux 内核顶级开发者仅凭邀请的 Linux Plumbers 会议上,Meta Linux 内核工程师 Breno Leitao 解释了 Facebook 如何在世界各地的数百万台服务器上完成此操作。
如果使用普通技术,Leitao 说将需要超过 45 天的时间才能将新的内核推送到所有机器上。正如他所说,“排空和反排空主机很困难。” 你可以再说一遍。
如果这只是一个小更新,那可能还可以接受,但如果是安全补丁,那就行不通了。
因此,Meta 使用内核实时补丁(KLP)和 Red Hat 的 Kpatch 来提供快速补丁。在 KLP 中,您可以将最新的安全更新应用于 Linux 内核,而无需重新启动。这可以最大限度地提高系统正常运行时间和可用性。
内核实时补丁以包含修改代码的包的形式提供,与主内核包分开。实时补丁是累积的,因此最新补丁包含针对内核包的所有前一个补丁的所有修复。每个内核实时包都与其发布的确切内核修订版本绑定。
但是,实时补丁并不能解决所有问题。您无法修补数据或结构。另一个问题是实时补丁通常需要额外的工程工作。正如 Leitao 警告的那样:“这不仅仅是编译实时补丁这么简单,并且知道它是安全的并应用它。这些是内核模块,如果不小心的话,您会中断事物。不能保证补丁本身就是正确的。”
Kpatch 通过比较原始内核和修补内核,然后使用定制的内核模块将新代码修补到正在运行的内核中。然后 Kpatch 进程使用 ftrace 观察现有进程的堆栈,看是否可以在不产生任何有害影响的情况下进行修补。
当安全时,它会将正在运行的代码重定向到修补的函数,然后删除现在已过时的代码。就这样,你的服务器被修补了,没有任何宕机时间。
当然,在实践中这并非那么简单。 Leitao 解释说:“在 Meta,当我们应用实时补丁时,通常需要一到两秒钟的时间将补丁应用于主机。这显然不是针对类似整个服务器群,而是对主机一到两秒钟真的非常快,相比 kexec(Linux 内核机制用于启动新内核)。它不需要任何宕机时间或工作负载迁移,您只需应用实时补丁,然后继续前进。”
但是,当谈论成百万台机器时,这还不是全部。Meta 将在修补程序推出期间发现错误,因此管理员首先会修补候选版本层。因此,随着基于 RPM 的修补程序的交付,也会自动检查服务器的运行状况。
Meta 查看新内核中的崩溃、主要警报和应用问题及性能。这些数据来自各种源,包括崩溃、netconsole 结果和核心转储。如果错误率超过每千台服务器一次崩溃,则会拉回补丁并恢复旧内核。
随着超过 10 亿用户,Facebook 也会密切关注性能。正如 Leitao 所说:“实时补丁的性能开销很小,但当相对热的函数被修补时,总是会引起关注。”
尽管 Meta 使用 Kpatch,但也有其他选择。SUSE 提供 kGraft;而 Oracle 使用 Ksplice;Canonical 支持 Livepatch。不管代码如何,它们都能提供类似的结果。
因此,如果你不希望服务器、数据中心和云出现宕机时间,请按照 Meta 的例子使用实时补丁。你会很高兴你这样做的。