配置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 {
[email protected] //設置報警收件人郵箱
}
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=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的絕對路徑