Interesting things
我們之前的Keepalived+LVS單主模式,是只有一臺(tái)lvs工作,這會(huì)造成資源浪費(fèi),可以采用雙主結(jié)構(gòu),讓兩臺(tái)lvs都進(jìn)行工作,采用dns輪詢方式,當(dāng)用戶訪問域名通過dns輪詢每天lvs,雙主結(jié)構(gòu)需要2個(gè)vip,這2個(gè)vip需要綁定域名。
同樣,在每臺(tái)lvs上安裝keepalived軟件,當(dāng)keepalived檢測(cè)到其中一個(gè)lvs宕機(jī)則將宕機(jī)的vip漂移到活動(dòng)lvs上,當(dāng)lvs恢復(fù)則vip又重新漂移回來。
附上我畫的拓?fù)鋱D
初始狀態(tài)
其中一個(gè)主機(jī)宕機(jī)
主機(jī)恢復(fù)
image.png
所需環(huán)境
vip1 192.168.12.101
vip2 192.168.12.102
lvs_master1 192.168.12.12
lvs_master2 192.168.12.13
nginx1 192.168.12.2
nginx2 192.168.12.3
tomcat1 192.168.12.6
tomcat2 192.168.12.7
What did you do today
雙主模式相比主從環(huán)境,區(qū)別在于:
1.DNS輪詢。
2.LVS負(fù)載均衡層需要2個(gè)vip。比如192.168.12.12和192.168.12.13
3.后端的realServer上要綁定這2個(gè)vip到lo本地回環(huán)設(shè)備上
4.keepalived.conf的配置相比于上面的主從模式有所不同。
- 在192.168.12.2和192.168.12.3機(jī)器要綁定2個(gè)vip到本地回環(huán)口lo上(分別綁定lo:0和lo:1),所以需要在/etc/init.d/下編寫double_master_lvsdr0和double_master_lvsdr1腳本,具體如下:
#!/bin/sh
VIP=192.168.12.101
. /etc/rc.d/init.d/functions
case "$1" in
start)
/sbin/ifconfig lo down
/sbin/ifconfig lo up
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
/sbin/sysctl -p >/dev/null 2>&1
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
echo "LVS-DR real server starts successfully.\n"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP >/dev/null 2>&1
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
echo "LVS-DR real server stopped.\n"
;;
status)
isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`
isRoOn=`/bin/netstat -rn | grep "$VIP"`
if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
echo "LVS-DR real server has run yet."
else
echo "LVS-DR real server is running."
fi
exit 3
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
#!/bin/sh
VIP=192.168.12.102
. /etc/rc.d/init.d/functions
case "$1" in
start)
/sbin/ifconfig lo down
/sbin/ifconfig lo up
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
/sbin/sysctl -p >/dev/null 2>&1
/sbin/ifconfig lo:1 $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:1
echo "LVS-DR real server starts successfully.\n"
;;
stop)
/sbin/ifconfig lo:1 down
/sbin/route del $VIP >/dev/null 2>&1
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
echo "LVS-DR real server stopped.\n"
;;
status)
isLoOn=`/sbin/ifconfig lo:1 | grep "$VIP"`
isRoOn=`/bin/netstat -rn | grep "$VIP"`
if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
echo "LVS-DR real server has run yet."
else
echo "LVS-DR real server is running."
fi
exit 3
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
- 將double_master_lvsdr0和double_master_lvsdr1設(shè)置開機(jī)啟動(dòng)
[root@localhost init.d]# chmod +x double_master_lvsdr0
[root@localhost init.d]# chmod +x double_master_lvsdr1
[root@localhost init.d]# echo "/etc/init.d/double_master_lvsdr0" >> /etc/rc.d/rc.local
[root@localhost init.d]# echo "/etc/init.d/double_master_lvsdr1" >> /etc/rc.d/rc.local
image.png
-
啟動(dòng)double_master_lvsdr0和double_master_lvsdr1腳本
image.png -
查看192.168.12.2和192.168.12.3,發(fā)現(xiàn)vip已經(jīng)成功綁定到本地回環(huán)口lo上了。
 在lvs_master1和lvs_master2打開ip_forward路由轉(zhuǎn)發(fā)功能
[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
- lvs_master1上的keepalived.conf配置如下:
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
}
vrrp_script check_lvs {
script "/etc/keepalived/lvs_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_lvs
}
virtual_ipaddress {
192.168.12.101
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_lvs
}
virtual_ipaddress {
192.168.12.102
}
}
virtual_server 192.168.12.101 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
#nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.12.2 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.12.3 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
virtual_server 192.168.12.102 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
#nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.12.2 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.12.3 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
- lvs_master2中的keepalived配置如下:
! Configuration File for keepalived
global_defs {
router_id LVS_BACKUP
}
vrrp_script check_lvs {
script "/etc/keepalived/lvs_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_lvs
}
virtual_ipaddress {
192.168.12.101
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_lvs
}
virtual_ipaddress {
192.168.12.102
}
}
virtual_server 192.168.12.101 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
#nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.12.2 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.12.3 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
virtual_server 192.168.12.102 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
#nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.12.2 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.12.3 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
- 編寫lvs_check.sh腳本。
a=`ipvsadm -ln`
str="Route"
bb=`echo $aa|grep $str|wc -l`
if [ $bb = 0 ];then
sleep 3
aa=`ipvsadm -ln`
bb=`echo $aa|grep $str|wc -l`
if [ $bb = 0 ];then
killall keepalived
fi
fi
啟動(dòng)192.168.12.2和192.16812.3的nginx、double_master_lvsdr0、double_master_lvsdr1服務(wù)。啟動(dòng)192.168.12.6和192.168.12.7的tomcat。
-
我們查看lvs_master1的eth0節(jié)點(diǎn)信息,發(fā)現(xiàn)綁定了vip1(192.168.12.101)
image.png -
查看lvs_master2的eth0節(jié)點(diǎn)信息,發(fā)現(xiàn)綁定了vip2(192.168.12.102)
image.png -
查看lvs_master1的lvs以及realserver的信息。
image.png -
查看lvs_master2的lvs以及realserver的信息
image.png -
修改hosts文件(C:\Windows\System32\drivers\etc\hosts),指定cmaxiaoma.mayday.com對(duì)應(yīng)的2個(gè)vip。(在hosts里這樣設(shè)置,達(dá)不到負(fù)載均衡,只會(huì)優(yōu)先訪問192.168.12.101)
image.png -
訪問cmazxiaoma.mayday.com
image.png -
我們停止掉lvs_master1.
image.png -
當(dāng)我們又恢復(fù)lvs_master1.vip1又回到了lvs_master1手里,而lvs_master2又失去了vip1。
image.png
image.png
-
在lvs_master2的eth0以及l(fā)vs、RealServer信息。
image.png
image.png
Summary
今天加班就到這里了,回去要照顧女朋友了!