暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

高可用需要的watchdog是什么,还要定期给狗投食?

什么是watchdog?

watchdog,用于监视机器的基本运行状况的守护程序,如果检测到系统hang死或者进程hang死,就会触发系统重新启动(或者是执行自定义脚本)。

一般分为硬件看门狗和软件看门狗,硬件看门狗需要在BIOS里面设置,而软件看门狗只需要安装watchdog包,稍微配置一下就行了。

[root@localhost ~]# rpm -Uvh watchdog-5.13-12.el7.x86_64.rpm warning: /run/media/prometheus/CentOS 7 x86_64/Packages/watchdog-5.13-12.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEYPreparing...                          ################################# [100%]Updating / installing...   1:watchdog-5.13-12.el7             ################################# [100%]

修改watchdog配置文件,指定设备

vi /etc/watchdog.confwatchdog-device = /dev/watchdog

让内核加载softdog。

[root@localhost ~]# modprobe softdog[root@localhost ~]# ls -l /dev/watchdogcrw-------. 1 root root 10, 130 May 29 00:45 /dev/watchdog

此时我们可以通过dmesg发现Software Watchdog Timer已经启动了。

[root@localhost ~]# dmesg | tail -1[  213.805759] softdog: Software Watchdog Timer: 0.08 initialized. soft_noboot=0 soft_margin=60 sec soft_panic=0 (nowayout=0)[root@localhost ~]# ps -ef | grep watchdogroot         11      2  0 22:44 ?        00:00:00 [watchdog/0]root         12      2  0 22:44 ?        00:00:00 [watchdog/1]root         17      2  0 22:44 ?        00:00:00 [watchdog/2]root         22      2  0 22:44 ?        00:00:00 [watchdog/3]root         39      2  0 22:44 ?        00:00:00 [watchdogd]root        761      1  0 22:44 ?        00:00:00 /usr/sbin/watchdog

接下来我们来测试究竟能不能自动进行重启。首先我们要给狗进行一个投食,来激活watchdog。

echo a > /dev/watchdog 

投食之后,如果在60秒(module setting: soft_margin=60)不继续投食,它就会把系统重启。每投食一次,在操作系统日志都会打印。watchdog did not stop

Jun  2 22:47:38 localhost kernel: watchdog: watchdog0: watchdog did not stop!Jun  2 22:47:44 localhost kernel: watchdog: watchdog0: watchdog did not stop!Jun  2 22:47:52 localhost kernel: watchdog: watchdog0: watchdog did not stop!

如果60秒不给狗投食,就会发生重启。通过这种机制,可以保证系统进程崩溃,无法正常定时“喂狗”,Linux系统在看门狗作用下发生重新启动(reboot)。当然咱们也可以把重启改成自定义的脚本去执行。

Patroni和Watchdog的配置

总共需要配置三个参数,Patroni默认使用的是软件狗,当Patroni进程应为崩溃或者是假死无法正常给/dev/watchdog投食的时候,就会由watchdog触发重启。

Mode 有三种方式。分别是off、automatic和required。当设置为off的时候将关闭该功能。设置为automatic,当watchdog可用就使用它,不可用就忽略它的存在。设置为required的意思就是,watchdog必须是成功启用的,否则节点将不能成为leader。

device 前面我们介绍过,就是watchdog的一个设备文件。需要定期给它投食(写入)。

safety_margin  这个指的是当leader key过期和watchdog触发重启之间的安全边际。要理解这个意思,我们需要看官方文档的一段介绍。

这段话还是很难理解的,我开始没理解HA LOOP是什么含义。

后面才觉得这可能说的是每隔10秒钟,Patroni会循环往dcs写入leader key+TTL。在我们默认设置的情况下,loop_wait设置为10,ttl设置为30,safety_margin设置为5。这个设置在TTL过期的前5秒就会触发watchdog重启。由于存在主机资源利用率高及进程卡死等因素,第一次更新leader key失败,它还会尝试第二次(retry_timeout)。在第二次到watchdog重启之间之前,是有15秒的时间。这个过程我个人理解就是文中的HA LOOP。还有一点是默认情况下,将访问DCS配置在10秒后超时,这意味着当DCS不可用时(例如由于网络问题),Patroni和PostgreSQL将具有至少5秒(ttl-safety_margin-loop_wait-retry_timeout)进入所有客户端的状态连接终止。

后面的意思是说整个Patroni进程如果暂停了,它也也会导致watchdog延迟,为了确保watchdog在所有情况下都会触发重启,就要将safety_margin设置为-1。这使得watchdog会在ttl/2时就触发,如果要保证这个机制,就需要增加ttl时间和减少loop_wait时间和retry_timeout次数。

尾声

最近有点忙,停了一周,不过现在事情已经忙完了,又可以继续学PG和Patroni了。

文章转载自励志成为postgresql大神,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论