HA - Keepalived

Keepalived是集群管理中保证服务高可用的一个服务软件,用于解决单点故障,就是当一台服务器宕机后,保证服务不会停止。为了能够稳定地提供服务我们可以使用Keepalived实现双机热备,当主服务器宕机后切换到备选服务器。

高可用:两台业务系统启动着相同的服务,如果有一台故障,另一台自动接管,我们将将这个称之为高可用;

实现原理: 通过VRRP协议实现 , 全称Virtual Router Redundancy Protocol (虚拟路由冗余协议) ,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。虚拟IP的切换MasterBackup发送组播,当Backup收不到vrrp包时就认为master宕掉了,然后就会根据vrrp优先级来选出一个backupmaster,以此保证服务高可用。

一、双机热备

1.环境准备

规划:

IP主机名备注
10.1.1.31web01.tigeru.cnMaster
10.1.1.32web02.tigeru.cnBackup
10.1.1.33mysql01.tigeru.cnMysql

环境配置请参考:

Nginx+PHP: https://www.tigeru.cn/archives/64/

MySQL: https://www.tigeru.cn/archives/64/#%E4%B8%80%E3%80%81MySQL

2. Keepalived

安装(web01、web02)

yum install keepalived -y

配置(web01、web02)

vim /etc/keepalived/keepalived.conf

注意:1.3以后版本要注释vrrp_strict,否则虚拟IP无法ping通

启动(web01、web02)

systemctl  start  keepalived

测试

#查看日志
tail /var/log/messages
#查看虚拟IP挂载情况
ip a

二、Nginx 实现HA

(1)创建脚本

用于检测Nginx服务是否挂掉,当nginx挂掉后,则关闭keepalived服务,以实现VIP切换

vim /scripts/check_nginx.sh
chmod +x /scripts/check_nginx.sh

脚本内容:

#!/bin/bash
#判断Nginx服务是否启动,若没有启动则关闭Keepalived服务
nginx_status=`ps -C nginx --no-header | wc -l`
#根据返回的进程数,判断nginx是否宕机
if [ $nginx_status -eq 0 ];then
        systemctl  stop keepalived  
fi

(2)修改keepalived配置文件:

#vim /etc/keepalived/keepalived.conf
#定义
vrrp_script check_nginx {
    script /scripts/check_nginx.sh
    interval 3
}
vrrp_instance VI_1 {
   ...
   #调用
   track_script {
      check_nginx
}

模拟测试:

#关闭Nginx服务
sbin/nginx -s stop
#查看VIP切换情况
ip a

三、LNMP切换为双机热备

LNMP 环境为: https://www.tigeru.cn/archives/72/ 商城项目

1.(原LNMP)MySQL数据迁移

 #导出数据
 mysqldump -uroot --databases ds_shop > ~/ds_shop.sql -p
 #推送备份脚本到Mysql01服务器
 rsync -av ds_shop.sql root@10.1.1.33:/root/

2.(mysql)数据还原

mysql < ds_shop.sql -p

3.(mysql)创建MySQL账号

grant all on ds_shop.* to 'dsshop'@'10.1.1.%' identified by '123';
flush privileges;

4.(web01,web02)修改项目数据库连接信息

vim /www/shop/application/database.php

5.模拟故障

sbin/nginx -s stop

四、补充

1.非抢占模式

默认keepalived 会根据vrrp优先级选择master;当master故障恢复后会重新抢占VIP,影响用户体验,为了解决这一个小问题,可以配置非抢占模式,所有机器都配置为BACKUP并添加 nopreempt

vrrp_instance VI_1 {
   ...
   state BACKUP
   nopreempt 
}

重载服务生效

2. VIP脑裂

正常情况下只有一台机器有VIP,有时候可能会产生多台机器同时拥有VIP,这种情况称为VIP脑裂

产生原因可能为:防火墙未配置vrrp规则

查看:

检测是否出现脑裂情况:

通过tcpdump查看广播发送信息,或者直接查看VIP挂载情况 ip a

 yum install tcpdump
 tcpdump -i ens33 vrrp -n
# -i:指定网卡
# -n:以数字形式显示IP地址

解决:

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload

3.单播模式

keepalived ,默认组播模式下,会向组播地址224.0.0.18发送信息,会产生一些无用信息,而且可能会产生干扰和冲突, 还有就是在云服务器中是禁止组播使用的,所以我们可以通过单播模式,向特定主机发送信息。 单播模式需要关闭vrrp_strict这个选项,需要在VIP实例配置段加入单播的源地址和目标地址

配置:

vim /etc/keepalived/keepalived.conf

keepalived 1.3以后版本要注释vrrp_strict

分别在不同主机进行配置:

#web01
vrrp_instance VI_1 {
    unicast_src_ip 10.1.1.31
    unicast_peer {
        10.1.1.32
        ...
    }
}
#web02
vrrp_instance VI_1 {
    unicast_src_ip 10.1.1.32
    unicast_peer {
        10.1.1.31
        ...
    }
}

其他

更多可参考: https://www.jianshu.com/p/a6b5ab36292a

Last modification:December 1st, 2019 at 11:01 pm