(5.18)Mysql+Keepalived+LVS读负载均衡

【1】环境介绍

【1.1】基本架构描述

Keepalived,只需要在负载均衡机器上配置

而LVS需要在所有的4台机器上配置

OS:CentOS7.5

MySQL:5.7.26

Keepalived:1.4.5

描述  IP 主机名
LVS+Keepalived:主服务器1 192.168.1.201 db
LVS+Keepalived:从服务器2 192.168.1.202 db1
LVS+Keepalived的虚拟地址IP(VIP) 192.168.1.210 db/db1来回切换
Mysql:从服务器1 192.168.1.203 db2
Mysql:从服务器2 192.168.1.204 db3

【2】ipvsadm安装(LVS的两台服务器200,201)

【2.1】ipvsadm工具介绍

由于LVS本质上是一个内核模块,所以我们需要借助一些用户层工具去配置管理,主要有以下两个工具

  (1)keepalived

  (2)ipvsadm

以上两种工具都是用来配置LVS的,大致区别如下:

  (1)ipvsadm是命令行工具,每次重启都需要重新配置(或者写入开机脚本中),但是配置参数十分灵活;

  (2)Keepalived是一个服务(Deamon),通过编辑配置文件(/etc/keepalived/keepalived.conf)可以很方便的对LVS的参数做调整,且重启后不会丢失;

  (3)keepalived还有多机热备的功能(VRRP协议),可以将多台服务器组成Master-Slave集群,通过虚拟IP的方式对外提供服务,使得LVS不会成为单点故障;

  (4)Keepalived还可以配置后端Server检测,当发现服务不可用时,将该Server从转发列表中剔除,具有健康检查机制;

我们这里选择使用Keepalived对LVS进行配置。

从linux2.4版本开始,Linux内核默认支持LVS。要使用LVS的能力,只需要装一个LVS管理工具:ipvsadm

LVS的结构主要分为两部分:

  (1)工作在内核空间的IPVS模块,LVS的能力实际上都是由IPVS模块实现。

  (2)工作在用户空间的ipvsadm管理工具。其作用是想用户提供一个命令接口,用于将配置的虚拟服务、真是服务等传给IPVS模块。

【2.2】ipvsadm工具安装

备份在两台LVS服务器安装 ipvsadm

(1)加载本地源或Yum源

mount /dev/cdrom /mnt
#源配置参考:https://www.cnblogs.com/gered/p/10768795.html

(2)查看ipvs、安装ipnv

#查看ipvs在Yum源中是否存在,以及是什么版本
yum list|grep ipvs

#安装
yum install ipvsadm -y

#查看
lsmod|grep "^ip_vs"
ipvsadm
ipvsadm -v

【2.3】ipvsadm常用统计参数查看

#查看当前配置的虚拟服务和各个RS的权重
ipvsadm -Ln

#查看当前ipvs模块中记录的链接(可用于观察转发情况)
ipvsadm -lnc

#查看ipvs模块的转发情况统计
ipvsadm -Ln --stats
ipvsadm -Ln --rate

#--stats和--rate统计在分析问题时经常用到,其具体含义如下:

--stats 选项是统计自该条转发规则生效依赖的包
1.Conns   (connections scheduled)已经转发过的连接数
2.InPkts  (incoming packets) 入包个数
3.OutPkts  (outgoing pachkets) 出包个数
4.InBytes  (incoming bytes)  入流量(字节)

--rate 选项显示的是速率信息
1.CPS   (current connection rate) 每秒连接数
2.InPPS   (current in packet rate) 每秒的入包个数
3.OutPPs  (current out packet rate) 每秒的出包个数
4.InBPS   (current in byte rate) 每秒流入流量(字节)
5.OutBPS  (current out byte rate) 每秒流出流量(字节)

【3】Keepalived安装(LVS的两台服务器200,201)

【3.1】前置环境配置(允许IP非本地绑定支持、防火墙、路由转发)

#(1)添加非本机IP绑定支持
echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf
sysctl -p

#(2)配置iptables,添加VRRP通讯支持
-A INPUT -d 224.0.0.18 -j ACCEPT #允许组播地址访问本机,组播地址用于keepalived互相检测心跳
-A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT #允许组播地址通信
-A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协议)通信
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCPET #开发mysql3306端口

