一 Keepalived概述
1.1 keepalived概述
keepalived是vrrp协议的实现,原生设计目的是为了高可用ipvs服务,keepalived能够配置文件中定义生成ipvs规则,并能够对各RS的健康状态进行检测;通过共用的虚拟IP地址对外提供服务;每个热备组内同一时刻只有一台主服务器提供服务,其他服务器处于冗余状态,若当前在线的服务器宕机,其虚拟IP地址将会被其他服务器接替(优先级决定接替顺序),实现高可用为后端主机提供服务。
1.2 vrrp概述
VRRP是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的VRRP路由器中的一台。
控制虚拟路由器IP地址的VRRP路由器称为主路由器,它负责转发数据包到这些虚拟IP地址。一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,这就允许虚拟路由器的IP地址可以作为终端主机的默认第一跳路由器。
1.3 keepalived的模式
keepalive通过组播,单播等方式(自定义),实现keepalive主备推选。工作模式分为抢占和非抢占(通过参数nopreempt来控制)。
1)抢占模式:
主服务正常工作时,虚拟IP会在主上,备不提供服务,当主服务优先级低于备的时候,备会自动抢占虚拟IP,这时,主不提供服务,备提供服务。
也就是说,工作在抢占模式下,不分主备,只管优先级。
如上配置,不管keepalived.conf里的state配置成master还是backup,只看谁的priority优先级高(一般而言,state为MASTER的优先级要高于BACKUP)。priority优先级高的那一个在故障恢复后,会自动将VIP资源再次抢占回来!!
2)非抢占模式:
这种方式通过参数nopreempt(一般设置在advert_int的那一行下面)来控制。不管priority优先级,只要MASTER机器发生故障,VIP资源就会被切换到BACKUP上。并且当MASTER机器恢复后,也不会去将VIP资源抢占回来,直至BACKUP机器发生故障时,才能自动切换回来。
千万注意:
nopreempt这个参数只能用于state为backup的情况,所以在配置的时候要把master和backup的state都设置成backup,这样才会实现keepalived的非抢占模式!
也就是说:
A)当state状态一个为master,一个为backup的时候,加不加nopreempt这个参数都是一样的效果。即都是根据priority优先级来决定谁抢占vip资源的,是抢占模式!
B)当state状态都设置成backup,如果不配置nopreempt参数,那么也是看priority优先级决定谁抢占vip资源,即也是抢占模式。
C)当state状态都设置成backup,如果配置nopreempt参数,那么就不会去考虑priority优先级了,是非抢占模式!即只有vip当前所在机器发生故障,另一台机器才能接管vip。即使优先级高的那一台机器恢复后也不会主动抢回vip,只能等到对方发生故障,才会将vip切回来。
1.4 keepalived的组件

core:keepalived核心组件,主进程的启动和维护,全局配置等。
vrrp stack:keepalived是基于vrrp协议实现高可用vps服务,vrrp则为相关子进程为其提供服务
check:检测keepalived的健康状态相关进程
system call:系统调用
watch dog:监控check和vrrp进程的看管者,check负责检测器子进程的健康状态,当其检测到master上的服务不可用时则通告vrrp将其转移至backup服务器上。
二 安装keepalived的依赖
2.1 安装keepalived的依赖软件包
https://blog.youkuaiyun.com/Loiterer_Y/article/details/104468964/
软件包位置:见百度网盘中软件包

离线安装keepalived的所有依赖,如下图所示:

下载所有依赖之后,将其上传到服务器,然后在依赖所在文件夹内执行
rpm -Uvh --force *.rpm即可。

2.2 安装keepalived
2.2.1 安装keepalived的版本

