需要解决的一个情况,在一些比较老的linux系统里,没有systemctl来进行程序的启动和重启。现在需要设计一个让程序高可用的方案。尽量提高程序可用性。
方案分成几步,属于补充和递进的关系。最简单的是用systemctl 托管,或者service。讨论的是没有这些的情况。
第一步,双进程互拉,保活。假设本身有一个程序A,在系统启动后运行,或者放在了系统启动目录,在系统启动后运行。当程序本身因为意外崩溃无法启动时,就要写另一个程序B来检测本身的业务程序是否启动,如果没启动,把业务程序拉起来。同样的这个程序A,也写一段逻辑来检测程序B是否启动。这样互拉程序的可靠性提升很多。
第二步,假死检测,假设现在有两个程序,业务程序A,检测程序B,程序A本身的进程一直存在,但是因为其它原因比如死锁,超时等待,程序并没有继续原来的逻辑运行,这时候上面的互拉是没有用的,因为进程是存在的。可以考虑增加心跳检测,就是在程序里增加一段逻辑,比如一个http接口,/health_check返回200 ok。或者写一个文件。检测程序B定时向业务程序A发/health_check请求,如果不能接到ok的返回,说明进程出现问题,需要重启。获取检测程序B检查心跳文件,如果心跳文件一直没有更新,也认为业务程序A假死了,需要重启。一般/health_check在容器中是很常规的方法,因为大多容器都支持,web服务器加一个接口也是很简单的事情,在linux嵌入式的话,我建议是写文件。
第三步,shell命令远程下发,一般情况下,都是可以ssh远程登录的,这个是为了防止ssh无法远程登录,提供的冗余方案。一般最好是放在检测程序上。这样即使出现无法ssh登录,也能通过下发shell命令,来重启一些程序。用mqtt_client或者http都可以。
这样上面三个步骤后,基本能确保程序的保活,可用。