作者 | Steven J. Vaughan-Nichols
译者 | 刘雅梦
策划 | Tina
弗吉尼亚州里士满——任何懂技术的人都可以给 Linux 服务器打补丁。但是,在不停机的情况下给数千台服务器打补丁,并不容易。
在本月初举行的 Linux Plumbers 大会(仅限受邀参加的顶级 Linux 内核开发人员会议)上,Meta Linux 内核工程师 Breno Leitao 解释了 Facebook 是如何在全球数百万台服务器上实现这一目标的。
Leitao 表示,如果使用普通技术,将一个新内核推广到所有机器上至少需要 45 天的时间。正如他所说,“排空和反排空主机是很困难的。”这是确定无疑的。
如果只是一个小的更新,那可能没问题,但如果是一个安全补丁,那就行不通了。
因此,Meta 使用 内核实时补丁(Kernel Live Patching,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,使用实时补丁。你会很高兴这么做的。
原文链接:
https://thenewstack.io/how-meta-patches-linux-at-hyperscale/
声明:本文由 InfoQ 翻译,未经许可禁止转载。