1. 程式人生 > >LVS+Keepalived實現高可用負載均衡

LVS+Keepalived實現高可用負載均衡

lvs+keepalived 高可用 負載均衡

用LVS+Keepalived實現高可用負載均衡,簡單來說就是由LVS提供負載均衡,keepalived通過對rs進行健康檢查、對主備機(director)進行故障自動切換,實現高可用。

1. LVS NAT模式配置
準備三臺服務器,一臺director, 兩臺real server
dr1: 外網ip 192.168.75.130,內網ip 10.1.1.10

兩臺real server
rs1: 內網ip 10.1.1.11
rs2: 內網ip 10.1.1.12

兩臺real server的內網網關設置為dr1的內網ip 10.1.1.10

兩個real server上都安裝apache或者nginx(詳細安裝方法請參考之前的LAMP環境搭建)

dr1上安裝ipvsadm

yum install -y ipvsadm
vi /usr/local/sbin/lvs_nat.sh
增加
#! /bin/bash
# director 服務器上開啟路由轉發功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
# 關閉icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects

# director 設置nat防火墻
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j MASQUERADE
# director設置ipvsadm
IPVSADM=‘/sbin/ipvsadm‘
$IPVSADM -C
$IPVSADM -A -t 192.168.75.130:80 -s wrr
$IPVSADM -a -t 192.168.75.130:80 -r 10.1.1.11:80 -m -w 1
$IPVSADM -a -t 192.168.75.130:80 -r 10.1.1.12:80 -m -w 1


運行腳本
/bin/bash /usr/local/sbin/lvs_nat.sh


通過瀏覽器測試兩臺機器上的web內容,為了區分開,我們可以把apache的默認頁修改一下:
rs1上: echo "<html><body><h1>This is web1!</h1></body></html>" > /usr/local/apache2/htdocs/index.html
rs2上: echo "<html><body><h1>This is web2!</h1></body></html>" > /usr/local/apache2/htdocs/index.html


找一臺電腦測試:

[[email protected] ~]# curl 192.168.75.130
<html><body><h1>This is web1!</h1></body></html>
[[email protected] ~]# curl 192.168.75.130
<html><body><h1>This is web2!</h1></body></html>
[[email protected] ~]# curl 192.168.75.130
<html><body><h1>This is web1!</h1></body></html>
[[email protected] ~]# curl 192.168.75.130
<html><body><h1>This is web2!</h1></body></html>


在dr1上查看當前連接情況

[[email protected] ~]# 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.75.130:80 wrr
-> 10.1.1.11:80 Masq 1 0 2
-> 10.1.1.12:80 Masq 1 0 2


2. LVS DR模式配置
準備三臺服務器:
dr1

eth0 192.168.75.130

vip eth0:0: 192.168.75.100
rs1

eth0 rip: 192.168.75.131

vip lo:0: 192.168.75.100

rs2

eth0 rip: 192.168.75.132

vip lo:0: 192.168.75.100


在dr1上操作
vi /usr/local/sbin/lvs_dr.sh
增加

#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/sbin/ipvsadm
vip=192.168.75.100
rs1=192.168.75.131
rs2=192.168.31.132
ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev eth0:0
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1


兩臺rs上:

vi /usr/local/sbin/lvs_dr_rs.sh

增加
#! /bin/bash
vip=192.168.75.100
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
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


然後dr1上執行

bash /usr/local/sbin/lvs_dr.sh

兩臺rs上執行

bash /usr/local/sbin/lvs_dr_rs.sh


找一臺電腦測試:

[[email protected] ~]# curl 192.168.75.100
<html><body><h1>This is web2!</h1></body></html>
[[email protected] ~]# curl 192.168.75.100
<html><body><h1>This is web1!</h1></body></html>
[[email protected] ~]# curl 192.168.75.100
<html><body><h1>This is web2!</h1></body></html>
[[email protected] ~]# curl 192.168.75.100
<html><body><h1>This is web1!</h1></body></html>


在dr1上查看當前連接情況

[[email protected] ~]# 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.75.100:80 wrr
-> 192.168.75.131:80 Route 1 0 2
-> 192.168.75.132:80 Route 1 0 2


3. LVS主要的調度算法

1:輪詢算法(RR)就是按依次循環的方式將請求調度到不同的服務器上,該算法最大的特點就是實現簡單。輪詢算法假設所有的服務器處理請求的能力都是一樣的,調度器會將所有的請求平均分配給每個真實服務器。


2:加權輪詢算法(WRR)主要是對輪詢算法的一種優化與補充,LVS會考慮每臺服務器的性能,並給每臺服務器添加一個權值,如果服務器A的權值為1,服務器B的權值為2,則調度到服務器B的請求會是服務器A的兩倍。權值越高的服務器,處理的請求越多。


3:最小連接調度算法(LC)將把請求調度到連續數量最小的服務器上。


4:加權最小連接算法(WLC)則是給每臺服務器一個權值,調度器會盡可能保持服務器連接數量與權值之間的平衡。


