我有一个分布式应用程序,资源被锁定以供任务专用。每个任务都在自己的进程中运行。如果任务进程退出或它运行的服务器死机(例如电源故障),我想自动解锁资源。
如何在几秒钟内远程检测到此类进程退出/失败?
经过一些谷歌搜索后,我提出了一些想法,但我没有直接经验与其中任何一个......
使用内置于mySQL(get_lock)或postgres(pg_advisory_lock)中的建议锁定功能。如果数据库连接关闭,这些将自动释放锁定,这将在进程退出或服务器崩溃时发生。
使用专用的分布式锁管理器,如ZooKeeper。这可行,但似乎超出了我的需要。
在启用TCP / socket keepalive选项的情况下,从任务进程到远程监视进程建立TCP连接。这似乎是可行的,但我宁愿建立一些能够处理低层网络细节的东西。
另一个想法是将问题分开。由于服务器崩溃相当罕见,我可以使用本地监视程序进程来监视进程退出,然后使用其他东西来监视服务器崩溃。
感谢您的反馈!
答案 0 :(得分:0)
您可能需要阅读“φ应计故障检测器”。我发现它是故障探测器最通用,理论上最合理的方法。它绝不是“在几秒钟内检测到故障”的问题,而是始终在您的故障检测速度和可靠性之间的交易。通过了解如何从过去正确或错误检测到的故障中收集和处理统计信息,您可以估计出故障的可能性与您等待远程服务器响应的时间的关系。
TCP keep-alive在这里没用 - 它的“ping”太粗糙,默认情况下为2小时。