TGTGInsighttelegram intelligenceLIVE / telegram public index
← Welcome to the Black Parade
Welcome to the Black Parade avatar

TGINSIGHT POST

Post #63

@TheB1ackParade

Welcome to the Black Parade

Views103Post view count
PostedMay 1605/16/2022, 08:59 AM
Post content

Post content

用 python 写了一个"优雅热更新"的 demo, 基本想法是这样的: 1. 发送信号 1 来通知更新, 进程收到后进行 fork(2) + exec(2), 其中 exec(2) 就会运行新的二进制 2. tcp listener fd 通过关闭 close on exec 的 flag 来保证 exec 后的新进程能继承, 从而平稳交接 listener fd 3. fork 出的新进程关闭 listener fd, 但是对已经建立的 client connections 继续服务, 这样做到 zero downtime 当然还有很多细节没有实现, 比如 wait(2) 子进程来避免僵尸, 还有很多状态可以横跨 exec(2) 比如 signal mask, 不过都是工程细节. 经典 zero downtime 做法是通过 unix socket 交接 fd, 本质逻辑是一样, 但是在容器时代造成的问题是, 容器进程往往是 pid ns 的一号进程, 一号进程退出会造成 os 销毁整个 pid ns, 所以要保持相同的 pid 来更新, 才想出这种方案. 然而依然没什么卵用, 无状态服务就是要随便漂节点才好做 HA, 除非真的是非常关键的服务.