#(3)开启路由转发功能
#临时
echo "1">/proc/sys/net/ipv4/ip_forward

#永久
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

【3.2】下载安装 Keepalived

#(1)下载
官网:https://www.keepalived.org/download.html
wget https://www.keepalived.org/software/keepalived-1.4.5.tar.gz

#(2)安装前置依赖包
mount /dev/cdrom /mnt #加载本地源,有网络直接配置也可(参考:yum源配置、epel源配置yum install kernel-devel openssl-devel popt-devel -y

#(3)安装
cd /soft/
tar -zxvf keepalived-1.3.3.tar.gz
cd keepalived-1.3.4
./configure --prefix=/usr/local/keepalived/
make && make install

#(4)设置keepalived开机自启
systemctl enable keepalived

#默认日志在 /var/log/messages
------------下面(5)(6)可以忽略------------------------ #(
5)如果不设置自定义目录,默认目录如下 #cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ #cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ #mkdir /etc/keepalived #cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ #cp /usr/local/sbin/keepalived /usr/sbin/ #(5)构建keepalived 配置文件目录与文件 mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ #(6)基本配置文件复制 cp usr/local/keepalived/sbin/keepalived /usr/sbin/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

【3.3】修改默认日志位置

#默认错误日志位置:/var/log/messages
#(1)修改keepalived的文件
vim /usr/local/keepalived/etc/sysconfig/keepalived

#左边改成右边
KEEPALIVED_OPTIONS="-D" =》 KEEPALIVED_OPTIONS="-D -d -S 0"   

# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
# --dump-conf         -d    Dump the configuration data.
# --log-detail        -D    Detailed log messages.
# --log-facility      -S    0-7 Set local syslog facility (default=LOG_DAEMON)

#(2)修改日志级别参数文件
vi /etc/rsyslog.conf

#在最后一行加上
local0.* /var/log/keepalived.log

#(3)重启日志服务
systemctl daemon-reload systemctl restart rsyslog

【3.4】编辑配置文件 keepalived.conf

mkdir /etc/keepalived
vim /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
######### template 192.168.1.200

global_defs 
{#全局定义
   router_id LVS-HA #全局Keepaliveed ID表示,同一个集群需要相同
  notification_email 
  {
     2536473697@qq.com
   }
  notification_email_from 2536473697@qq.com
  smtp_server stmp.qq.com
  smtp_connect_timeout 30
} 

vrrp_script check_run 
{#VRRP自定义脚本,check_run自定义名称
  script "/etc/keepalived/mysql_check.sh" #调用的脚本文件URL
  interval 60 #运行间隔,单位为秒
}

vrrp_sync_group VG1 
{#vrrp同步组,VG1是自定义名称
  group 
  {#组内成员
    VI_1
  }
}

vrrp_instance VI_1 
{#vrrp虚拟实例
    state BACKUP #备用
    interface ens33 #针对监听的网络接口
    virtual_router_id 210 #唯一路由ID,同一个虚拟组要一致
    priority 100 #权限
    advert_int 5 #广播频率,单位是秒,测试keepalived伙伴存活判定
    nopreempt #非抢占模式
    authentication 
  {#同一组keepalived的验证方式
        auth_type PASS
        auth_pass 123456
  }

  track_script 
  {#定义跟踪使用脚本
    check_run #这里就是我们上面自己定义的脚本
  } 
  virtual_ipaddress 
  { #设置虚拟IP
    192.168.1.210/24 
  } 
}

virtual_server 192.168.1.210 3306 
{#配置虚拟组中的服务,IP+端口,以空格分隔
    delay_loop 2 #运行情况检查,IP+端口是否可用,单位是秒
    lb_algo rr   #设置负载调度算法,这里设置rr,即轮询算法
    lb_kind DR   #设置LVS实现负载均衡机制,有NAT、TUN、DR(直接路由)三个模式可选
    persistence_timeout 0 #会话保持单位时间,单位是秒。比如这里写50,则同一个IP连接在50秒内会被分配到同一台真实服务器
    protocol TCP #指定转发协议类型,有TCP和UDP两种

  #虚拟服务组中的实际转发的主机信息
   real_server 192.168.1.202 3306 {#虚拟服务器对应的实际服务器、端口
     weight 1 #配置服务节点的权值,权值数字越大,权值越高
    TCP_CHECK
    {
       connect_timeout 3 #tcp检测参数,表示3秒无响应超时
        retry 3 #表示最大重试次数
        delay_before_retry 3 #表示重试间隔秒数
      #connect_port 3306 #表示连接检测的端口为3306
    }
  }
   real_server 192.168.1.203 3306 {#虚拟服务器对应的实际服务器、端口
     weight 1 #配置服务节点的权值,权值数字越大,权值越高
    TCP_CHECK
    {
       connect_timeout 3 #tcp检测参数,表示3秒无响应超时
        nb_get_retry 3 #最大重试次数
        delay_before_retry 3 #重试间隔秒数
      connect_port 3306 #健康检测的端口为3306
    }
  }
}


