1. 热重启的概念(热重启是什么?)
热重启是一种服务部署方式,服务的另一种部署方式为滚动升级。
其升级部署形式如下:
通过在同一台机器上,将一个服务切换到新服务,而不会造成任何流量损失。
2. envoy采用热重启的背景
热重启是简单的和容易实现的,目前仍然是被很多组织采用。
envoy基于热重启又增加了些许设计目标:
a. 整个进程(不仅仅包含配置文件)能够在不损失任何流量的情况下被加载
b. 在重启期间envoy的统计信息应该保持一致
c. 基于容器的不可变的部署仍然可以采用热重启部署envoy
d. 旧的envoy服务的排水率和死亡速率应该是可控的
3. envoy热重启的原理以及工作方式
3.1 envoy热重启架构
envoy的热重启架构如下图所示:
热重启架构主要由四部分组成:主进程,共享内存,unix域套接字(UDS), 以及部署进程(需要部署升级的服务)
共享内存:包含版本信息,原始统计信息存储,以及共享锁,其在envoy中的实现如下:
struct SharedMemory {
uint64_t size_;
uint64_t version_;
pthread_mutex_t log_lock_;
pthread_mutex_t access_log_lock_;
std::atomic<uint64_t> flags_;
};
主进程:
这是你的旧envoy服务,当该进程排水结束后部署进程便变成主进程,主进程在envoy中定义为:
class HotRestartingParent
部署进程:
这个是你需要部署的新的envoy进程,最终这个会变成主进程,子进程在envoy中定义为
class HotRestartingChild
unix域套接字:
主进程和子进程间通过一个简单的rpc通信,该通信通过unix域套接字实现。
3.2 热重启工作过程
工作过程如下:
两个进程交流的方式是通过共享内存和unix套接字
- 部署进程首先向主进程的admin端口发送shutdown端口请求,以使主进程关闭admin端口。然后,部署进程接管所有主进程的职责,包括统计信息刷新。这样从操作的角度来看,逻辑上只有一个envoy进程。
- 部署进程开始加载其配置并绑定到侦听套接字。在这个阶段,部署进程通过UDS获得主进程的套接字。 注意:由于历史原因目前envoy未使用SO_REUSEPORT套接字选项。不过可以在配置文件中增加reuse_port: true开启这个选项。
- 部署进程初始化完成后,它会通知主进程停止侦听新链接,主进程开始排水过程。排水时间的长度是可配置的,默认为15分钟。在这15分钟内,或者配置的时间内,主进程将正常关闭链接。排水的时间越长,关闭链接的速度就越快。这样可以平滑关闭旧连接,然后在已经侦听新连接的部署进程上重新建立连接。
- 在主进程排水阶段,部署进程是正在冲洗统计信息。大多数统计信息存储在共享内存中,无需通过RPC获取。但是一些特殊的统计信息需要通知排水中的主进程。例如,主进程仍然打开的链接数和其相应的内存。这些状态由部署进程写进共享内存中,以致排水率能被更好的观察。
- 最后,在主进程排水结束后,部署进程向主进程发送shutdown请求。主进程打开的其余的连接都将被关闭,此时,部署进程变成主进程,部署基本完成。
4. 热重启使用
可以通过手动或者包装器进行热重启。
主要可参考:Envoy 热重启实践 - 掘金
手动部署可以用:
--restart-epoch
包装器热重启需要用到
restart/hot_restart.py工具
5. 总结:
这算是对自己学习envoy热重启的相关知识点的总结,其中大部分是翻译大佬的博客,加深自己的印象,同时也整体规划了下envoy热重启相关的内容。方便后期自己复习。
参考: