LVS負載均衡簡單配置
LVS的安裝與使用
第1章 LVS原理及介紹
1.1 LVS簡介
LVS是Linux Virtual Server的簡寫,意思就是Linux虛擬服務器,是一個虛擬的服務器集群系統,可以在UNIX/LINUX平臺下實現負載均衡集群功能。該項目在1998年5月由章文嵩博士組織成立,是中國國內最早出現的自由軟件項目之一。
LVS項目介紹:
LVS項目主頁:http://www.linuxvirtualserver.org/
LVS項目介紹:http://www.linuxvirtualserver.org/zh/lvs1.html
LVS集群的體系結構:http://www.linuxvirtualserver.org/zh/lvs2.html
LVS集群中的IP負載均衡技術:http://www.linuxvirtualserver.org/zh/lvs3.html
LVS集群的負載調度:http://www.linuxvirtualserver.org/zh/lvs4.html
LVS負載均衡調度技術是在Linux內核中實現的,因此,被稱之為Linux虛擬服務器(Linux Virtual Server)。我們使用該軟件配置LVS時候,不能直接配置內核中的ipvs,而需要使用ipvs的管理工具ipvsadm進行管理。
q LVS技術點小結:
1、真正實現調度的工具是IPVS,工作在Linux內核層面。
2、LVS自帶的IPVS命令行管理工具是ipvsadm。
3、keepalived實現管理IPVS及負載均衡器的高可用。
4、Red hat工具Piranha WEB管理實現調度的工具IPVS。
1.2 簡單術語介紹
術語簡寫 | 術語含義 |
CIP | 客戶端的IP地址,client ip |
DIP | 負載均衡器對應的實際IP地址 |
VIP | 需在均衡器提供服務的地址 |
RIP | 提供服務的節點地址 |
LB | 負載均衡服務器 |
RS | 節點服務器,Real Server |
1.3 DR模式介紹(Direct Routing)
1、通過在調度器LB上修改數據包的目的MAC地址實現轉發,註意,源IP地址任然是CIP,目的地址任然是VIP。
2、請求報文經過調度器,而RS響應處理後的報文無需經過調度器LB,因此,並發訪問量大時使用效率很高(和
3、因DR模式是通過MAC地址的改寫機制實現的轉發,因此,所有的RS節點和調度器LB只能在一個局域網LAN中(小缺點)。
4、需要註意RS節點的VIP的綁定(lo:vip/32,lo1:vip/32)和ARP抑制問題。
5、強調下:RS節點的默認網關不需要是調度器LB的DIP,而是直接IDC機房分配的上級路由器的IP(這是RS帶有外網IP地址的情況),理論講:只要RS可以出網即可,不是必須要配置外網IP。
6、由於DR模式的調度器僅進行了目的的MAC地址的改寫,因此,調度器LB無法改變請求報文的目的端口(和NAT要區別)。
7、當前,調度器LB支持幾乎所有的UNIX,LINUX系統,但目前不支持WINDOWS系統。真實服務器RS節點可以是WINDOWS系統。
8、總的來說DR模式效率很高,但是配置也比較麻煩,因此,訪問量不是特別大的情況下可以用haproxy或者nginx取代。這符合運維的原則:簡單、易用、高效。日1000-2000W PV或並發1萬以下都可以考慮使用haproxy/nginx(LVS NAT模式)。
9、直接對外的訪問業務,例如:web服務做RS節點,RS最好用公網IP地址。如果不直接對外的業務,例如:MySQL,存儲系統RS節點,最好只用內部IP地址。
註:直接路由,最大的特點是不更改源IP和目標IP,改變的是MAC地址
1.4 LVS集群算法
算法 | 說明 |
rr | 輪循調度(Round-Robin),它將請求依次分配不同的RS節點,也就是在RS節點中均攤請求。這種算法很簡單,但是只適合於RS節點處理性能相差不大的情況。 |
wrr | 加權輪循調度(Weighted Round-Robin),它將依據不同的RS節點的權值分配任務。權值較高的RS將優先獲得任務,並且分配到的連接數將比權值較低的RS節點更多。相同權值的RS得到相同數目的連接數。 |
wlc | 加權最小連接數調度(Weighted Least-Connection)假設各臺RS的權值依次為Wi(I=1..n),當前的TCP連接次數依次為Ti(I=1..n),依次選取Ti/Wi為最小的RS作為下一個分配的RS。 |
dh | 目的地址哈希調度,以目的地址為關鍵字查找一個靜態hash表來獲得需要的RS。 |
sh | 源地址哈希調度,以源地址為關鍵字查找一個靜態hash表來獲得需要的RS。 |
第2章 LVS的安裝與配置
2.1 服務規劃
2.1.1 服務器規劃表
LVS服務器 | 2臺 | 負載轉發四層TCP請求 |
HTTP服務器 | 2臺 | 負載提供HTTP服務 |
說明:總共需要4臺服務器完成本次項目 |
2.1.2 主機IP規劃表
服務器說明 | IP地址 | 主機名稱規則 |
LVS服務器 | 10.0.0.18/24 | lb01 |
LVS服務器 | 10.0.0.19/24 | lb02 |
Nginx服務器 | 10.0.0.16/24 | nginx |
Apache服務器 | 10.0.0.17/24 | apache |
10.0.0.21/24 | 虛擬IP地址 |
2.1.3 主機名解析
172.16.1.16 nginx
172.16.1.17 apache
172.16.1.18 lb01
172.16.1.19 lb02
2.2 安裝環境
q 操作系統版本
[root@server ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@server ~]# uname -r 2.6.32-431.el6.x86_64 [root@server ~]# uname -m x86_64
q LVS軟件版本
[root@lb02 ~]# rpm -qa ipvsadm ipvsadm-1.26-4.el6.x86_64
2.3 軟件安裝
2.3.1 安裝LVS服務
LVS可以通過yum命令安裝,或者通過源碼編譯的方式安裝,在此選擇yum安裝。分別在兩臺LVS服務器安裝LVS服務,安裝過程如下:
q 查看是否已安裝inotify
[root@lb02 ~]# rpm -qa ipvsadm [root@lb02 ~]#
#<==這裏如果沒有任何返回值就表明沒有安裝
q 使用yum命令安裝軟件
[root@nginx ~]# yum -y install ipvsadm Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile *****自動安裝過程略**** Installed: ipvsadm.x86_64 0:1.26-4.el6 Complete! #<==安裝完成 [root@lb01 ~]# ln -s /usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux #<==創立軟鏈接 [root@lb01 ~]# ll /usr/src/linux
註:如果沒有/usr/src/kernels/2.6.32-431.el6.x86_64路徑,可能是因為缺少kernel-devel-2.6.18-164.el5軟件包,可以通過命令yum -y install kernerl-devel 安裝。
q 檢測是否安裝完畢
[root@lb02 ~]# rpm -qa ipvsadm ipvsadm-1.26-4.el6.x86_64
q 查看內核是否有ip_vs服務運行
[root@lb01 ~]# lsmod | grep ip_vs ip_vs 125220 0 libcrc32c 1246 1 ip_vs ipv6 317340 285 ip_vs
註:如果沒有以上三個輸出,可以使用命令ipvsadm或者modprobe ip_vs重新加載。
2.3.2 安裝其他服務
1)在nginx服務器安裝nginx服務,能正常提供訪問;
2)在apache服務器安裝apache服務,能正常提供訪問;
3)在lb01和lb02安裝keepalived服務。
[root@lb02 ~]# curl nginx www [root@lb02 ~]# curl apache apache.www
第3章 配置LVS集群
3.1 手動配置LVS服務
3.1.1 服務端配置
為LVS服務器添加一個虛擬IP地址:
ip addr add 10.0.0.21/24 dev eth0 label eth0:0
清空以前的舊配置:
ipvsadm --help #<==查看ipvsadm的配置參數 ipvsadm -C #<==清空所有配置
添加一個虛擬vserver:
ipvsadm -A -t 10.0.0.21:80 -s wrr
參數說明:
-A:--add-service,表示添加一個虛擬服務器
-t:--tcp-service,指定這是一個tcp的虛擬服務器
-u:--udp-service,指定這是一個udp的虛擬服務器
10.0.0.21:80:表示提供服務的ip地址以及端口號
-s:--scheduler,指定調度器,“rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq”選擇一種,默認是wlc
為服務器添加real server:
ipvsadm -a -t 10.0.0.21:80 -r 10.0.0.16:80 -g -w 1 ipvsadm -a -t 10.0.0.21:80 -r 10.0.0.17:80 -g -w 1
3.1.2 節點端配置
需要添加到LVS負載均衡器的節點都需做如下配置:
q 綁定VIP
在網卡lo綁定虛擬IP,該虛擬IP同LVS服務器的虛擬IP,即10.0.0.21/24
ip addr add 10.0.0.21/32 dev lo label lo:0 route add -host 10.0.0.21 dev lo
q 設置ARP抑制
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
q 抑制參數說明
arp_ignore:定義目標地址為本地IP的ARP詢問不同的應答模式 | |
0 | 默認值,回應任何網絡接口上對任何本地IP地址的arp查詢請求 |
1 | 只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求 |
2 | 只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求,且來訪IP必須在該網絡接口的子網段內。 |
3 | 不回應該網絡界面的arp請求,而只對設置的唯一和連接地址做出回應。 |
4-7 | 保留未使用。 |
8 | 不回應所有(本地地址)的arp查詢 |
arp_announce:對網絡接口上,本地IP地址發出的,ARP回應,作出相應級別的限制。確定不同程序的限制,宣布對來自本地源IP地址發出的ARP請求接口。 | |
0 | 默認值,在任意網絡接口(eth0,eth1,lo)上任何本地地址。 |
1 | 盡量避免不在該網絡子網段的地址作出arp回應。當發起ARP請求的源IP地址是被設置應該經由路由達到此網絡接口的時候很有用,此時會檢查來訪IP是否為所有接口上的子網段內IP之一。如果該來訪者IP不屬於各個網絡接口上的子網段內,那麽將采用級別2的方式來進行處理。 |
2 | 對查詢目標使用最適當的本地地址,在此模式下忽略這個IP數據包的源地址並嘗試選擇能與該地址通信的本地地址,首要是選擇所有網絡接口的子網中外出訪問子網中包目標IP地址的本地地址。如果沒有合適的地址被發現,將選擇當前的發送網絡接口或其他的有可能接受到該ARP回應的網絡接口來進行發送,限制了使用本地VIP地址作為優先的網絡接口 |
3.1.3 結果服務驗證
訪問10.0.0.21:80,查看結果是否輪循。
[root@lb02 ~]# curl 10.0.0.21:80 apache.www [root@lb02 ~]# curl 10.0.0.21:80 www [root@lb02 ~]# curl 10.0.0.21:80 apache.www [root@lb02 ~]# curl 10.0.0.21:80 www
3.2 keepalived配置LVS服務
除了手動配置LVS服務器之外,使用keepalived管理LVS是一種更好的選擇。keepalived默認就集成了管理LVS的功能,其配置LVS虛擬服務器內容如下:
############################### # LVS的配置部分 # ############################### virtual_server 10.0.0.21 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 #persistence_timeout 50 protocol TCP real_server 10.0.0.16 80 { weight 1 TCP_CHECK { connect_timeout 5 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 10.0.0.17 80 { weight 1 TCP_CHECK { connect_timeout 5 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
LVS負載均衡簡單配置