一.通过vrrp_script实现对集群资源的监控:

        Keepalived基础HA功能时用到了vrrp_script这个模块,此模块专门用于对集群中服务资源进行监控。与此模块一起使用的还有track_script模块,在此模块中可以引入监控脚本、命令组合、shell语句等,以实现对服务、端口等多方面的监控。track_script模块主要用来调用“vrrp_script”模块使Keepalived执行对集群服务资源的检测。

          此外,在vrrp_script模块中可以定义对服务资源检测的时间间隔、权重等参数,通过vrrp_script和track_script组合,可以实现对集群资源的监控并改变集群优先级,进而实现Keepalived的主、备节点切换。

    1.通过killall命令探测服务运行状态:

            这种监控集群服务的方式主要是通过killall命令实现的。killall会发送一个信号到正在运行的指定命令的进程。如果没指定信号名,则发送SIGTERM。SIGTERM也是信号名的一种,代号为15,它表示以正常的方式结束程序的运行。其实killall可用的信号名有很多,可通过“killall -l ”命令显示所有信号名列表,其中每个信号名代表对进程的不同执行方式,例如,代号为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”选项检查的时间间隔,即2s执行一次检测。

            在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: 没有进程被杀死

                    [root@keepalived-master ~]# echo $?

                    1

            由于MySQL服务被关闭,因此返回的状态码为1,此时check_mysqld模块将返回服务检测失败的提示。然后根据vrrp_script模块中设定的“weight”值重新设置Keepalived 主、备节点的优先级,进而引发主、备节点发生切换。

            从这个过程可以看到,vrrp_script模块其实并不关注监控脚本或监控命令是如何实现的,它仅仅通过监控脚本的返回状态码来识别集群服务是否正常,如果返回状态码为0,那么就认为服务正常,如果返回状态码为1,则认为服务故障。明白了这个原理之后,在进行自定义监控脚本的时候,只需按照这个原则来编写即可。

    2.检测端口运行状态:

            检测端口的运行状态也是最常见的服务监控方式,在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端口的状态检测,其中,“fail”选项表示检测到失败的最大次数,也就是说,如果请求失败两次,就认为此节点资源发生故障,将进行切换操作;“rise”表示如果请求一次成功,就认为此节点资源恢复正常。

    3.通过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模块支持的监控方式十分灵活。

    4. 通过脚本进行服务状态监控:

            这是最常见的监控方式,其监控过程类似于nagios的执行方式,不同的是,这里只有0、1两种返回状态,例如:                    

                    vrrp_script chk_mysqld {

                        script "/etc/keepalived/check_mysqld.sh"

                        interval 2

                        }

                     track_script {

                            chk_mysqld

                        }

                其中,check_mysqld.sh的内容为:            

                    #!/bin/bash

                    /usr/bin/mysql -e "show status;" > /dev/null 2>&1

                    if [ $? -eq 0 ];then

                        MYSQL_STATUS=0

                    else

                        MYSQL_STATUS=1

                    fi

                    exit $MYSQL_STATUS

                这是一个最简单的实现MySQL服务状态检测的shell脚本,它通过登录MySQL数据库后执行查询操作来检测MySQL运行是否正常,如果检测正常,将返回状态码0,否则返回状态码1。其实,很多在nagios下运行的脚本,只要稍作修改,既可在这里使用,非常方便。