2.2.2 进行安装
进入到/usr/local/src目录下:
| [root@bogon src]# pwd /usr/local/src [root@bogon src]# tar -zxvf /root/bigdata-software/keepalived-1.4.0.tar.gz -C . keepalived-1.4.0/ keepalived-1.4.0/install-sh keepalived-1.4.0/missing keepalived-1.4.0/compile [root@bogon src]# cd keepalived-1.4.0 [root@bogon keepalived-1.4.0]# ls aclocal.m4 AUTHOR ChangeLog configure CONTRIBUTORS depcomp genhash install-sh keepalived.spec.in Makefile.am missing snap ar-lib bin_install compile configure.ac COPYING doc INSTALL keepalived lib Makefile.in README.md TODO [root@bogon keepalived-1.4.0]# ./configure --prefix=/usr/local/keepalived checking for a BSD-compatible install... /usr/bin/install -c [root@bogon keepalived-1.4.0]# make && make install Making all in lib make[1]: Entering directory `/usr/local/src/keepalived-1.4.0/lib' [root@bogon keepalived-1.4.0]# cp /usr/local/src/keepalived-1.4.0/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/ cp: overwrite ‘/etc/rc.d/init.d/keepalived’? y [root@bogon keepalived-1.4.0]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ cp: overwrite ‘/etc/sysconfig/keepalived’? y [root@bogon keepalived-1.4.0]# mkdir /etc/keepalived/ [root@bogon keepalived-1.4.0]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ [root@bogon keepalived-1.4.0]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ [root@bogon keepalived-1.4.0]# echo "/etc/init.d/keepalived start" >> /etc/rc.local |
2.2.3 修改配置文件
| [root@bogon keepalived-1.4.0]# cd /etc/keepalived [root@bogon keepalived]# ls keepalived.conf [root@bogon keepalived]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak [root@bogon keepalived]# ls keepalived.conf keepalived.conf.bak [root@bogon keepalived]# vim /etc/keepalived/keepalived.conf |
修改内容:
| ! Configuration File for keepalived global_defs { notification_email { ops@wangshibo.cn tech@wangshibo.cn } notification_email_from ops@wangshibo.cn smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MASTER-HA } vrrp_script chk_mysql_port { #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等 script "/opt/chk_mysql.sh" #这里通过脚本监测 interval 2 #脚本执行间隔,每2s检测一次 weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) rise 1 #检测1次成功就算成功。但不修改优先级 } vrrp_instance VI_1 { state MASTER interface eth0 #指定虚拟ip的网卡接口 mcast_src_ip 192.168.152.136 virtual_router_id 51 #路由器标识,MASTER和BACKUP必须是一致的 priority 101 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.152.130 } track_script { chk_mysql_port } } |
需要注意的地方:

2.2.4 脚本配置
| [root@bogon keepalived]# vim /opt/chk_mysql.sh |
修改内容:
| #!/bin/bash port=`netstat -lntup |grep 3306|wc -l` echo $port if [ $port -ne 1 ] then /etc/init.d/keepalived stop else echo "Mysql is running" fi |
赋予执行权限
| [root@bogon keepalived]# chmod 755 /opt/chk_mysql.sh |
2.2.5 启动keeepalived
| [root@bogon keepalived]# /etc/init.d/keepalived start Starting keepalived (via systemctl): [ OK ] [root@bogon keepalived]# /etc/init.d/keepalived status ● keepalived.service - LVS and VRRP High Availability Monitor Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled) Active: active (running) since Mon 2022-07-25 08:27:09 CST; 4s ago Process: 24336 ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS) Main PID: 24337 (keepalived) Tasks: 1 CGroup: /system.slice/keepalived.service └─24337 /usr/local/keepalived/sbin/keepalived -D Jul 25 08:27:09 bogon Keepalived_vrrp[24339]: Registering Kernel netlink reflector Jul 25 08:27:09 bogon Keepalived_vrrp[24339]: Registering Kernel netlink command channel Jul 25 08:27:09 bogon Keepalived_vrrp[24339]: Registering gratuitous ARP shared channel Jul 25 08:27:09 bogon Keepalived_vrrp[24339]: Opening file '/etc/keepalived/keepalived.conf'. Jul 25 08:27:09 bogon Keepalived_vrrp[24339]: WARNING - default user 'keepalived_script' for script execution does not exist - please create. Jul 25 08:27:09 bogon Keepalived_vrrp[24339]: Cant find interface eth0 for vrrp_instance VI_1 !!! Jul 25 08:27:09 bogon Keepalived_vrrp[24339]: Default interface eth0 does not exist and no interface specified. Skipping static address 192.168.152.130. Jul 25 08:27:09 bogon Keepalived_vrrp[24339]: VRRP_Instance(VI_1) Unknown interface ! Jul 25 08:27:10 bogon Keepalived[24337]: Keepalived_vrrp exited with permanent error CONFIG. Terminating Jul 25 08:27:10 bogon Keepalived[24337]: Stopping |
效果截图:

2.2.6 另一种mysql检测脚本
#!/bin/bash
set -x
MYSQL=/usr/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER='check_mysql'
MYSQL_PASSWORD=''
CHECK_TIME=3
#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
MYSQL_OK=1
function check_mysql_health (){
running_bak=`ps -AF | grep "single-transaction --all-databases --triggers --routines --flush-logs" | grep -v "grep" | wc -l`;
if [ $running_bak -ne 0 ]; then
return $MYSQL_OK;
fi
$MYSQL -h$MYSQL_HOST -u$MYSQL_USER -e"show status;" >/dev/null 2>&1
if [ $? = 0 ] ;then
MYSQL_OK=1
else
MYSQL_OK=0
fi
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME -= 1"
check_mysql_health
if [ $MYSQL_OK = 1 ] ; then
CHECK_TIME=0
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
/etc/init.d/keepalived stop
exit 1
fi
sleep 1
done
三 在线安装keepalived的依赖(了解)
yum install keepalived -y
本文介绍Keepalived的基本概念,包括其作用、工作模式及组件,并详细指导如何安装依赖及配置Keepalived来实现高可用性服务。通过具体实例展示了如何通过脚本检测MySQL服务的状态。
1173

被折叠的 条评论
为什么被折叠?