【我的实际】直接可用的代码

########## master 192.168.1.200
global_defs
{#全局定义
router_id LVS-HA #全局Keepaliveed ID表示,同一个集群需要相同
notification_email
{
2536473697@qq.com
}
notification_email_from 2536473697@qq.com
smtp_server stmp.qq.com
smtp_connect_timeout 30
}

vrrp_script check_run
{#VRRP自定义脚本,check_run自定义名称
script "/etc/keepalived/mysql_check.sh" #调用的脚本文件URL
interval 60 #运行间隔,单位为秒
}

vrrp_sync_group VG1
{#vrrp同步组,VG1是自定义名称
group
{#组内成员
VI_1
}
}

vrrp_instance VI_1
{#vrrp虚拟实例
state BACKUP #备用
interface ens34 #针对监听的网络接口
virtual_router_id 210 #唯一路由ID,同一个虚拟组要一致
priority 100 #权限
advert_int 5 #广播频率,单位是秒,测试keepalived伙伴存活判定
nopreempt #非抢占模式
authentication
{#同一组keepalived的验证方式
auth_type PASS
auth_pass 123456
}

track_script
{#定义跟踪使用脚本
check_run #这里就是我们上面自己定义的脚本
}
virtual_ipaddress
{ #设置虚拟IP
192.168.1.210/24
}
}

virtual_server 192.168.1.210 3306
{#配置虚拟组中的服务,IP+端口,以空格分隔
delay_loop 2 #运行情况检查,IP+端口是否可用,单位是秒
lb_algo rr #设置负载调度算法,这里设置rr,即轮询算法
lb_kind DR #设置LVS实现负载均衡机制,有NAT、TUN、DR(直接路由)三个模式可选
persistence_timeout 0 #会话保持单位时间,单位是秒。比如这里写50,则同一个IP连接在50秒内会被分配到同一台真实服务器
protocol TCP #指定转发协议类型,有TCP和UDP两种

#虚拟服务组中的实际转发的主机信息
real_server 192.168.1.202 3306 {#虚拟服务器对应的实际服务器、端口
weight 1 #配置服务节点的权值,权值数字越大,权值越高
TCP_CHECK
{
connect_timeout 3 #tcp检测参数,表示3秒无响应超时
retry 3 #表示最大重试次数
delay_before_retry 3 #表示重试间隔秒数
#connect_port 3306 #表示连接检测的端口为3306
}
}

real_server 192.168.1.203 3306 {#虚拟服务器对应的实际服务器、端口
weight 1 #配置服务节点的权值,权值数字越大,权值越高
TCP_CHECK
{
connect_timeout 3 #tcp检测参数,表示3秒无响应超时
retry 3 #最大重试次数
delay_before_retry 3 #重试间隔秒数
connect_port 3306 #健康检测的端口为3306
}
}
}


########## slave192.168.1.201
global_defs
{#全局定义
router_id LVS-HA #全局Keepaliveed ID表示,同一个集群需要相同
notification_email
{
2536473697@qq.com
}
notification_email_from 2536473697@qq.com
smtp_server stmp.qq.com
smtp_connect_timeout 30
}

vrrp_script check_run
{#VRRP自定义脚本,check_run自定义名称
script "/etc/keepalived/mysql_check.sh" #调用的脚本文件URL
interval 60 #运行间隔,单位为秒
}

vrrp_sync_group VG1
{#vrrp同步组,VG1是自定义名称
group
{#组内成员
VI_1
}
}

