热重启
易用性是 Envoy 的首要目标之一。除了强大的统计信息和本地管理界面之外,Envoy 还具有“热”或“实时”重启自身的能力。这意味着 Envoy 可以完全重新加载自身(包括代码和配置),而不会在排空过程期间丢弃现有连接。热重启功能具有以下通用架构
两个活动进程通过使用基本 RPC 协议的 Unix 域套接字相互通信。所有计数器都通过 Unix 域从旧进程发送到新进程,并且除了标记为
NeverImport
的指标外,所有指标都会被传输。热重启完成后,从旧进程传输的指标将被清除,但 server.hot_restart_generation 统计信息 等特殊指标将保留。新进程在请求旧进程的监听套接字副本之前,会完全初始化自身(加载配置,进行初始服务发现和健康检查阶段等)。新进程开始监听,然后告诉旧进程开始排空。
在排空阶段,旧进程尝试优雅地关闭现有连接。如何完成此操作取决于已配置的过滤器。排空时间可以通过
--drain-time-s
选项配置,随着时间的推移,排空变得更加激进。在排空序列之后,新的 Envoy 进程告诉旧的 Envoy 进程关闭自身。此时间可以通过
--parent-shutdown-time-s
选项配置。Envoy 的热重启支持旨在即使新的 Envoy 进程和旧的 Envoy 进程在不同的容器内运行,也能正常工作。进程之间的通信仅使用 Unix 域套接字进行。
源代码分发中包含一个用 Python 编写的示例重启器/父进程,位于restarter/hot-restarter.py。此父进程可与标准进程控制实用程序(如 monit/runit 等)一起使用。
Envoy 的默认命令行选项假设在给定主机上仅运行一组 Envoy 进程:一个活动的 Envoy 服务器进程,以及可能的一个正在排空的 Envoy 服务器进程,该进程将如上所述退出。可以使用--base-id
或--use-dynamic-base-id
选项来允许在同一主机上运行多个不同配置的 Envoy,并独立热重启。
注意
目前,在热重启期间更新监听器的socket_options 不受支持。将使用旧进程的套接字选项。如果需要更新套接字选项,请执行完全重启或执行基于 LDS 的监听器更新。
注意
此功能在 Windows 上不受支持。
套接字处理
默认情况下,Envoy 在 Linux 上使用reuse_port 套接字以提高性能。此功能在热重启期间正常工作,因为 Envoy 通过工作进程索引将每个套接字传递给新进程。因此,在排空进程的接受队列中不会丢失任何连接。
注意
在并发性在热重启期间发生变化的不常见情况下,如果并发性增加,不会丢失任何连接。但是,如果并发性降低,旧进程工作进程的接受队列中可能会丢失一些连接。