5:基於局部性的最少連接調度算法(lblc)是請求數據包的目標IP地址的一種調度算法,該算法先根據請求的目標IP地址尋找最近的該目標IP地址所有使用的服務器,如果這臺服務器依然可用,並且用能力處理該請求,調度器會盡量選擇相同的服務器,否則會繼續選擇其他可行的服務器。


6:帶復雜的基於局部性最少的連接算法(lblcr)激勵的不是一個目標IP與一臺服務器之間的連接記錄,他會維護一個目標IP到一組服務器之間的映射關系,防止單點服務器負責過高。


7:目標地址散列調度算法(DH)也是根據目標IP地址通過散列函數將目標IP與服務器建立映射關系,出現服務器不可用或負載過高的情況下,發往該目標IP的請求會固定發給該服務器。


8:源地址散列調度算法(SH)與目標地址散列調度算法類似,但它是根據源地址散列算法進行靜態分配固定的服務器資源。


4. LVS + keepalived實現高可用負載均衡(DR模式)

前面lvs已經成功實現了負載均衡,如果某臺real server發生故障該怎麽辦呢?

這時就用到了keepalived,它可以對後端服務器進行健康檢查,保證了後端服務器的高可用;同時,keepalived還使用了VRRP協議保證了主備機(Director)之間的高可用。


下面我們就開始配置LVS+keepalived

在剛才“LVS DR模式配置”的基礎上增加一臺備用director(dr2)


清除之前的配置,在dr1上執行

ipvsadm -C
ifconfig eth0:0down

yum install -y keepalived
安裝好後,編輯配置文件
vi /etc/keepalived/keepalived.conf
清空原文,加入如下內容:
vrrp_instance VI_1 {
state MASTER #備用服務器上為 BACKUP
interface eth0
virtual_router_id 51
priority 100 #備用服務器上為90
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.75.100
}
}
virtual_server 192.168.75.100 80 {
delay_loop 6 #(每隔10秒查詢realserver狀態)
lb_algo wlc #(lvs 算法)
lb_kind DR #(Direct Route)
persistence_timeout 60 #(同一IP的連接60秒內被分配到同一臺realserver)
protocol TCP #(用TCP協議檢查realserver狀態)

real_server 192.168.75.131 80 {
weight 100 #(權重)
TCP_CHECK {
connect_timeout 10 #(10秒無響應超時)
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.75.132 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}


在dr2上執行
yum install -y keepalived
yum install -y ipvsadm

把dr1上的配置文拷貝過來

scp 192.168.75.130:/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf


vi /etc/keepalived/keepalived.conf

從director的配置文件只需要修改

state MASTER -> state BACKUP
priority 100 -> priority 90


配置完keepalived後,需要開啟端口轉發(主從都要做):
echo 1 > /proc/sys/net/ipv4/ip_forward

然後,兩個rs上執行 /usr/local/sbin/lvs_dr_rs.sh 腳本
最後,分別在兩個director上啟動keepalived服務,先主後從
/etc/init.d/keepalived start


註:啟動keepalived服務會自動生成vip和ipvsadm規則,不需要再去執行上面提到的/usr/local/sbin/lvs_dr.sh 腳本。


測試

找一臺電腦用crul測試:

[[email protected] ~]# curl 192.168.75.100
<html><body><h1>This is web2!</h1></body></html>
[[email protected] ~]# curl 192.168.75.100
<html><body><h1>This is web1!</h1></body></html>
[[email protected] ~]# curl 192.168.75.100
<html><body><h1>This is web2!</h1></body></html>
[[email protected] ~]# curl 192.168.75.100
<html><body><h1>This is web1!</h1></body></html>


模擬主director出現故障:

把主director上的keepalived服務停掉

[[email protected] ~]# /etc/init.d/keepalived stop
停止 keepalived: [確定]

在從director上查看日誌

[[email protected] ~]# tail -f /var/log/messages

May 18 12:10:56 dr2 Keepalived_vrrp[1641]: VRRP_Instance(VI_1) Transition to MASTER STATE
May 18 12:10:57 dr2 Keepalived_vrrp[1641]: VRRP_Instance(VI_1) Entering MASTER STATE
May 18 12:10:57 dr2 Keepalived_vrrp[1641]: VRRP_Instance(VI_1) setting protocol VIPs.
May 18 12:10:57 dr2 Keepalived_vrrp[1641]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.75.100
May 18 12:10:57 dr2 Keepalived_healthcheckers[1640]: Netlink reflector reports IP 192.168.75.100 added
May 18 12:11:02 dr2 Keepalived_vrrp[1641]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.75.100

已經成功切換到從節點上


模擬real server出現故障:

把rs2上的httpd服務停掉

[[email protected] ~]# /etc/init.d/httpd stop


找一臺電腦用crul測試

[[email protected] ~]# curl 192.168.75.100
<html><body><h1>This is web1!</h1></body></html>
[[email protected] ~]# curl 192.168.75.100
<html><body><h1>This is web1!</h1></body></html>
[[email protected] ~]# curl 192.168.75.100
<html><body><h1>This is web1!</h1></body></html>
[[email protected] ~]# curl 192.168.75.100
<html><body><h1>This is web1!</h1></body></html>
只有rs1可以訪問到,rs2已被移除


LVS+Keepalived實現高可用負載均衡