vrrp_instance VI_1
{#vrrp虚拟实例
state BACKUP #备用
interface ens34 #针对监听的网络接口
virtual_router_id 210 #唯一路由ID,同一个虚拟组要一致
priority 90 #权限
advert_int 5 #广播频率,单位是秒,测试keepalived伙伴存活判定
nopreempt #非抢占模式
authentication
{#同一组keepalived的验证方式
auth_type PASS
auth_pass 123456
}

track_script
{#定义跟踪使用脚本
check_run #这里就是我们上面自己定义的脚本
}
virtual_ipaddress
{ #设置虚拟IP
192.168.1.210/24
}
}

virtual_server 192.168.1.210 3306
{#配置虚拟组中的服务,IP+端口,以空格分隔
delay_loop 2 #运行情况检查,IP+端口是否可用,单位是秒
lb_algo rr #设置负载调度算法,这里设置rr,即轮询算法
lb_kind DR #设置LVS实现负载均衡机制,有NAT、TUN、DR(直接路由)三个模式可选
persistence_timeout 0 #会话保持单位时间,单位是秒。比如这里写50,则同一个IP连接在50秒内会被分配到同一台真实服务器
protocol TCP #指定转发协议类型,有TCP和UDP两种

#虚拟服务组中的实际转发的主机信息
real_server 192.168.1.202 3306 {#虚拟服务器对应的实际服务器、端口
weight 1 #配置服务节点的权值,权值数字越大,权值越高
TCP_CHECK
{
connect_timeout 3 #tcp检测参数,表示3秒无响应超时
retry 3 #表示最大重试次数
delay_before_retry 3 #表示重试间隔秒数
#connect_port 3306 #表示连接检测的端口为3306
}
}

real_server 192.168.1.203 3306 {#虚拟服务器对应的实际服务器、端口
weight 1 #配置服务节点的权值,权值数字越大,权值越高
TCP_CHECK
{
connect_timeout 3 #tcp检测参数,表示3秒无响应超时
retry 3 #最大重试次数
delay_before_retry 3 #重试间隔秒数
connect_port 3306 #健康检测的端口为3306
}
}
}

【3.5】启动、查看 Keepalived

systemctl daemon-reload #重新装载服务
systemctl start keepalived #启动服务
systemctl enable keepalived #设置服务开机自启
systemctl status keepalived #查看服务状态,有没有报错最快可以看这里
ps -ef|grep keepalived|grep -v "grep" #查看服务进程

【4】绑定LVS虚拟服务器(只在mysql服务器上202,203)

  192.168.1.210 到 lo:0(到mysql的读服务器,以便实现读负载均衡)

【4.1】设置lvs启停、查看脚本(在mysql服务器上执行)

该脚本中实现了将虚拟IP绑定在lo:0上,同事做了ARP抑制。

由于slave1和slave2上时LVS的两个realserver,所以需要运行 lvs_mysql_realserver

slave(备用master)也可以加入进来

vi /etc/rc.d/init.d/lvsmysql.sh

#!/bin/bash
#执行系统自带的函数
#sh /etc/rc.d/init.d/functions

VIP=$1
case "$2" in
start)
echo "Start LVS of Mysql Slave RealServer"
#ARP绑定
/sbin/ifconfig lo:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up
#添加直接路由到lo:0网口
/sbin/route add -host $VIP1 dev lo:0
#ARP抑制
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
#重启内核参数,重启生效
sysctl -p >/dev/null 2>&1
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP1 >/dev/null 2>&1
echo "Stop LVS of Mysql slave DirectoryServer"
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
;;
status)
isLoOn=`/sbin/ifconfig lo:0|grep "$VIP"`
isRoOn=`/bin/netstat -rn|grep $VIP`
if [[ "${isLoOn}" = "" && "${isRoOn}" = "" ]];then
echo "LVS-DR real server is stop."
else
echo "LVS-DR real server is running."
fi
exit 3
;;
*)
echo "Usage:$0 {start|stop|status}"
exit 1
esac
exit 0

【4.2】添加脚本执行权限,开启、关闭、查看状态

#给脚本加执行权限
chmod
+x /etc/rc.d/init.d/lvsmysql.sh
#启动、停止、查看状态 /etc/rc.d/init.d/lvsmysql.sh 192.168.1.210 start /etc/rc.d/init.d/lvsmysql.sh 192.168.1.210 stop /etc/rc.d/init.d/lvsmysql.sh 192.168.1.210 status

