LVS:Linux Virtual Server,負載調度器,集成內核
官網:http://www.linuxvirtualserver.org/
工作原理:VS根據請求報文的目標IP和目標協議及端口將其調度轉發至某RS,根據調度 算法來挑選RS
CIP:Client IP ?? (客戶端的IP)
VIP: Virtual serve IP VS外網的IP ?(調度器連接外網的地址)
DIP: Director IP VS內網的IP ? (調度器連接內網的地址)
RIP: Real server IP (真實服務器的IP)
訪問流程:CIP <–> VIP == DIP <–> RIP
lvs集群的類型
lvs-nat:修改請求報文的目標IP ,多目標IP的DNAT
lvs-dr:操縱封裝新的MAC地址
lvs-tun:在原請求IP報文之外新加一個IP首部
lvs-fullnat:修改請求報文的源和目標IP
lvs-nat模式
本質是多目標IP的DNAT,通過將請求報文中的目標地址和目標端口修改為某挑 出的RS的RIP和PORT實現轉發
(1)RIP和DIP應在同一個IP網絡,且應使用私網地址;RS的網關要指向DIP
(2)請求報文和響應報文都必須經由LVS服務器轉發,LVS服務器易于成為系統瓶頸 (后端多臺服務器都要經過LVS服務器來實現轉發)
(3)支持端口映射,可修改請求報文的目標PORT
(4)VS必須是Linux系統,RS可以是任意OS系統
NAT模式IP包調度過程 :
客戶端訪問的VIP地址應該是某一網絡服務的地址例如:www.baidu.com 通過他們公司的調度器將VIP地址調度到baidu后臺的真實提供服務的服務器主機的IP地址。(后臺提供服務的主機由多臺組成,各個IP地址是不相同的)
文字描述:由客戶端發起請求連接某一個網絡服務請求到——–>VIP地址:經過 LVS服務器的調度將VIP地址轉換成真實提供服務的服務器主機IP地址——>RIP上去;RIP接收到請求后將響應數據包發送到LVS上的VIP地址上去;最后客戶端訪問的VIP地址給與回應數據包。
LVS-DR模式
LVS-DR:Direct Routing,直接路由,LVS默認模式,應用最廣泛,通過為請求報文重新 封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出 的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變
(1) LVS服務器和RS都配置有VIP
(2) 確保前端路由器將目標IP為VIP的請求報文發往LVS服務器:有以下三種方法。
A .? 可以在前端網關做靜態綁定VIP和LVS服務器的MAC地址 ?
B? .在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle –mangle-ip-s $RIP ?
(此種方法存在弊端:當LVS服務器宕機時,啟用備用的LVS服務器時還需要將綁定的MAC地址修改到備用的LVS服務器上去)
C? . 或者采用另一種方法在RS上修改內核參數以限制arp的廣播和通告級別(讓其不搭理也不回應別人的廣播)
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
(3)RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網絡; RIP的網關不能指向DIP,以確保響應報文不會經由Director
(4)RS和LVS服務器要在同一個物理網絡
(5)請求報文要經由LVS服務器,但響應報文不經由LVS服務器,而由RS直接發往 Client
(6)不支持端口映射(端口不能修?。?/p>
(7)RS可使用大多數OS系統
DR模式的調度過程:
文字描述過程:當客戶端發起請求—–TCP/IP的三次握手———>? 到達VIP的LVS服務器——>然后LVS服務器給調度到RS的服務器上去;然后回應就不經過LVS服務器上的VIP地址來回應了,因為每個RS服務器上都有一個VIP的地址,所以RS服務器就直接回應數據包到客戶端了。此過程不替換源和目標的IP地址,而是通過修改MAC地址來實現轉發調度的。
具體的MAC地址的轉換: CIP ? MACCIP—->VIP MACROUTE1;CIP MACROUTE2—->VIP MACLVS;
此時到達LVS服務器了;經過LVS服務器的調度將原有的方向裝換成:CIP MACLVS—–>VIP? MACRS1
然后開始回應報文:VIP MACRS1—->CIP ROUTE2;變成VIP MACROUTE1—–>CIP MACCIP
ipvs scheduler? (調度算法)
兩種:靜態方法和動態方法
靜態方法:僅根據算法本身進行調度
1、RR:roundrobin,輪詢 (后臺的服務器輪流調度)
2、WRR:Weighted RR,加權輪詢? (后臺的服務器加比重輪流調度;如性能好的服務器占比重大)
3、SH:Source Hashing,實現session sticky,源IP地址hash;將來自于同一 個IP地址的請求始終發往第一次挑中的RS,從而實現會話綁定
4、DH:Destination Hashing;目標地址哈希,將發往同一個目標地址的請求 始終轉發至第一次挑中的RS,典型使用場景是正向代理緩存場景中的負載均衡, 如:寬帶運營商
動態方法:主要根據每RS當前的負載狀態及調度算法進行調度Overhead=value 較小的RS將被調度
1、LC:least connections 適用于長連接應用 Overhead=activeconns*256+inactiveconns
(activeconns:活動的連接數 ?? inactiveconns :不活動的連接數,就是用tcp/ip連接上去不做任何操作)
(用上述公式計算處現在后臺那個服務器的負載小就自動調度到負載最小的那臺服務器上去)
2、WLC:Weighted LC,默認調度方法 Overhead=(activeconns*256+inactiveconns)/weight
(在上一條的基礎上加上權重值;可以更好的發揮各臺服務器的性能)
3、SED:Shortest Expection Delay,初始連接高權重優先 Overhead=(activeconns+1)*256/weight
(在第一次連接時權重高的先連接,以后的連接按照WLC的方式來調度他的連接)
4、NQ:Never Queue,第一輪均勻分配,后續SED
5、LBLC:Locality-Based LC,動態的DH算法,使用場景:根據負載狀態實現 正向代理
6、LBLCR:LBLC with Replication,帶復制功能的LBLC 解決LBLC負載不均衡問題,從負載重的復制到負載輕的RS
ipvsadm包構成 (實現LVS的包應用)
程序包:ipvsadm
Unit File: ipvsadm.service ?
主程序:/usr/sbin/ipvsadm ?
規則保存工具:/usr/sbin/ipvsadm-save ?
規則重載工具:/usr/sbin/ipvsadm-restore ?
配置文件:/etc/sysconfig/ipvsadm-config
ipvsadm -D -t|u|f service-address 刪除
ipvsadm –C 清空定義的所有規則
ipvsadm –R 重載
ipvsadm -S [-n] 保存
保存及重載規則 (由于重啟后定義的規則會失效,所以需要保存 和重新載入)
保存:建議保存至/etc/sysconfig/ipvsadm (可以自定義文件的路徑和名稱)
ipvsadm -Sn >?/etc/sysconfig/ipvsadm ? (添加n是為了防止名字解析)
systemctl stop ipvsadm.service ?
重載:
ipvsadm-restore < ?/etc/sysconfig/ipvsadm ? (重新導入規則)
ipvsadm -R < /etc/sysconfig/ipvsadm
systemctl restart ipvsadm.service
如果導出的規則導出到/etc/sysconfig/ipvsadm 路徑下系統開機啟動默認導入此文件下的規則。
ipvsadm后面跟的選項參數:
service-address? (LVS服務器的地址)
-t: TCP協議的端口,VIP:TCP_PORT
-u: UDP協議的端口,VIP:UDP_PORT
-f:firewall MARK,標記,一個數字
指定集群的調度算法,默認為wlc
-s ? :(上面的十種調度算法)
lvs類型:
-g: gateway, dr類型,不用寫默認使用的的類型
-i: ipip, tun類型
-m: masquerade, nat類型
權重 數
-w
實驗:lvs-nat模式的實現 ?
實驗結構拓撲圖:(以下兩個網段都應是公網的地址)
1 .在LVS服務器上:(iptables? 和selinux 確定關上)
yum install ipvsadm ? (安裝LVS服務的包)
配置VIP和DIP兩塊網卡:無需添加網關 (按照結構拓撲圖)
啟用ip_forward功能:
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p (讓其生效)
配置調度規則:
ipvsadm -A -t 172.20.0.200:80 -s rr ? (rr:使用輪詢調度;172.20.0.200為VIP的地址)
ipvsadm -a -t 172.20.0.200:80 -r 192.168.60.21 -m? (-r 192.168.60.21: 此為RIP -m :為nat的類型 )
ipvsadm -a -t 172.20.0.200:80 -r 192.168.60.22 -m? (-r 192.168.60.22 ;此為RIP;-m為nat的類型)
ipvsadm -Ln? (查看定義的規則)
2? .在兩臺http服務器上安裝http服務并配置網卡信息
在第一臺http服務器上:
yum install httpd -y ?? (安裝包)
systemctl start httpd ? ? (啟動服務)
echo “RS1” > /var/www/html/index.html ?? (建立訪問的主頁面)
配置網卡信息:(按照拓撲圖來配置)
DEVICE=ens33
IPADDR=192.168.60.21
PREFIX=24
GATEWAY=192.168.60.200
systemctl restart network ?? (重啟網絡服務)
在第二臺服務器上:
yum install httpd -y (安裝包)
systemctl start httpd (啟動服務)
echo “RS2” > /var/www/html/index.html (建立訪問的主頁面)
配置網卡信息:
DEVICE=ens33
IPADDR=192.168.60.22
PREFIX=24
GATEWAY=192.168.60.200
systemctl restart network (重啟網絡服務)
route -n? (查看路由列表,確保每個http服務器都只有一個網關,如果多的話會找不到地址)
3 . 在客戶端開始訪問VIP的地址:
curl 172.20.0.200 ?? (現在測試應該是輪詢調度的)
在上述實驗中再加一臺路由器:(網絡結構拓撲圖如下)
然后新添加的路由器要添加一個路由:route add default gw 192.168.0.200
啟用ip_forward功能:(新加的路由器)? (在centos7上)
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p (讓其生效)
vim/etc/sysctl.conf ? ? (在centos6上改為1 就可以了
還可以更改端口:(nat模式下支持端口映射)
將192.168.60.21服務器的http服務端口改成8080
之后要將LVS服務器的調度的端口修改一下:
先刪除:ipvsadm -d -t 172.20.0.200 -r 192.168.60.21
在從新添加:ipvsadm -a -t 172.20.0.200 -r 192.168.60.21:8080 -m
ipvsadm -Ln (查看定義的規則有沒有添加上去)
添加權重:
ipvsadm -E -t 172.20.0.200:80 -s wrr? (-E修改定義算法;-A是添加)
先刪除一個:ipvsadm -d -t 172.20.0.200 -r 192.168.60.21
重新添加在加上權重:ipvsadm -a -t 172.20.0.200:80 -r 192.168.60.21 -m -w 3 ? (-w后面如果不寫數字默認就是為1)
實驗:LVS-DR模式 的實現? (此種模式下不能映射端口所以端口號是無法修改的)
在內核層面限制多個VIP地址的相互沖突:
限制響應級別:arp_ignore
0:默認值,表示可使用本地任意接口上配置的任意地址進行響應
1: 僅在請求的目標IP配置在本地主機的接收到請求報文的接口上時,才給予響應 ?
限制通告級別:arp_announce
0:默認值,把本機所有接口的所有信息向每個接口的網絡進行通告
1:盡量避免將接口信息向非直接連接網絡進行通告
2:必須避免將接口信息向非本網絡進行通告
實驗結構拓撲圖:(實現單網絡的DR的LVS)此階段使用的網絡都是公網的地址
1 .首先后臺的real server服務器的配置:(兩臺real server 都只留一個網卡)
RS1:
yum install httpd -y (安裝包)
systemctl start httpd (啟動服務)
echo “RS1” > /var/www/html/index.html (建立訪問的主頁面)
配置網卡信息:(按照拓撲圖來配置)
DEVICE=ens33
IPADDR=192.168.60.21
PREFIX=24
GATEWAY=192.168.60.200
systemctl restart network (重啟網絡服務)
修改內核配置來防止VIP地址的相互沖突:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce? (臨時修改)
將VIP地址綁定到本機的回環網卡上:(可以不用添加新的網卡)
ip a a 192.168.60.20/32 dev lo ? ? 此種只是臨時綁定重啟服務就會失效的
RS2:
yum install httpd -y (安裝包)
systemctl start httpd (啟動服務)
echo “RS2” > /var/www/html/index.html (建立訪問的主頁面)
配置網卡信息:(按照拓撲圖來配置)
DEVICE=ens33
IPADDR=192.168.60.22
PREFIX=24
GATEWAY=192.168.60.200
systemctl restart network (重啟網絡服務)
修改內核配置來防止VIP地址的相互沖突:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
將VIP地址綁定到本機的回環網卡上:(可以不用添加新的網卡)
ip a a 192.168.60.20/32 dev lo ? ? ?此種只是臨時綁定重啟服務就會失效的
2 . 配置路由虛擬主機的網卡:
啟動路由功能:
啟用ip_forward功能:(新加的路由器) (在centos7上)
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p (讓其生效)
vim/etc/sysctl.conf (在centos6上改為1 就可以了
3 . 配置LVS服務器的網卡配置:(VIP和DIP)
首先配置DIP的網卡地址和網關:
ip a a 192.168.60.20/24 ens33:1(將VIP綁定到DIP的網卡上;此種只是臨時綁定重啟服務就會失效的)
yum install ipvsadm (安裝工具包)
ipvsadm -A -t 192.168.60.20:80 -s rr(定義規則;此IP地址為VIP的地址)
(添加后臺服務的主機)
ipvsadm -a -t 192.168.60.20:80 -r 192.168.60.21 ?? (-g不寫默認是DR模式)
ipvsadm -a -t 192.168.60.20:80 -r 192.168.60.22
4 . 配置客戶端的訪問:(只配置一個172.20網段的一個網卡就行)要添加GATEWAY
配完網絡后從客戶端:ping 后臺的兩個服務器的IP地址應該是可以ping通的
curl 192.168.60.6 ? (測試調度是否成功)
實驗:實現跨網絡的DR的LVS(VIP與DIP/RIP不在同一網絡 )
實驗結構拓撲圖:(此網絡中10.0.0.100為VIP使用的一個公網的地址;然后LVS和RS1;RS2使用的都是私網地址來聯通;同時都綁定公網的VIP 這樣做可以節省公網地址。)
配置real server服務器的網卡及http服務:
1 .首先后臺的real server服務器的配置:(兩臺real server 都只留一個網卡)
RS1:
yum install httpd -y (安裝包)
systemctl start httpd (啟動服務)
echo “RS1” > /var/www/html/index.html (建立訪問的主頁面)
配置網卡信息:(按照拓撲圖來配置)
DEVICE=ens33
IPADDR=192.168.60.21
PREFIX=24
GATEWAY=192.168.60.20
systemctl restart network (重啟網絡服務)
修改內核配置來防止VIP地址的相互沖突:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce (臨時修改)
將VIP地址綁定到本機的回環網卡上:(可以不用添加新的網卡)
ip a a 10.0.0.100/32 dev lo
RS2:
yum install httpd -y (安裝包)
systemctl start httpd (啟動服務)
echo “RS2” > /var/www/html/index.html (建立訪問的主頁面)
配置網卡信息:(按照拓撲圖來配置)
DEVICE=ens33
IPADDR=192.168.60.22
PREFIX=24
GATEWAY=192.168.60.20
systemctl restart network (重啟網絡服務)
修改內核配置來防止VIP地址的相互沖突:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
將VIP地址綁定到本機的回環網卡上:(可以不用添加新的網卡)
ip a a 10.0.0.100/32 dev lo
2 . 配置路由虛擬主機的網卡:
先配置192.168.60.20 和172.20.49.200/16的IP地址
ip a add 10.0.0.200 /8? dev? eth0 (將此IP和192.168.60.20綁在同一塊網卡上)
啟動路由功能:
啟用ip_forward功能:(新加的路由器) (在centos7上)
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
sysctl -p (讓其生效)
vim/etc/sysctl.conf (在centos6上改為1 就可以了
3 . 配置LVS服務器的網卡配置:(VIP和DIP)
首先配置DIP的網卡地址和網關:
ip a a? 10.0.0.100/8? dev ens33:1(將VIP綁定到DIP的網卡上)
yum install ipvsadm (安裝工具包)
ipvsadm -A -t 10.0.0.100:80 -s rr(定義規則;此IP地址為VIP的地址)
(添加后臺服務的主機)
ipvsadm -a -t 10.0.0.100:80 -r 192.168.60.21 (-g不寫默認是DR模式)
ipvsadm -a -t 10.0.0.100:80 -r 192.168.60.22
4 . 配置客戶端的訪問:(只配置一個172.20網段的一個網卡就行)要添加GATEWAY
配完網絡后從客戶端:ping 后臺的兩個服務器的IP地址應該是可以ping通的
curl 10.0.0.100 (測試調度是否成功)
實驗LVS高可用的實現? (對后端服務器做健康檢查)
當后臺有某一個服務器宕機時,LVS將不在將客戶端的訪問數據包發向宕機的主機了。
ldirectord
ldirectord:監控和控制LVS守護進程,可管理LVS規則 ?
包名:ldirectord-3.9.6-0rc1.1.1.x86_64.rpm
/etc/ha.d/ldirectord.cf 主配置文件
/usr/share/doc/ldirectord-3.9.6/ldirectord.cf 配置模版
/usr/lib/systemd/system/ldirectord.service 服務
/usr/sbin/ldirectord 主程序
/var/log/ldirectord.log 日志
/var/run/ldirectord.ldirectord.pid pid文件
安裝包:實現LVS的高可用(在上述實驗的基礎上添加此服務可實現高可用性)
yum install ldirectord-3.9.6-0rc1.1.1.x86_64.rpm ? (安裝包)
cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/(將配置文件復制一份出來)
vim /etc/ha.d/ldirectord.cf? (修改配置文件)(需要將以前在ipvsadm里的規則都清空:ipvsadm -C)
修改過后的:
systemctl start ldirectord.service? (啟動此服務)
查看ipvsadm -Ln? 發現已經自動生成定義的規則了。
在LVS服務器主機上安裝http服務然后將主頁面定義為sorry server
當所有后臺主機都宕機是客戶端在訪問就會顯示出sorry server的提示字樣
echo “sorry server” > /var/www/html/index.html
此時如果將后臺的兩臺http服務器都停止服務:systemctl stop httpd
就會顯是LVS服務器本機提供的http服務提供sorry server
如果要加上dns解析的話:dns主機用外網IP172.20.81.11 然后加上路由器的網關讓其連到此網絡中
gateway=172.20.49.200? (就可以可)
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/102054