一、介紹
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。
【1】技術簡介
LVS集羣採用IP負載均衡技術和基於內容請求分發技術。調度器具有很好的吞吐率,將請求均衡地轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集羣的結構對客戶是透明的,而且無需修改客戶端和服務器端的程序。爲此,在設計時需要考慮系統的透明性、可伸縮性、高可用性和易管理性。
一般來說,LVS集羣採用三層結構,其主要組成部分爲:
A、負載調度器(load balancer),它是整個集羣對外面的前端機,負責將客戶的請求發送到一組服務器上執行,而客戶認爲服務是來自一個IP地址(我們可稱之爲虛擬IP地址)上的。
B、服務器池(server pool),是一組真正執行客戶請求的服務器,執行的服務有WEB、MAIL、FTP和DNS等。
C、共享存儲(shared storage),它爲服務器池提供一個共享的存儲區,這樣很容易使得服務器池擁有相同的內容,提供相同的服務。
【3】調度器
調度器是服務器集羣系統的唯一入口點(Single Entry Point),它可以採用IP負載均衡技術、基於內容請求分發技術或者兩者相結合。
在IP負載均衡技術中,需要服務器池擁有相同的內容提供相同的服務。當客戶請求到達時,調度器只根據服務器負載情況和設定的調度算法從服務器池中選出一個服務器,將該請求轉發到選出的服務器,並記錄這個調度;當這個請求的其他報文到達,也會被轉發到前面選出的服務器。在基於內容請求分發技術中,服務器可以提供不同的服務,當客戶請求到達時,調度器可根據請求的內容選擇服務器執行請求。因爲所有的操作都是在Linux操作系統核心空間中將完成的,它的調度開銷很小,所以它具有很高的吞吐率。服務器池的結點數目是可變的。當整個系統收到的負載超過目前所有結點的處理能力時,可以在服務器池中增加服務器來滿足不斷增長的請求負載。
對大多數網絡服務來說,請求間不存在很強的相關性,請求可以在不同的結點上並行執行,所以整個系統的性能基本上可以隨着服務器池的結點數目增加而線性增長。 共享存儲通常是數據庫、網絡文件系統或者分佈式文件系統。服務器結點需要動態更新的數據一般存儲在數據庫系統中,同時數據庫會保證併發訪問時數據的一致性。靜態的數據可以存儲在網絡文件系統(如NFS/CIFS)中,但網絡文件系統的伸縮能力有限,一般來說,NFS/CIFS服務器只能支持3~6個繁忙的服務器結點。對於規模較大的集羣系統,可以考慮用分佈式文件系統,如AFS、GFS、Coda和Intermezzo等。分佈式文件系統可爲各服務器提供共享的存儲區,它們訪問分佈式文件系統就像訪問本地文件系統一樣,同時分佈式文件系統可提供良好的伸縮性和可用性。
【4】分佈式鎖管理器
此外,當不同服務器上的應用程序同時讀寫訪問分佈式文件系統上同一資源時,應用程序的訪問衝突需要消解才能使得資源處於一致狀態。這需要一個分佈式鎖管理器(Distributed Lock Manager),它可能是分佈式文件系統內部提供的,也可能是外部的。開發者在寫應用程序時,可以使用分佈式鎖管理器來保證應用程序在不同結點上併發訪問的一致性。
負載調度器、服務器池和共享存儲系統通過高速網絡相連接,如100Mbps交換網絡、Myrinet和Gigabit網絡等。使用高速的網絡,主要爲避免當系統規模擴大時互聯網絡成爲整個系統的瓶頸。
【5】監視器
Graphic Monitor是爲系統管理員提供整個集羣系統的監視器,它可以監視系統的狀態。Graphic Monitor是基於瀏覽器的,所以無論管理員在本地還是異地都可以監測系統的狀況。爲了安全的原因,瀏覽器要通過HTTPS(Secure HTTP)協議和身份認證後,才能進行系統監測,並進行系統的配置和管理。
LVS 的IP地址類型
1.VIP:虛擬IP地址,並不提供服務,而是將用戶的請求轉發到後方
2 RIP:真正IP地址,客戶端真正提供服務的IP地址
3.DIP:調度IP地址,通常是和RIP相連的LVS的IP地址
4.CIP:客戶端IP地址,用戶請求時,用戶的IP
=============================分 割 線=============================
LVS集羣的類型:
1.LVS-NAT DNAT
2.LVS-DR 直接路由
3.LVS-TUN 隧道
下面我們詳細說明這三種類型:
LVS-NAT模型原理
用戶的請求和響應都需要經過Director
源地址,目標地址都需要經過轉換,而目標地址轉換是透明的
這種架構的擴展有限調度器,Director將處理所有的請求,壓力比較大,擴展到10個結點就不行了
要求:
1.集羣節點必須在同一個物理網絡中,同一個子網或者VLAN
2.DIP和RIP只能在同一個網絡(子網)中,不能跨越網段
3.RIP地址通常是私有地址
4.所有的RIP,必須以DIP爲網關(地址轉換)
5.NAT的地址可以做端口轉換(比如80--8080)
6.任何操作系統都可以做RIP
7.Director有可能成爲整個系統的瓶頸
數據傳輸:
通過二層(數據鏈路層)轉發(ARP)將DR的MAC地址轉換成RIP的MAC地址(不是轉變,而是轉發),這樣就實現了數據的傳輸,在RSS響應後,再將RSS的MAC地址轉換成RIP的MAC地址。
===============================分 割 線==============================
LVS-DR模型原理
用戶的請求必須經過Director,而realserver在響應的使用直接返回請求(圖有問題,有可能設的網關不同,還存在一臺路由器)
需要配置iptables規則,拒絕響應MAC地址轉換,或者通過修改LINUX內核響應
優點:由於它比NAT少了一個地址轉換,響應速度更快
特點
1.必須處於同一個物理網絡中(連在同一個交換機上)
2.RIP可以使用公網地址(建議使用)
3.Director只轉發請求,而realserver直接響應請求而不轉發
4.集羣節點的網關,不能指向DIP
5.不能做端口轉換(不支持)
6.絕大多數的操作系統都可以實現realserver,而realserver需要同一個網卡配置多個Ip地址
7.DR模式的Director比NAT模式能夠帶動更多的節點
數據傳輸:
解決數據進入:
爲了避免RS直接響應,給服務器的lo:0設置VIP地址,給本地網卡設置成CIP,這樣RS就不會直接響應了,隱藏了RS
解決數據出去:
而默認情況下,Linux設置數據包從哪塊網卡出去,源地址設爲該網卡地址,通過添加一條特殊路由信息,如果目標地址是lo的VIP地址,那麼出去的時候源地址設置爲lo的地址。
路由信息的原理:
添加一條主機路由,將VIP的地址自己設置成一個網段,既子網掩碼爲255.255.255.255,這樣VIP出去的時候沒有比VIP更優的了,就成爲最佳IP
在互聯網上性能最佳的就是DR應用,但是有一個缺點,必須要求主機間距離比較近(比如一個機房),如果發生天災人禍,集羣就完了,所以我們爲了實現異地分佈,要採用隧道比如***
==============================分 割 線============================
LVS-TUN模型原理:
虛擬隧道實現:
1.專線(加密)
2.二層:在MAC之外再加一層MAC
3.三層:源IP目標IP之外再加一層IP
隧道目的: 隱藏意圖,通過轉換來(ip套ip)隱藏目的
特徵:
1.集羣節點和Director不必在同一個網絡
2.RIP必須使用公網地址
3.Director只需要處理進來的請求,不需要處理出去的請求
4.響應的請求一定不能經過Direcor.
5.Directory不支持端口映射
6.只能使用那些支持IP 隧道協議的操作系統做realserver
優點:LVS-TUN可以實現基於網絡的集羣,這樣就脫離了LVS-DR的realserver之間的距離限制。
lvs scheduling methods調度算法有10種
靜態調度4個輪叫RR
加權輪叫WRR 目標地址hash DH 源地地址hash SH
動態調度6個
最少鏈接(Least Connections) 加權最少鏈接(Weighted Least Connections)WLC linux默認的調度 shortest expected delay SED never queue NQ
基於本地的最少鏈接(Locality-Based Least Connections:DH)LBLC
帶複製的基於本地最少鏈接(Locality-Based Least Connections with Replication)LBLCR
這裏只介紹前兩個模型的案例
lvs需要內核有ipvs支持,linux-2.4.23以後ipvs都編譯到內核裏,如果你是之前版本確保你的內核支持ipvs後,只需安裝ipvsadm就可以把一臺服務器配置成負載調度器(Load Balancer)。
案例一
LVS-NAT
拓撲圖
配置步驟如下
把羣集節點的網關指向192.168.2.1
這裏採用Linux系統當作Director
首先打開路由轉發功能並使之生效
[root@localhost ~]# vim /etc/sysctl.conf
7 net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p
這裏需要配置yum
[root@localhost ~]# mkdir /mnt/cdrom
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/
[root@localhost ~]# vim /etc/yum.repos.d/rhel-debuginfo.repo
[rhel-server]
2 name=Red Hat Enterprise Linux server
3 baseurl=file:///mnt/cdrom/Server
4 enabled=1
5 gpgcheck=1
6 gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release
7 [rhel-cluster]
8 name=Red Hat Enterprise Linux cluster
9 baseurl=file:///mnt/cdrom/Cluster
10 enabled=1
11 gpgcheck=1
12 gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release
13 [rhel-vt]
14 name=Red Hat Enterprise Linux vt
15 baseurl=file:///mnt/cdrom/VT
16 enabled=1
17 gpgcheck=1
18 gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release
19 [rhel-clusterstorage]
20 name=Red Hat Enterprise Linux clusterstorage
21 baseurl=file:///mnt/cdrom/ClusterStorage
22 enabled=1
23 gpgcheck=1
24 gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release
安裝ipvsadm
[root@localhost ~]# yum install ipvsadm –y
添加規則
訪問192.168.145.100的80端口時採用rr調度算法,並且發送給Web服務器羣集節點
[root@localhost ~]# ipvsadm -A -t 192.168.145.100:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.145.100:80 -r 192.168.2.100 –m //-m表示模型爲nat
[root@localhost ~]# ipvsadm -a -t 192.168.145.100:80 -r 192.168.2.200 -m
[root@localhost ~]# service ipvsadm save //保存規則
[root@localhost ~]# service ipvsadm start //啓動服務
web 服務器配置
Web1
#mount /dev/cdrom /mnt/cdrom
#yum install httpd –y
#cd /var/www/html/
#echo "web1” >>index.html
#service httpd start
web2
#mount /dev/cdrom /mnt/cdrom
#yum install httpd –y
#cd /var/www/html/
#echo "web1” >>index.html
#service httpd start
測試
刷新網頁後
查看規則
[root@localhost ~]# 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.145.100:80 rr
-> 192.168.2.100:80 Masq 1 0 2
-> 192.168.2.200:80 Masq 1 0 2
案例二
LVS-DR
拓撲圖
配置如下:
Web1
[root@localhost ~]# echo "net.ipv4.conf.all.arp_ignore = 1" >>/etc/sysctl.conf
[root@localhost ~]# echo "net.ipv4.conf.all.arp_announce = 2" >>/etc/sysctl.conf
[root@localhost ~]# sysctl –p
添加一塊新的設備,這裏取名lo:0 ip地址爲192.168.145.101子網掩碼設爲255.255.255.255
[root@localhost ~]# service network restart
[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:F1:15:00
inet addr:192.168.145.200 Bcast:192.168.145.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fef1:1500/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:653 errors:0 dropped:0 overruns:0 frame:0
TX packets:639 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:82646 (80.7 KiB) TX bytes:125870 (122.9 KiB)
Interrupt:67 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:55 errors:0 dropped:0 overruns:0 frame:0
TX packets:55 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5785 (5.6 KiB) TX bytes:5785 (5.6 KiB)
lo:0 Link encap:Local Loopback
inet addr:192.168.145.101 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
[root@localhost ~]# route add -host 192.168.145.101 dev lo:0
[root@localhost ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.145.101 0.0.0.0 255.255.255.255 UH 0 0 0 lo
192.168.145.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
#mount /dev/cdrom /mnt/cdrom
#yum install httpd –y
#cd /var/www/html/
#echo "web1” >>index.html
#service httpd start
web2
這裏採用ssh的安全傳輸,把web1的配置文件拷貝到web2上,就不用我們修改原來的文件了
前提是我們知道對方的帳號密碼
[root@localhost ~]# scp 192.168.145.200:/etc/sysctl.conf /etc/
The authenticity of host '192.168.145.200 (192.168.145.200)' can't be established.
RSA key fingerprint is 5f:53:c0:d3:9e:b3:9e:96:80:d3:7d:51:f3:37:67:e8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.145.200' (RSA) to the list of known hosts.
[email protected]'s password:
sysctl.conf 100% 1062 1.0KB/s
[root@localhost ~]# sysctl –p
添加一塊新的設備,這裏取名lo:0 ip地址爲192.168.145.101子網掩碼設爲255.255.255.255
[root@localhost ~]# service network restart
[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:C5:99:C3
inet addr:192.168.145.201 Bcast:192.168.145.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fec5:99c3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:685 errors:0 dropped:0 overruns:0 frame:0
TX packets:534 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:104160 (101.7 KiB) TX bytes:104382 (101.9 KiB)
Interrupt:67 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:70 errors:0 dropped:0 overruns:0 frame:0
TX packets:70 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:7793 (7.6 KiB) TX bytes:7793 (7.6 KiB)
lo:0 Link encap:Local Loopback
inet addr:192.168.145.101 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
[root@localhost ~]# route add -host 192.168.145.101 dev lo:0
[root@localhost ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.145.101 0.0.0.0 255.255.255.255 UH 0 0 0 lo
192.168.145.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
#mount /dev/cdrom /mnt/cdrom
#yum install httpd –y
#cd /var/www/html/
#echo "web2” >>index.html
#service httpd start
Director
這裏需要配置yum
[root@localhost ~]# mkdir /mnt/cdrom
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/
[root@localhost ~]# vim /etc/yum.repos.d/rhel-debuginfo.repo
[rhel-server]
2 name=Red Hat Enterprise Linux server
3 baseurl=file:///mnt/cdrom/Server
4 enabled=1
5 gpgcheck=1
6 gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release
7 [rhel-cluster]
8 name=Red Hat Enterprise Linux cluster
9 baseurl=file:///mnt/cdrom/Cluster
10 enabled=1
11 gpgcheck=1
12 gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release
13 [rhel-vt]
14 name=Red Hat Enterprise Linux vt
15 baseurl=file:///mnt/cdrom/VT
16 enabled=1
17 gpgcheck=1
18 gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release
19 [rhel-clusterstorage]
20 name=Red Hat Enterprise Linux clusterstorage
21 baseurl=file:///mnt/cdrom/ClusterStorage
22 enabled=1
23 gpgcheck=1
24 gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release
安裝ipvsadm
[root@localhost ~]# yum install ipvsadm –y
添加規則
訪問192.168.145.101的80端口時採用rr調度算法,並且發送給Web服務器羣集節點
[root@localhost ~]# ipvsadm -A -t 192.168.145.101:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.145.101:80 -r 192.168.145.200 –g //-g表示模型爲DR
[root@localhost ~]# ipvsadm -a -t 192.168.145.101:80 -r 192.168.145.201 -g
[root@localhost ~]# service ipvsadm save //保存規則
[root@localhost ~]# service ipvsadm start //啓動服務
添加一個設備,這裏命名爲eth0:0 ,ip地址設爲192.168.145.101 子網掩碼設爲255.255.255.0
[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:1B:E2:73
inet addr:192.168.145.100 Bcast:192.168.145.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe1b:e273/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3125 errors:0 dropped:0 overruns:0 frame:0
TX packets:4238 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:240611 (234.9 KiB) TX bytes:785373 (766.9 KiB)
Interrupt:67 Base address:0x2000
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:1B:E2:73
inet addr:192.168.145.101 Bcast:192.168.145.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:67 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:1881 errors:0 dropped:0 overruns:0 frame:0
TX packets:1881 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2956328 (2.8 MiB) TX bytes:2956328 (2.8 MiB)
測試
刷新網頁