#把脚本添加到开机启动
echo "/etc/rc.d/init.d/lvsmysql.sh 192.168.1.210 start">>/etc/rc.d/rc.local

#解决TCP长连接问题,3个参数含义为 TCP超时,tcpfin超时,upd超时。LVS 默认TCPIP 15分钟超时,这里的设置为15秒。
echo "ipvsadm --set 15 5 15">>/etc/rc.d/rc.d/rc.local

【4.3】LVS模块的检测与读负载均衡测试

(1)查看进程

lsmod |grep "^ip_vs"

#RHEL6
modprobe -l |grep ipvs  
ipvsadm -L

(2)mysql读负载均衡测试

mysql -uroot -p123456 -h 192.168.1.210 -e "select @@hostname;"

   

 成功!

【4.4】LVS+Keepalived高可用测试

停掉200之后,立马就转移到201上去了。

  

 而且,客户端基本0感应

    

【5】LVS默认缺陷问题解决

【5.1】timeout长连接(LVS上面200,201)

ipvsadm -l --timeout

timeout(tcp  tcpin  udp):900 120 300    #单位为秒,TCP默认超时时间是15分钟,意思就是即使那台机器挂了也依然会往上面分发。这怎么办呢,见【5.1.3】

设置timeout:

ipvsadm --set 15 5 15       
#这里的单位为秒,第一个值设置为15秒TCP连接就实效,需要重新发起。tcpin 为5秒,udp为15秒。

如果这个值设置太小,你的client将会受到 connection reset by peer 此类错误的提示。

注意:以上 ipvsadm 的修改在重启后均会丢失,需要放入开机脚本中。

echo "ipvsadm --set 15 5 15" >> /etc/rc.d/rc.local

  

 比如,我这里把db2关掉了,然后它依然会访问db2。如上图会导致连接失败,知道LVS自动把挂掉的 db2机器给T出lvs

【5.1.2】persistence_timeout 会话保持

建议为0,不让机器在一段时间内访问的都是同一台机器,以达到负载均衡效果。

  如果在超时范围内,客户端有大量的访问(客户端检测connection 永远有 有效[ESTABLISHED]),其实还是负载在一台后端server上(意思就是变成了常连接,指定只访问这个有效连接的这台server)。所以LVS的策略看,我们设置的persistence_timeout 太小的话,并没有什么用,如果 timeout设置的太大,之后的倒计时,永远都是60秒;

注意persistence_timeout(这个事在keepalived里头的参数配置) 参数的值如果不为0,则会有会话保持效果(一段时间内访问都是同一台机器)。

【5.1.3】LVS机器如果挂掉了,分发还会继续向这台机器上分发,如何解决?

  LVS对后台 RealServer 无法实时进行检测,所以会出现链接数据库失败的,早起我们是写个脚本进行自动检测,然后自动把有故障的踢出 ipvsadm 的队列。现在我们是可以让LVS自动踢出。

  会根据keepalived 中的tcp_check参数,我们的超时时间是3秒,超时后再延迟3秒。

      我们最开始超时时间是3秒,第1次重试时间为6秒(会先延迟3秒 【delay_before_retry 3】 再进行连接重试又需要3秒 【connect_timeout 3】 ),同理第2/3次也是需要6秒,一共需要18秒。

