平滑重启的场景:版本升级、配置加载等等
平滑重启的特点:已有的请求不能中断、新来的请求要及时响应
通过已有进程fork新进程的方式
直接启动新进程,然后通知老进程退出的方式
这种平滑重启有个特点:两个相互独立的进程存在同时 bind、listen 相同的 IP + 端口,对于各个操作系统及版本验证如下:
- linux 内核 4.13.0
设置参数SO_REUSEADDR、SO_REUSEPORT,可以bind、listen成功,新的连接由系统分配到某一个进程; - linux 内核 2.6.32
不支持SO_REUSEPORT,仅设置参数SO_REUSEADDR时,新进程 bind 失败。经查资料linux 3.9及以后开始支持参数SO_REUSEPORT; - Windows 7
不支持SO_REUSEPORT,仅设置参数SO_REUSEADDR时,可以bind、listen成功,但是新的连接仍然会发往老进程,老进程关闭socket后,会发至新进程; - Mac 10.12.6
设置参数SO_REUSEADDR、SO_REUSEPORT,可以bind、listen成功,新的连接只会发往新的进程。