高可用 - 07 Keepalived 通过 vrrp_script实现对集群资源的监控的几种方式

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 高可用 - 07 Keepalived 通过 vrrp_script实现对集群资源的监控的几种方式

0bc7b7bcd1fc4752b429566093397057.png


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。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
window.scrollTop 不生效的原因,如何解决
window.scrollTop 不生效的原因,如何解决
928 0
|
PHP 数据库 数据安全/隐私保护
|
4月前
|
存储 弹性计算 Linux
阿里云服务器从零到精通的购买指南,云服务器购买流程及注意事项参考
对于许多初次接触阿里云服务器的用户而言,如何选择云服务器配置以及在选购过程中有哪些注意事项,是新手用户比较关心的问题。本文为大家展示阿里云服务器选购的完整指南,涵盖了通过云服务器ECS产品页下单的详细步骤,以及通过阿里云的活动选购价格比较实惠的云服务器。重点是介绍每一步的注意事项,以供初次选购阿里云服务器的个人开发者和企业用户参考,尽量一次选购好,避免出现买错从新买的情况出现。
|
5月前
|
JSON 数据挖掘 API
Lazada商品 API接口,开发者详解与使用指南
Lazada商品API为开发者提供商品信息获取功能,适用于电商应用开发与数据分析。支持获取标题、价格、库存等详细信息,具备实时更新、高并发支持等特点,适用于竞品分析、价格趋势研究、导购应用及客服系统集成。需获取凭证后调用接口,示例代码使用Python实现。
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
28410 0
|
安全 Java 测试技术
Java“AccessControlException”解决
Java中的“AccessControlException”通常发生在尝试访问受限资源时,如文件或网络。解决方法包括:确保所需权限已授予,检查安全策略配置,使用doPrivileged块执行敏感操作。调整策略文件或代码以匹配实际需求。
691 1
|
算法 数据挖掘 Shell
「毅硕|生信教程」 micromamba:mamba的C++实现,超越conda
还在为生信软件的安装配置而烦恼?micromamba(micromamba是mamba包管理器的小型版本,采用C++实现,具有mamba的核心功能,且体积更小,可以脱离conda独立运行,更易于部署)帮你解决!
511 1
|
监控 Java Linux
Hutool操作和监听文件
Hutool操作和监听文件
367 0
|
分布式计算 安全 大数据
MaxCompute 的安全性和数据隐私保护
【8月更文第31天】在当今数字化转型的时代背景下,企业越来越依赖于大数据分析来推动业务增长。与此同时,数据安全和隐私保护成为了不容忽视的关键问题。作为阿里巴巴集团推出的大数据处理平台,MaxCompute(原名 ODPS)致力于为企业提供高效、安全的数据处理解决方案。本文将探讨 MaxCompute 在数据安全方面的实践,包括数据加密、访问控制及合规性考虑等方面。
322 0
|
存储 监控 API
如何监控 Docker 的状态
【8月更文挑战第24天】
681 0