1、什么是LVS
LVS是Linux Virtual Server的簡寫,以為Linux虛擬服務器,是一個虛擬服務器集群,其具有很好的可伸縮性、可靠性、可管理性。LVS集群采用IP負載均衡技術和基于內容請求分發技術。調度器具有很好的吞吐率,將請求均衡地轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集群的結構對客戶是透明的,而且無需修改客戶端和服務器端的程序。下圖是一個簡單的LVS拓撲
2、LVS集群的術語
VS:Virtual Server RS:Real Server CIP:Client IP VIP:Virtual Server IP RIP:Real Server IP DIP:Director IP
3、LVS集群的類型
lvs-nat:修改請求報文的目標IP
通過網絡地址轉換,調度器重寫請求報文的目標地址,根據預設的調度算法,將請求分派給后端的真實服務器;真實服務器的響應報文通過調度器時,報文的源地址被重寫,再返回給客戶,完成整個負載調度過程。 也就是多目標ip的DNAT機制,通過將請求報文中的目標地址和目標端口修改為某挑出的RS的RIP和PORT實現轉發;lvs-nat有以下特性: (1)RIP和DIP必須在同一個IP網絡,且應該使用私網地址;RS的網關要指向DIP; (2)請求報文和響應報文都必須應有Director轉發;Director易于成為系統瓶頸; (3)支持端口映射,可修改請求報文的目標PORT; (4)VS必須是Linux系統,RS可以是任意系統;
lvs-dr:操作封裝新的mac地址(直接路由)
VS/DR通過改寫請求報文的MAC地址,將請求發送到真實服務器,而真實服務器將響應直接返回給客戶。同VS/TUN技術一樣,VS/DR技術可極大地 提高集群系統的伸縮性。這種方法沒有IP隧道的開銷,對集群中的真實服務器也沒有必須支持IP隧道協議的要求,但是要求調度器與真實服務器都有一塊網卡連 在同一物理網段上。 Director和各RS都得配置使用VIP; (1)確保前段路由器將目標IP為VIP 的請求報文發往Director; (a)在前段網關做靜態綁定; (b)在RS上使用arptables; (c)在RS上修改內核參數以限制ARP通告及應答級別; arp_announce arp_ignore (2)RS的DIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一個IP網絡,RIP的網關不能指向DIP,以確保響應報文不會經由Director (3)RS跟Director要在同一個物理網絡 (4)請求報文要經由Director,但響應不能經由Director,而是由RS直接發往Client (5)不支持端口映射
lvs-tun:在原請求ip報文之外新加一個ip首部(IP隧道)
采用NAT技術時,由于請求和響應報文都必須經過調度器地址重寫,當客戶請求越來越多時,調度器的處理能力將成為瓶頸。為了解決這個問題,調度器把請求報 文通過IP隧道轉發至真實服務器,而真實服務器將響應直接返回給客戶,所以調度器只處理請求報文。由于一般網絡服務應答比請求報文大許多,采用 VS/TUN技術后,集群系統的最大吞吐量可以提高10倍。 (1)DIP , VIP , RIP都應該是公網ip (2)RS的網關不能,也不可能指向DIP; (3)請求報文要經由Director,但響應不能經由Director; (4)不支持端口映射; (5)RS的OS得支持隧道功能;
lvs-fullnat:修改請求報文的源IP和目標IP
通過同時修改請求報文的源ip地址和目標IP地址進行轉發; (1)VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網絡;因此,RIP的網關一般不指向DIP; (2)RS收到的請求報文源地址是DIP,因此,只需響應給DIP;但Director還要將其發往client; (3)請求和響應報文都經由Director; (4)支持端口映射;
4、ipvs調度方法
針對不同的網絡服務需求和服務器配置,調度器可以分為靜態調度和動態調度
(1)靜態調度:根據調度算法本身進行調度 RR:roundrobin,輪詢:調度器通過"輪詢"調度算法將外部請求按順序輪流分配到集群中的真實服務器上,它均等地對待每一臺服務器,而不管服務器上實際的連接數和系統負載。 WRR:weighted RR,加權輪詢:調度器通過"加權輪詢"調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器處理更多的訪問流量。調度器可以自動問詢真實服務器的負載情況,并動態地調整其權值。 SH:source hashing,源地址哈希:將來自與同一個ip地址的請求始終發往第一次挑中的RS,從實現會話綁定;保持會話 DH:destination hashing,目標地址哈希:將發往同一個目標地址 的請求始始終轉發至第一次挑中的RS; (2)動態調度:根據每臺RS當前的負載狀態及調度算法進行調度 LC : least connections 最小連接:調度器通過"最少連接"調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。如果集群系統的真實服務器具有相近的系統性能,采用"最小連接"調度算法可以較好地均衡負載。 WLC : weighted LC 加權最小連接 (默認的,值越大權重越大):在集群系統中的服務器性能差異較大的情況下,調度器采用"加權最少鏈接"調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載。調度器可以自動問詢真實服務器的負載情況,并動態地調整其權值。 SED:shortest expection delay 最短期望延遲 NQ : Never Queue LBLC : Locality-Based LC,動態的DH算法:"基于局部性的最少鏈接" 調度算法是針對目標IP地址的負載均衡,目前主要用于Cache集群系統。該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器 是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處于一半的工作負載,則用"最少鏈接"的原則選出一個可用的服務 器,將請求發送到該服務器。 LBLCR:LBLC with Replication,帶復制功能的LBLC:"帶復制的基于局部性最少鏈接"調度算法也是針對目標IP地址的負載均衡,目前主要用于Cache集群系統。它與LBLC算法的不同之處是它要維護從一個 目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。該算法根據請求的目標IP地址找出該目標IP地址對應的服務 器組,按"最小連接"原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器,若服務器超載;則按"最小連接"原則從這個集群中選出一 臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低復制的 程度。
5、ipvsadm命令使用
ipvsadm是Linux虛擬服務器的管理工具,系統默認沒有安裝,需要執行yum install ipvsadm命令進行安裝
(1)管理集群服務
增加:ipvsadm -A -t|u|f service-address [-s scheduler] -p [timeout] [root@localhost ~]# ipvsadm -A -t 10.1.0.5 -s rr 修改:ipvsadm -E -t|u|f service-address [-s scheduler] -p [timeout] 刪除: ipvsadm -d -t|u|f service-address -t:tcp協議端口,表示VIP是tcp端口 -u:udp協議端口,表示VIP是udp端口 -f:firewall mark,是一個數字
(2)管理集群上的RS
增加:ipvsadm -a -t|u|f service-address -r server-address [-g|i|m] [-w weight] 修改:ipvsadm e -t|u|f service-address -r server-address [-g|i|m] [-w weight] 刪除:ipvsadm -d -t|u|f service-address -r server-address -g:gateway,lvs-dr類型 -i:ipip,lvs-tun類型 -m:masquerade,lvs-nat類型
(3)清空定義的所有內容
ipvsadm -C
(4)查看定義的集群
ipvsadm -L | l [options] --numeric -n numeric output of addresses and ports --exact expand numbers (display exact values) --connection -c output of current IPVS connections --stats output of statistics information 統計數據 --rate output of rate information 速率
(5)保存和重載定義的集群
ipvsadm -S = ipvsadm-save ipvsadm -R = ipvsadm-restore
6、lvs-nat的拓撲及實現配置
(1)客戶端的配置
1)配置網卡
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno33554984 BOOTPROTO=none NAME=eno33554984 DEVICE=eno33554984 ONBOOT=yes IPADDR=10.1.249.114 NETMASK=255.255.0.0
2)測試
(2)director的配置(注意防火墻和selinux的影響)
1)配置網卡
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 BOOTPROTO=none NAME=eno33554984 DEVICE=eno33554984 ONBOOT=yes IPADDR=10.1.252.55 NETMASK=255.255.0.0 [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno33554984 DEVICE=eno33554984 HWADDR=00:0c:29:0e:27:d7 IPADDR=192.168.116.254 NETMASK=255.255.255.0 BOOTPROTO=none ONBOOT=yes
2)ipvs的配置
[root@localhost ~]# yum -y install ipvsadm [root@localhost ~]# ipvsadm -A -t 10.1.252.55:80 -s rr [root@localhost ~]# ipvsadm -a -t 10.1.252.55:80 -r 192.168.116.6 -m [root@localhost ~]# ipvsadm -a -t 10.1.252.55:80 -r 192.168.116.7 -m [root@localhost ~]# ipvsadm -l IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.1.252.55:http rr -> 192.168.116.6:http Masq 1 0 0 -> 192.168.116.7:http Masq 1 0 0
3)開啟轉發功能
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
(3)web server1的配置(centos 6)
[root@localhost ~]# date 兩臺服務器的時間需要同步 Sat Oct 29 10:08:36 CST 2016
1)配置網卡
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 網卡名和MAC地址每臺虛擬機都不同的,可使用 ip a 命令查看再設置 DEVICE=eth1 HWADDR=00:0c:29:9f:12:63 BOOTPROTO=none ONBOOT=yes IPADDR=192.168.116.6 NETMASK=255.255.255.0 GATEWAY=192.168.116.254
2)安裝httpd
[root@localhost ~]# yum -y install httpd [root@localhost ~]# vim /var/www/html/index.html <h1>real server c6</h1> 真實生產中通過同步機制使得兩臺服務器的內容一樣,此實驗故意以不同頁面區分 [root@localhost ~]# service httpd start [root@localhost ~]# curl 192.168.116.6 <h1>real server c6</h1>
(4)web server2的配置 (centos 7)
[root@localhost ~]# date Sat Oct 29 10:08:36 CST 2016
1)配置網卡
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno33554984 DEVICE=eno33554984 ONBOOT=yes BOOTPROTO=none IPADDR=192.168.116.7 NETMASK=255.255.255.0 GATEWAY=192.168.116.254 HWADDR=00:0c:29:e8:7c:c6
2)安裝httpd
[root@localhost ~]# yum -y install httpd [root@localhost ~]# vim /var/www/html/index.html <h1>real server c7</h1> [root@localhost ~]# systemctl start httpd [root@localhost ~]# curl 192.168.116.7 <h1>real server c7</h1>
7、lvs-dr的拓撲及實現配置
(1)客戶端配置
1)網卡配置
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno33554984 BOOTPROTO=none NAME=eno33554984 DEVICE=eno33554984 ONBOOT=yes IPADDR=192.168.116.114 NETMASK=255.255.255.0
2)測試
(2)director 的配置
1)網卡配置
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 DEVICE=eno16777736 HWADDR= 00:0c:29:0e:27:cd IPADDR=192.168.116.1 NETMASK=255.255.255.0 BOOTPROTO=none ONBOOT=yes 先重啟網絡服務再配置下面lo0網絡 [root@localhost ~]# ifconfig eno16777736:0 192.168.116.254 netmask 255.255.255.255 broadcast 192.168.116.254 up
2)ipvs的配置
[root@localhost ~]# yum -y install ipvsadm [root@localhost ~]# ipvsadm -A -t 192.168.116.254:80 -s wrr [root@localhost ~]# ipvsadm -a -t 192.168.116.254:80 -r 192.168.116.6 -g -w 1 [root@localhost ~]# ipvsadm -a -t 192.168.116.254:80 -r 192.168.116.7 -g -w 2
(3)web server1的配置
1)修改內核參數來限制arp響應和通告
先限制通告再設置ip [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
2)網卡配置
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 網卡名和MAC地址每臺虛擬機都不同的,可使用 ip a 命令查看再設置 DEVICE=eth1 HWADDR=00:0c:29:9f:12:63 BOOTPROTO=none ONBOOT=yes IPADDR=192.168.116.6 NETMASK=255.255.255.0 先重啟網絡服務再配置下面lo0網絡 [root@localhost ~]# ifconfig lo:0 192.168.116.254 netmask 255.255.255.255 broadcast 192.168.116.254 up [root@localhost ~]# route add -host 192.168.116.254 dev lo:0
3)安裝httpd
[root@localhost ~]# yum -y install httpd [root@localhost ~]# vim /var/www/html/index.html <h1>real server c6</h1> 真實生產中通過同步機制使得兩臺服務器的內容一樣,此實驗故意以不同頁面區分 [root@localhost ~]# service httpd start [root@localhost ~]# curl 192.168.116.6 <h1>real server c6</h1>
(4)web server2的配置
1)修改內核參數來限制arp響應和通告
先限制通告再設置ip [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
2)網卡配置
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno33554984 DEVICE=eno33554984 ONBOOT=yes BOOTPROTO=none IPADDR=192.168.116.7 NETMASK=255.255.255.0 HWADDR=00:0c:29:e8:7c:c6 先重啟網絡服務再配置下面lo0網絡 [root@localhost ~]# ifconfig lo:0 192.168.116.254 netmask 255.255.255.255 broadcast 192.168.116.254 up (臨時設置網卡,重啟網絡服務時效) [root@localhost ~]# route add -host 192.168.116.254 dev lo:0
3)安裝httpd
[root@localhost ~]# yum -y install httpd [root@localhost ~]# vim /var/www/html/index.html <h1>real server c7</h1> [root@localhost ~]# systemctl start httpd [root@localhost ~]# curl 192.168.116.7 <h1>real server c7</h1>
原創文章,作者:pao,如若轉載,請注明出處:http://www.www58058.com/55493
總結的很完整,圖文并茂,繼續加油