16_ProxySQL_Thread_02_Watchdog

备注:文章编写时间201904-201905期间,后续官方在github的更新没有被写入

一、Watchdog

ProxySQL是多线程守护进程,每个模块有一个或多个线程,正如前一节 ProxySQL Threads 中已经指出的那样(15_ProxySQL_Thread_01_主要的线程.txt)。

最关键的线程是MySQL线程。

虽然关键部分的数量有限,但之前有少数的BUG导致了意外的锁定问题和停顿。出于这个原因,ProxySQL 1.4.4引入了一个监视MySQL线程和MySQL辅助线程(如果启用)的监视程序。 如果监视程序检测到这些线程的任何一个丢失了心跳,则会假定它们被阻塞并自动断言(判断true/false),从而导致核心转储并从父进程自动重启。

Watchdog 默认是启动的。

由于每个线程的阻塞时间不应超过 mysql-poll_timeout 毫秒(默认为2000),监视程序会每 mysql-poll_timeout+1000毫秒检查一次心跳(默认为3秒,2000毫秒+1000毫秒): 如果 restart_on_missing_heartbeats 为真,则丢失了心跳,监视程序 watchdog 会触发一个断言。

restart_on_missing_heartbeats 只能在配置文件的全局部分配置,默认值为10。如果 restart_on_missing_heartbeats 设置为0,则 watchdogs 仍将执行检查并在错误日志中生成条目, 但它不会断言,也不会重新启动proxysql。配置详情参考《10_ProxySQL配置之Configuration_file.txt》

二、Note on proxysql and gdb

watchdog 模块非常简单且无锁,因此它永远不会阻塞。 尽管如此,监视程序模块具有自己的心跳,因此能够检测proxysql是否被故意阻止,例如在gdb中使用SIGSTOP信号或SIGINT信号:如果发生阻塞情况,它将不会断言。

~ ~ 完毕!