oneproxy系列产品在被使用的过程中,有部分同志要求增加在线更新配置的要求。为了满足这个要求,经过研究在oneproxy-monitor上面实现了在线更新配置的要求,从而保证前端业务不被中断更新配置或者重启的效果。下面是在线更新配置的活动图。本项目中实现的在线更新配置的方法主要利用Linux的reuseport功能,而Linux的reuseport功能需要内核版本的支持。内核版本至少需要在2.6.32-431版本以及之上。如果内核版本不支持reuseport,则如果已经存在运行的oneproxy,则再次启动的时候会报错"port already in use"的错误,并且新启动的程序会退出,旧的程序不会受到影响。
同样如果配置文件,配置的有问题,在加载阶段解析错误,则同样新程序退出。通过下面的活动图可以得知,本方法有两个关键点:1. 必须存在pid文件。2. 连接到oneproxy上面的连接必须在合理的时间退出。
1. pid文件
为了在启动的时候判断是否存在老的进程,本方法是通过pid文件来判断的,pid文件的命名格式为:xxxx_oneproxy_pid.pid.其中xxxx是进程id,这个由程序自动获取并且增加到配置中指定的pid文件名的前面。例如:进程的id为:6543, 配置文件中通过pidfile选项配置pid文件的名称为oneproxy_pid.pid,则最后生成的pid文件名称为6543_oneproxy_pid.pid.文件中保存的是6543.
2. oneproxy退出时机
为了不转移旧oneproxy上面已经存在的连接,就不能直接退出oneproxy,oneproxy必须等到accept到的客户端的连接都做完后才退出。这个就需要客户端保证每个连接的有合理的退出时机,否则oneproxy会一直等待,知道连接退出为止。当然在等待中的oneproxy是不会处理新连接的。因为在接收到信号的时候已经停止了accept客户端的连接。
3. 功能的使用
oneproxy_monitor中已经实现此功能,使用此功能不需要额外的配置,只需要在与老进程所在的相同目录下启动即可。
4. 测试情况
目前在oneproxy_monitor框架下面开发的oneproxy-for-sqlserver和oneproxy-for-postgresql进行测试。通过jdbc编写的多线程短连接的方式测试了oneproxy-for-sqlserver, 通过pgbench每次建立连接的方式测试了oneproxy-for-postgresql.
pgbench和jdbc端都感觉不到中间件已经重启。