六十三、LVS DR模式搭建、Keepalived+LVS DR
一、LVS DR模式搭建
準備工作:
三臺機器
只需要一個網卡,一個IP
分發器,也叫調度器(簡寫為dir)
93.130
rs1
93.131 網關改回93.2
rs2
93.132 網關改回93.2
vip
93.200
dir上編寫腳本 vim /usr/local/sbin/lvs_dr.sh //內容如下
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.93.200
rs1=192.168.93.131
rs2=192.168.93.132
#註意這裏的網卡名字
ifdown ens33
ifup ens33 //這裏ifdown再ifup,再執行這個腳本時,就不會重復設置這個IP了。
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up //綁定VIP的;ifconfig這個命令可以給一個網卡設置個虛擬網卡,虛擬網卡叫ens33:2
route add -host $vip dev ens33:2 //添加網關
$ipv -C
$ipv -A -t $vip:80 -s rr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
解析:
-C:清空規則
-g:DR模式
兩臺rs上也編寫腳本 vim /usr/local/sbin/lvs_rs.sh//內容如下
#/bin/bash
vip=192.168.93.200
ifdown lo
ifup lo
#下面這條是把vip綁定在lo上,是為了實現rs直接把結果返回給客戶端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作為更改arp內核參數,目的是為了讓rs順利發送mac地址給客戶端
#參考文檔www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
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
分別在dir上和兩個rs上執行這些腳本
route -n可以看到有個93.200
rs上ip add看一下lo是不是也綁定了這個93.200
dir上ip add看到ens33有個93.200
測試
用火狐瀏覽器訪問192.168.93.200,然後重復的ctrl+F5可以看到效果。一直在rs1和rs2上切換訪問著。
二、Keepalived+LVS DR
完整架構需要兩臺服務器(角色為dir)分別安裝keepalived軟件。
目的是實現高可用,但keepalived本身也有負載均衡的功能,所以本次實驗可以只安裝一臺keepalived。
keepalived內置了ipvsadm的功能,所以不需要再安裝ipvsadm包,也不用編寫和執行那個lvs_dir的腳本
LVS並不聰明,即使後端的rs宕機了,它還會把請求轉發過去,然後訪問的時候就會顯示無法連接。
Keepalived就是為了解決這個問題,當請求分發過來時,它可以檢測到後端的rs宕機了,就不再把請求分發給它了。
三臺機器分別為:
dir(安裝keepalived)93.130
rs1 93.131
rs2 93.132
vip 93.200
dir上編輯keepalived配置文件
# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
#備用服務器上為 BACKUP
state MASTER
#綁定vip的網卡為ens33,你的網卡和阿銘的可能不一樣,這裏需要你改一下
interface ens33
virtual_router_id 51
#備用服務器上為90
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux
}
virtual_ipaddress {
192.168.93.200
}
}
virtual_server 192.168.93.200 80 {
#(每隔10秒查詢realserver狀態,檢查rs是否正常,這裏控制頻率)
delay_loop 10
#(lvs 算法)
lb_algo wlc
#(DR模式,如果是NAT就寫NAT)
lb_kind DR
#(同一IP的連接60秒內被分配到同一臺realserver)
persistence_timeout 0
#(用TCP協議檢查realserver狀態)
protocol TCP
real_server 192.168.93.131 80 {
#(weight權重)
weight 100
TCP_CHECK {
#(10秒無響應超時)
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.93.132 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
# systemctl start keepalived
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.93.200:80 wlc
-> 192.168.93.131:80 Route 100 0 0
-> 192.168.93.132:80 Route 100 0 0
可以看到有兩條規則,如果沒有,在dir上把Keepalived停掉,再到rs上把nginx重啟一下,再回dir上啟動Keepalived就可以看到了,這裏如果看不到了,說明Keepalived把宕機的rs剔除了
需要更改裏面的ip信息
執行ipvsadm -C 把之前的ipvsadm規則清空掉
systemctl restart network 可以把之前的vip清空掉
兩臺rs上,依然要執行/usr/local/sbin/lvs_rs.sh腳本
keepalived有一個比較好的功能,可以在一臺rs宕機時,不再把請求轉發過去
測試
擴展
haproxy+keepalived http://blog.csdn.net/xrt95050/article/details/40926255
nginx、lvs、haproxy比較 http://www.csdn.net/article/2014-07-24/2820837
keepalived中自定義腳本 vrrp_script http://my.oschina.net/hncscwc/blog/158746
lvs dr模式只使用一個公網ip的實現方法 http://storysky.blog.51cto.com/628458/338726
六十三、LVS DR模式搭建、Keepalived+LVS DR