配置keepalived+LVS_DR
一、keepalived主备同时操作
1.检查防火墙和selinux的状态,最好都关了
2.安装软件
yum install -y keepalived ipvsadm
systemctl enable keepalived #设置开机自启动
ipvsadm -C #清空转发规则
3.keepalived+lvs_DR,keepalived的主机不需要开启路由转发的功能也可正常工作。
4.Keepalived实现LVS-DR模式调度器的高可用
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
admin@tarena.com.cn //设置报警收件人邮箱
}
notification_email_from ka@localhost //设置发件人
smtp_server 127.0.0.1 //定义邮件服务器
smtp_connect_timeout 30
router_id lvs1 //设置路由ID号(实验需要修改)
}
vrrp_instance VI_1 {
state MASTER //主服务器为MASTER,备用服务器为BACKUP
interface eth0 //定义网络接口
virtual_router_id 50 //主辅VRID号必须一致
priority 100 //服务器优先级,主备的优先级通常设置的不同
advert_int 1
authentication {
auth_type pass
auth_pass 1111 //主辅服务器密码必须一致
}
virtual_ipaddress { //配置VIP(按需修改)
192.168.4.15 //有的后面这里有更详细的写法
}
}
virtual_server 192.168.4.15 80 { //设置ipvsadm的VIP规则(按需修改)
delay_loop 6
lb_algo wrr //设置LVS调度算法为wrr,还有别的算法
lb_kind DR //设置LVS的模式为DR
#persistence_timeout 50
#注意这样的作用是保持连接,开启后,客户端在一定时间内始终访问相同服务器
protocol TCP
real_server 192.168.4.100 80 { //通常real_server的端口跟vip的端口一致,否则可能会报错
weight 1 //设置权重为1
TCP_CHECK { //对后台real_server做健康检查
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.4.200 80 { //设置后端web服务器真实IP(实验需要修改)
weight 2 //设置权重为2
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
5.开启服务
systemctl start keepalived
ipvsadm -Ln #查看LVS规则
ip a s #查看VIP设置
6.后续会用到的功能
6.1.更改keepalived的配置文件后,使配置生效的命令
kill -HUP $(cat /var/run/keepalived.pid)
6.2 systemctl stop keepalived.service干不掉keepalived服务,vip也不会漂移的原因
当我们stop掉keepalived服务的时候,发现VIP并没有漂移走,服务也没停掉
ps aux | grep keep 查看keepalived的进程还在
于是我们查看keepalived的service文件
vim /usr/lib/systemd/system/keepalived.service
KillMode=process的大致意思是当停止keepalived的时候只停掉主进程,而主进程产生的子进程是不会被干掉的,SSH服务就是这个模式。
killmode的默认值是control-group,意思时所有进程都会被干掉,我这里选择把这项注释掉,使用默认参数。
即:注释掉killMode这一行
#KillMode=process
改了service文件需要使用systemctl daemon-reload来重读配置
然后就可以正常使用了。
废了这么多话,其实可以使用systemctl kill keepalived来停掉服务。
6.4脑裂问题的解决(主备机器同时操作)
写一个while循环,每轮ping网关,累计连续失败的次数,当连续失败达到一定次数则运行service keepalived stop关闭keepalived服务。
如果发现又能够ping通网关,再重启keepalived服务。最后在脚本开头再加上脚本是否已经运行的判断逻辑,将该脚本加到crontab里面。
#修改周期性计划任务
crontab -e
#加入循环检测脑裂是否发生的脚本(备注:周期性计划任务服务器重启后依然有效)
*/3 * * * * /bin/bash 检测脚本的绝对路径
check_keep.sh脚本举例:
#!/bin/bash
#设置VIP(这里写错了,应该不是vip应该是网关的Ip地址,自行修改即可,后面ping的应该是网管ip)
VIP=192.168.122.1
#检测服务是否存在
keep_num=`ps aux | grep keepalive | grep -v grep | wc -l`
#服务存在时,如果ping不通网关就关闭keepalived服务
if [ ${keep_num} -ge 2 ]
then
ping_num=0
for i in {1..10}
do
ping $VIP -c 3 &>/dev/null
num=`echo $?`
let ping_num=ping_num+num
sleep 5
done
if [ ${ping_num} -ge 5 ]
then
#关闭keepalived服务
echo '服务已关闭'
fi
#服务不存在时,如果可以ping通网关就开启keepalived服务
else
ping_num=0
for i in {1..10}
do
ping $VIP -c 3 &>/dev/null
num=`echo $?`
let ping_num=ping_num+num
sleep 5
done
if [ ${ping_num} -eq 0 ]
then
#开启keepalived服务
echo '开启服务'
fi
fi
二.把VIP配置到lo:1(所有keepalived配置项里的real_server都操作)
如果某个real_server出故障了会自动从LVS中被去掉,好了会自动加上,全程无需人为处理。
1.检查防火墙和selinux的状态,最好都关了
2.加配置时(按实际修改,不需要创建lo:1的实际配置文件)
vim add_lo_1.sh #运行此脚本,lo:1会自动配置好
#!/bin/bash
VIP=192.168.1.5
echo 1 > net.ipv4.conf.all.arp_ignore
echo 1 > net.ipv4.conf.lo.arp_ignore
echo 2 > net.ipv4.conf.lo.arp_announce
echo 2> net.ipv4.conf.all.arp_announce
/sbin/ifconfig lo:1 $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev lo:1
ip a s 检查结果
3.删除lo:1的脚本
vim del_lo_1.sh
#!/bin/bash
echo 0 > net.ipv4.conf.all.arp_ignore
echo 0 > net.ipv4.conf.lo.arp_ignore
echo 0 > net.ipv4.conf.lo.arp_announce
echo 0 > net.ipv4.conf.all.arp_announce
/sbin/ifconfig lo:1 down
ip a s 检查结果
4.设置开机自动配置好lo:1
chmod +x add_lo_1.sh
在脚本/etc/rc.d/rc.local(和/etc/rc.local是同一个文件,软链)末尾添加add_lo_1.sh的绝对路径
5.实时检查lo:1,如果消失了自动给加上
ip_check_lo_1_up.sh
#!/bin/bash
VIP=192.168.1.5
check_num=`/usr/sbin/ip addr show | grep $VIP | grep -v grep | wc -l`
if [ $check_num -eq 0 ]
then
加上add_lo_1.sh的绝对路径
fi
设置成周期性计划任务
chmod +x ip_check_lo_1_up.sh
crontab -e
*/15 * * * * 写上 ip_check_lo_1_up.sh的绝对路径