TCP_CHECK
{
connect_timeout 3 #tcp检测参数,表示3秒无响应超时
retry 3 #最大重试次数
delay_before_retry 3 #重试间隔秒数
connect_port 3306 #健康检测的端口为3306

  当故障解决了,又再次加入到队列中,这样就不会出现分发错误、链接数据库失败的问题了。见【5.1.4】

【5.1.4】LVS比较新的版本可以自动解决realserver挂掉的问题

老版本:LVS监控 RealServer 状态,实现及时添加删除 RealServer 脚本(mysql上202,203)

#!bin/bash
#--------------------------------------
# Monitor RealServer on Direcrory
#--------------------------------------

User=root   #授权链接账号(Slave 上对 Directory主机授权)
Password=123456  #链接 Slave的密码
Behindtime=120 #定义主从延迟时间,如果超过这个时间,就把后端的RealServer删除
IPVS=/sbin/ipvsadm  
VIP=192.168.1.210     #VIP
VPORT=3306              #定义LVS的虚拟端口
RPORT=3306              #定义RealServer的端口
while [ 0 -lt 1 ];do       #写个死循环,让脚本后端执行
    for I in {202,203}   #遍历Realserver中的IP地址,这里就是我们的mysql地址
    Host1=192.168.1.$I
    del_realserver(){     #定义删除Realserver的函数
        ${IPVS} -d -t $VIP:$VPORT -r $Host1:$RPROT -g
   }    
    add_realserver{       #定义添加Realserver的函数
       ${IPVS} -a -t ${VIP}:$VPORT -R $Host1:$PORT -g
   }
   #判断IO线程存活
#判断SQL线程存活
#判断主从延迟
if #如果slave线程ok,且主从延迟小于我们定义的120秒,则 add_realserver
else if #如果slave线程ok,但主从延迟大于我们定义的120秒,则 del_realserver
else #这主从都有问题了,肯定 del_realserver
done
done

 新版本:现在VS会自动在连接超时后T出不可用的 realserver,(如果机器又立马启动了,则会立马加入VS)

我把202机器关闭,然后过了大概18-20秒后,就自动踢出了DB2(192.168.1.202)。

  

 为什么是18秒呢?我们由日志可以看出来,每6秒一次重连超时。

  

   我们最开始超时时间是3秒,第1次重试时间为6秒(会先延迟3秒 【delay_before_retry 3】 再进行连接重试又需要3秒 【connect_timeout 3】 ),同理第2/3次也是需要6秒,一共需要18秒。

TCP_CHECK
{
connect_timeout 3 #tcp检测参数,表示3秒无响应超时
retry 3 #最大重试次数
delay_before_retry 3 #重试间隔秒数
connect_port 3306 #健康检测的端口为3306

  我们尝试修改,注释掉重试间隔秒数,我们可以看到,超时重试时间变成了4秒,为什么呢?delay_loop 参数设置为 1了,就是要间隔1秒再去做 VS与realserver的健康检查。

  

但,我把参数 delay_loop 2 #运行情况检查,IP+端口是否可用,单位是秒。结果却变成了我想要的3秒。

  

  

【6】避免Keepalived意外死亡脚本(只能LVS单独服务器,不能放在mysql主上,200,201)

【6.1】监控keepalived进程意外死亡脚本

vi /etc/keepalived/keepcheck.sh

#------------------------------
#!/bin/bash

while [ 1 -eq 1 ];do
    keepalivedcheck=`ps -ef|grep keepalived|grep -v "grep"|grep -v "keepcheck.sh"|wc -l`
    if [ ${keepalivedcheck} -eq 0 ];then
        systemctl start keepalived
    else 
        echo "Keepalived is running"
    fi
    sleep 5
done


#--------------------------------
#运行
chmod +x /etc/keepalived/keepcheck.sh
nohup /etc/keepalived/keepcheck.sh &

#开机启动
echo "nohup /etc/keepalived/keepcheck.sh">> /etc/rc.d/rc.local

【6.2】为什么需要这个脚本?模拟keepalived进程意外崩溃

(1)模拟关掉非主线程

到底哪个是主线程?还用想吗,当然是进程ID最小的那个啦。就是最上面的那个

除了主进程外,任意一个进程死掉,都会立马重启,但IP地址可能就飘逸到另外一台机器上去了。

  

   

(2)模拟关掉keepalived主线程/同时杀死keepalived所有线程

(2.1)keepalived主线程挂掉

keepalived主线程挂掉,VIP当然会飘逸到另外一台机器上去。但这台机器的Keepalived就不会运行了,这样就失去了高可用了。

甚至有可能连VIP的地址都保留着,而另外的机器也有这个VIP,导致出大问题,比如脑裂,IP地址冲突等等。=>见(2.2)

为了避免上述2个情况,建议使用【6.1】脚本。

  

   

(2.2)同时杀死keepalived所有线程

甚至有可能连VIP的地址都保留着,而另外的机器也有这个VIP,导致出大问题,比如脑裂,IP地址冲突等等。(使用pkill没有这种问题,单独一个一个杀也没有问题,主要是这种 kill pid1 pid2 pid3 情况会发生)

  

    

 这样导致2个机器同时拥有这个IP,最终导致不可用。

    

     

 重启启动后,又可以了!

      

原文地址:https://www.cnblogs.com/gered/p/12592116.html