準備工作
環境:Win10下Centos6.4虛擬機器。
負載均衡:兩臺(一主一備) LVS + Keepalived。
HTTP伺服器:3臺。
給每臺伺服器配置IP
1、VIP(virtual ip):用來提供Virtual Server服務的ip地址。分別繫結在Director一個物理網路卡上(對外接收請求包)和RS的迴環裝置上(迴環裝置需要繫結兩個ip,一個是127.0.0.1,另一個就是vip)。
粗俗的講,負載均衡就是Linux虛擬伺服器,也就是再加一個虛擬機器,虛擬機器有一個IP,也就稱之為VIP;Linux虛擬機器本身自己也有一個IP,也就是本地IP,這兩個IP是同等地位。
2、DIP(director ip):與vip繫結在一個物理網路卡上,用來轉發請求包到RS的RIP對應的mac上,此裝置可以通過arp請求獲取RIP對應的mac地址。
3、RIP(real server ip):繫結在RS上的一個物理網路卡上,用來接收從Directory轉發過來的請求包。也就是真實伺服器的IP。
說一下我測試的每臺伺服器的IP:
LVS負載均衡主(192.168.132.244)、LVS負載均衡備(192.168.132.245)
HTTP1(192.168.132.251)、HTTP2(192.168.132.252)、HTTP3(192.168.132.242)
先給每臺HTTP伺服器關閉防火牆試著訪問,啟動httpd服務,然後給出一個明顯區分的標示。這裡把每臺伺服器的index.html頁面輸出當前IP。如下圖
在每臺臺(HTTP伺服器)真實伺服器網上上新增LO:0介面,並設定虛擬IP在此介面上
#cd /etc/init.d/
#vim realserver
SNS_VIP=192.168.132.200 #定義VIP變數192.168.132.200
. /etc/rc.d/init.d/functions #導指令碼庫
case "$1" in #case語句 $1傳遞給該shell指令碼的第一個引數
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP #設定Lo:0 VIP netmask 及廣播
/sbin/route add -host $SNS_VIP dev lo:0 #route del 增加本地路由
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
sysctl -p >/dev/null 2>&1 # -p <file(default /etc/sysctl.conf) 將標準資訊輸入裝置空檔案
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1 #route del 刪除本地路由
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}" #$0 是指令碼本身的名字
exit 1 #表示程式正常退出
esac #case結束
exit 0 #表示程式非正常退出
#chmod 750 realserver #給此指令碼賦予許可權
#chkconfig realserver on #設定開機自啟動此指令碼
#service realserver start #開啟此指令碼
RealServer Start OK #表示啟動成功!
#ifconfig #檢視一下是否真的成功新增了lo:0介面
OK,檢視一下三臺HTTP伺服器是否都正常,那麼繼續進行下一步
開始搭建負載均衡
LVS中提供了八種不同的排程演算法
詳情請參考:http://blog.csdn.net/u014649204/article/details/25115039
1:輪叫排程(Round-Robin Scheduling)
2: 加權輪叫排程(Weighted Round-Robin Scheduling)
3:最小連線排程(Least-Connection Scheduling)
4:加權最小連線排程(Weighted Least-Connection Scheduling)
5:基於區域性性的最少連結(Locality-Based Least Connections Scheduling)
6:帶複製的基於區域性性最少連結(Locality-Based Least Connections with Replication Scheduling)
7:目標地址雜湊排程(Destination Hashing Scheduling)
8:源地址雜湊排程(Source Hashing Scheduling)
9:最短預期延時排程(Shortest Expected Delay Scheduling)
10:不排隊排程(Never Queue Scheduling)
對應: rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq
LVS負載均衡主機:
先看一下CentOs核心,如果核心是2.6版本以後,那麼LVS虛擬機器已經存在於核心中。
說一下什麼是Keepalived?
keepalived的作用是檢測web伺服器的狀態,如果有一臺web伺服器當機或者工作出現故障,keepalived將會檢測到,並將有故障的web伺服器從系統中剔除,當web伺服器工作正常之後,keepalived自動將web伺服器加入到叢集中,這些工作都會自動完成
在這裡使用Yum安裝Keepalived
yum -y install keepalived
安裝完成之後,使用rpm -ql 命令,檢視一下Keepalived的安裝資訊
rpm -ql keepalived
根據提示資訊裡Keepalived的配置檔案路徑,覆蓋配置檔案,寫入以下命令。詳細說明在最後說明。
global_defs {
# notification_email {
# myemail@aliyun.com
# }
# notification_email_from myemail@aliyun.com
# smtp_server smtp.exmail.qq.com
# smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER #主
interface eth1 #在負載均衡主機上檢視一下ip,這裡是eth1。這裡要注意。
virtual_router_id 51
priority 100 #優先順序
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.132.200
}
}
virtual_server 192.168.132.200 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.132.251 80 { #第一臺HTTP
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.132.252 80 { #第二臺HTTP
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.132.242 80 { #第三臺HTTP
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
然後啟動Keepalived服務,有時候雖然提示啟動成功,但是未必,因為Keepalive並沒有對配置檔案的校驗功能,最好檢視一下日誌。
service keepalived start //啟動服務
tail -f /var/log/message //檢視日誌
啟動成功之後,瀏覽器訪問192.168.132.200觀察變化。
OK,分流成功。
然後我們試著關掉一臺HTTP伺服器,觀察訪問發現,其他兩臺仍然可以正常訪問,然後再啟動一下剛才關閉的伺服器,又恢復了之前。
LVS負載均衡備機:
global_defs {
# notification_email {
# myemail@aliyun.com
# }
# notification_email_from myemail@aliyun.com
# smtp_server smtp.exmail.qq.com
# smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP #備
interface eth1 #在負載均衡主機上檢視一下ip,這裡是eth1。這裡要注意。
virtual_router_id 51
priority 99 #優先順序,低於主機
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.132.200
}
}
virtual_server 192.168.132.200 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.132.251 80 { #第一臺HTTP
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.132.252 80 { #第二臺HTTP
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.132.242 80 { #第三臺HTTP
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
配置完成之後,然後試著關掉主機,繼續訪問192.168.132.200,一切正常,主機開機之後,主機繼續做大哥,備機繼續待命。
完畢!