lvs mysql 端口_(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源

(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/keepalivedcp /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_from2536473697@qq.com

smtp_server stmp.qq.com

smtp_connect_timeout30}

vrrp_script check_run

{#VRRP自定义脚本,check_run自定义名称

script"/etc/keepalived/mysql_check.sh"#调用的脚本文件URL

interval60#运行间隔,单位为秒

}

vrrp_sync_group VG1

{#vrrp同步组,VG1是自定义名称

group

{#组内成员

VI_1

}

}

vrrp_instance VI_1

{#vrrp虚拟实例

state BACKUP #备用

interface ens33 #针对监听的网络接口

virtual_router_id210#唯一路由ID,同一个虚拟组要一致

priority100#权限

advert_int5#广播频率,单位是秒,测试keepalived伙伴存活判定

nopreempt #非抢占模式

authentication

{#同一组keepalived的验证方式

auth_type PASS

auth_pass123456}

track_script

{#定义跟踪使用脚本

check_run #这里就是我们上面自己定义的脚本

}

virtual_ipaddress

{ #设置虚拟IP192.168.1.210/24}

}

virtual_server192.168.1.210 3306{#配置虚拟组中的服务,IP+端口,以空格分隔

delay_loop2 #运行情况检查,IP+端口是否可用,单位是秒

lb_algo rr #设置负载调度算法,这里设置rr,即轮询算法

lb_kind DR #设置LVS实现负载均衡机制,有NAT、TUN、DR(直接路由)三个模式可选

persistence_timeout0#会话保持单位时间,单位是秒。比如这里写50,则同一个IP连接在50秒内会被分配到同一台真实服务器

protocol TCP #指定转发协议类型,有TCP和UDP两种

#虚拟服务组中的实际转发的主机信息

real_server192.168.1.202 3306{#虚拟服务器对应的实际服务器、端口

weight1#配置服务节点的权值,权值数字越大,权值越高

TCP_CHECK

{

connect_timeout3#tcp检测参数,表示3秒无响应超时

retry3#表示最大重试次数

delay_before_retry3#表示重试间隔秒数

#connect_port3306#表示连接检测的端口为3306

}

}

real_server192.168.1.203 3306{#虚拟服务器对应的实际服务器、端口

weight1#配置服务节点的权值,权值数字越大,权值越高

TCP_CHECK

{

connect_timeout3#tcp检测参数,表示3秒无响应超时

nb_get_retry3#最大重试次数

delay_before_retry3#重试间隔秒数

connect_port3306#健康检测的端口为3306

}

}

}

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

########## master 192.168.1.200global_defs

{#全局定义

router_id LVS-HA #全局Keepaliveed ID表示,同一个集群需要相同

notification_email

{2536473697@qq.com

}

notification_email_from2536473697@qq.com

smtp_server stmp.qq.com

smtp_connect_timeout30}

vrrp_script check_run

{#VRRP自定义脚本,check_run自定义名称

script"/etc/keepalived/mysql_check.sh"#调用的脚本文件URL

interval60#运行间隔,单位为秒

}

vrrp_sync_group VG1

{#vrrp同步组,VG1是自定义名称

group

{#组内成员

VI_1

}

}

vrrp_instance VI_1

{#vrrp虚拟实例

state BACKUP #备用

interface ens34 #针对监听的网络接口

virtual_router_id210#唯一路由ID,同一个虚拟组要一致

priority100#权限

advert_int5#广播频率,单位是秒,测试keepalived伙伴存活判定

nopreempt #非抢占模式

authentication

{#同一组keepalived的验证方式

auth_type PASS

auth_pass123456}

track_script

{#定义跟踪使用脚本

check_run #这里就是我们上面自己定义的脚本

}

virtual_ipaddress

{ #设置虚拟IP192.168.1.210/24}

}

virtual_server192.168.1.210 3306{#配置虚拟组中的服务,IP+端口,以空格分隔

delay_loop2 #运行情况检查,IP+端口是否可用,单位是秒

lb_algo rr #设置负载调度算法,这里设置rr,即轮询算法

lb_kind DR #设置LVS实现负载均衡机制,有NAT、TUN、DR(直接路由)三个模式可选

persistence_timeout0#会话保持单位时间,单位是秒。比如这里写50,则同一个IP连接在50秒内会被分配到同一台真实服务器

protocol TCP #指定转发协议类型,有TCP和UDP两种

#虚拟服务组中的实际转发的主机信息

real_server192.168.1.202 3306{#虚拟服务器对应的实际服务器、端口

weight1#配置服务节点的权值,权值数字越大,权值越高

TCP_CHECK

{

connect_timeout3#tcp检测参数,表示3秒无响应超时

retry3#表示最大重试次数

delay_before_retry3#表示重试间隔秒数

#connect_port3306#表示连接检测的端口为3306

}

}

real_server192.168.1.203 3306{#虚拟服务器对应的实际服务器、端口

weight1#配置服务节点的权值,权值数字越大,权值越高

TCP_CHECK

{

connect_timeout3#tcp检测参数,表示3秒无响应超时

retry3#最大重试次数

delay_before_retry3#重试间隔秒数

connect_port3306#健康检测的端口为3306

}

}

}

########## slave192.168.1.201global_defs

{#全局定义

router_id LVS-HA #全局Keepaliveed ID表示,同一个集群需要相同

notification_email

{2536473697@qq.com

}

notification_email_from2536473697@qq.com

smtp_server stmp.qq.com

smtp_connect_timeout30}

vrrp_script check_run

{#VRRP自定义脚本,check_run自定义名称

script"/etc/keepalived/mysql_check.sh"#调用的脚本文件URL

interval60#运行间隔,单位为秒

}

vrrp_sync_group VG1

{#vrrp同步组,VG1是自定义名称

group

{#组内成员

VI_1

}

}

vrrp_instance VI_1

{#vrrp虚拟实例

state BACKUP #备用

interface ens34 #针对监听的网络接口

virtual_router_id210#唯一路由ID,同一个虚拟组要一致

priority 90#权限

advert_int5#广播频率,单位是秒,测试keepalived伙伴存活判定

nopreempt #非抢占模式

authentication

{#同一组keepalived的验证方式

auth_type PASS

auth_pass123456}

track_script

{#定义跟踪使用脚本

check_run #这里就是我们上面自己定义的脚本

}

virtual_ipaddress

{ #设置虚拟IP192.168.1.210/24}

}

virtual_server192.168.1.210 3306{#配置虚拟组中的服务,IP+端口,以空格分隔

delay_loop2 #运行情况检查,IP+端口是否可用,单位是秒

lb_algo rr #设置负载调度算法,这里设置rr,即轮询算法

lb_kind DR #设置LVS实现负载均衡机制,有NAT、TUN、DR(直接路由)三个模式可选

persistence_timeout0#会话保持单位时间,单位是秒。比如这里写50,则同一个IP连接在50秒内会被分配到同一台真实服务器

protocol TCP #指定转发协议类型,有TCP和UDP两种

#虚拟服务组中的实际转发的主机信息

real_server192.168.1.202 3306{#虚拟服务器对应的实际服务器、端口

weight1#配置服务节点的权值,权值数字越大,权值越高

TCP_CHECK

{

connect_timeout3#tcp检测参数,表示3秒无响应超时

retry3#表示最大重试次数

delay_before_retry3#表示重试间隔秒数

#connect_port3306#表示连接检测的端口为3306

}

}

real_server192.168.1.203 3306{#虚拟服务器对应的实际服务器、端口

weight1#配置服务节点的权值,权值数字越大,权值越高

TCP_CHECK

{

connect_timeout3#tcp检测参数,表示3秒无响应超时

retry3#最大重试次数

delay_before_retry3#重试间隔秒数

connect_port3306#健康检测的端口为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_announcesysctl -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.210start/etc/rc.d/init.d/lvsmysql.sh 192.168.1.210stop/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"#RHEL6modprobe -l |grepipvs

ipvsadm-L

(2)mysql读负载均衡测试

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

82a55db18d498fbb31f1b16edddb7712.png

成功!

【4.4】LVS+Keepalived高可用测试

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

1694cfd69f1602f54196e9b4d7090ab3.png

而且,客户端基本0感应

228b5682df9ca3839e68ba835e753546.png

【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

244c5fb1f1604504c8fbfddc8256ab70.png

比如,我这里把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_timeout3#tcp检测参数,表示3秒无响应超时

retry3#最大重试次数

delay_before_retry3#重试间隔秒数

connect_port3306 #健康检测的端口为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)。

728b79a0bb8b2bbacce06bd58d95dddc.png

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

8ab436b57a75ec6a6093ae216343d8b5.png

我们最开始超时时间是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的健康检查。

1096ceb7515b938fdb96303b51f3176f.png

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

a60d407e487d736467300780fb424138.png

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

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

vi /etc/keepalived/keepcheck.sh#------------------------------#!/bin/bashwhile [ 1 -eq 1 ];dokeepalivedcheck=`ps -ef|grep keepalived|grep -v "grep"|grep -v "keepcheck.sh"|wc -l`if [ ${keepalivedcheck} -eq 0 ];thensystemctl start keepalivedelse

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地址可能就飘逸到另外一台机器上去了。

ce553018817fb4fddcccee0786f054d9.png

6e923ec698190652fa39aa6522032ffd.png

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

(2.1)keepalived主线程挂掉

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

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

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

5ea607370325050957e28b602415f214.png

c0cc8a52a438da15c58d31fa1dcf9dcd.png

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

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

5d5eabd1f417acd7d7f1f257b3e576f5.png

5d05b0c3cf4993dad56db488e752a25a.png

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

0390ee1bd3916eeb8db9803e7780fb2a.png

635e51bf3f734086783d686550fc4226.png

重启启动后,又可以了!

bae6103656e426009b34607f4bb9e07a.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值