Pre
高可用 - 06 Keepalived基础功能应用实例用到了vrrp_script这个模块,此模块专门用于对集群中服务资源进行监控。与此模块一起使用的还有track_script模块,在此模块中可以引入监控脚本、命令组合、shell语句等,以实现对服务、端口多方面的监控
track_script模块主要用来调用“vrrp_script”模块使Keepalived执行对集群服务资源的监控。
此外,在vrrp_script模块中还可以定义对服务资源监控的时间间隔、权重等参数,通过vrrp_script和track_script组合,可以实现对集群资源的监控并改变集群优先级,进而实现Keepalived的主、备节点切换。
vrrp_script模块常见的几种监控机制
通过killall命令监控服务运行状态
这种监控集群服务的方式主要是通过killall命令实现的。
killall会发送一个信号给正在运行指定命令的进程。如果没指定信号名,则发送SIGTERM。
SIGTERM也是信号名的一种,代号为15,它表示以正常方式结束程序的运行。其实killall可用的信号名有很多,可通过“killall -l”命令显示所有信号名列表,其中每个信号名代表对进程的不同执行方式。
[root@VM-24-3-centos ~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX [root@VM-24-3-centos ~]# killall -l HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS UNUSED [root@VM-24-3-centos ~]#
例如,代号为9的信号表示将强制中断一个程序的运行。这里要用到的信号为0,代号为0的信号并不表示要关闭某个程序,而表示对程序(进程)的运行状态进行监控,如果发现进程关闭或其他异常,将返回状态码1,反之,如果发现进程运行正常,将返回状态码0。vrrp_script模块正是利用了killall命令的这个特性,变相地实现了对服务运行状态的监控。
看个例子
vrrp_script check_mysqld { script "killall -0 mysqld" interval 2 } track_script { check_mysqld }
在这个例子中,定义了一个服务监控模块check_mysqld,其采用的监控方式是通过“killall -0 mysqld”,其中“interval”选项用于设置检查的时间间隔,即2秒钟执行一次检测。
在mysql服务运行正常的情况下,通过killall命令检测的结果如下。
[root@keepalived-master ~]# killall -0 mysqld [root@keepalived-master ~]# echo $? 0
这里通过“echo $?
”方式显示了上个命令返回的状态码,mysql服务运行正常,因此返回的状态码为0,此时check_mysqld模块将返回服务检测正常的提示。
接着将mysql服务关闭,再次执行检测,结果如下。
[root@keepalived-master ~]# killall -0 mysqld mysqld: no process killed [root@keepalived-master ~]# echo $? 1
由于mysql服务被关闭,因此返回的状态码为1,此时check_mysqld模块将返回服务检测失败的提示。然后根据vrrp_script模块中设定的“weight”值重新设置Keepalived主、备节点的优先级,进而引发主、备节点发生切换。
从这个过程可以看到,vrrp_script模块其实并不关注监控脚本或监控命令是如何实现的,它仅仅通过监控脚本的返回状态码来识别集群服务是否正常,如果返回的状态码为0,那么就认为服务正常,如果返回的状态码为1,则认为服务故障。明白了这个原理之后,在进行自定义监控脚本的时候,只需按照这个原则来编写即可。
检测端口运行状态
检测端口的运行状态,也是最常见的服务监控方式。在Keepalived的vrrp_script
模块中可以通过如下方式对本机的端口进行检测。
vrrp_script check_httpd { script "</dev/tcp/127.0.0.1/80" interval 2 fall 2 rise 1 } track_script { check_httpd }
在这个例子中,通过“</dev/tcp/127.0.0.1/80”这样的方式定义了一个对本机80端口的状态检测。其中
“fall”选项表示检测到失败的最大次数。也就是说,如果请求失败两次,就认为此节点资源发生故障,将进行切换操作;
“rise”表示如果请求一次成功,就认为此节点资源恢复正常。
通过shell语句进行状态监控
在Keepalived的vrrp_script模块中甚至可以直接引用shell语句进行状态监控。
vrrp_script chk_httpd { script "if [ -f /var/run/httpd/httpd.pid ]; then exit 0; else exit 1; fi" interval 2 fall 1 rise 1 } track_script { chk_httpd }
在这个例子中,通过一个shell判断语句,检测httpd.pid文件是否存在,如果存在,就认为状态正常,否则认为状态异常,这种监测方式对于一些简单的应用监控或者流程监控非常有用。从这里也可以得知,vrrp_script模块支持的监控方式十分灵活。
通过脚本进行服务状态监控
这是最常见的监控方式, 这里只有0、1两种返回状态。下面给出一个示例。
vrrp_script chk_mysqld { script "/etc/keepalived/check_mysqld.sh" interval 2 } track_script { chk_mysqld }
其中,check_mysqld.sh的内容如下。
#!/bin/bash MYSQL=/usr/bin/mysql MYSQL_HOST=localhost MYSQL_USER=root MYSQL_PASSWORD='xxxxxx' $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" > /dev/null 2>&1 if [ $? = 0 ] ;then MYSQL_STATUS=0 else MYSQL_STATUS=1 fi exit $MYSQL_STATUS
这个一个最简单地实现mysql服务状态检测的shell脚本,它通过登录mysql数据库后执行查询操作来检测mysql运行是否正常,如果检测正常,将返回状态码0,否则返回状态码1。