LVS簡介
LVS介紹
LVS是Linux Virtual Server的縮寫,意即Linux虛擬服務器,是一個虛擬的服務器集群系統,屬於4層負載均衡
ipvs和ipvsadm的關系
我們使用配置LVS的時候,不能直接配置內核中的ipvs,需要使用ipvs的管理工具ipvsadm進行管理
LVS術語

LVS轉發原理
LVS負載均衡器接受所有入站請求,並根據調度算法決定哪個realserver處理該請求
LVS調度算法
- 輪詢(rr):按照請求順序輪流分發到后端RS
- 加權輪詢(wrr):權值高的獲得的任務更多
- 最小連接數(lc):動態的將請求建立到連接數較少的RS上
- 加權最小連接數(wlc):調度器自動詢問RS的真實負載情況,並動態的調整權
LVS調度算法生產環境選型
一般的網絡服務,如:http、mail、MySQL等,常用的調度算法為:
- 基本輪詢調度rr算法
- 加權輪詢調度wrr算法
- 加權最小連接調度wlc算法
LVS轉發模式
- NAT(Network Address Translation)
- DR(Direct Routing)
- TUN
LVS-DR模式
轉發流程
將所有入站請求轉發給后端realserver,后端realserver處理完直接將結果發給客戶端

原理
當用戶請求到達Direct Server,此時報文的源IP為CIP、MAC為CIP-MAC,目標IP為VIP、MAC為VIP-MAC
Direct Server根據調度算法確定一台處理請求的realserver,將請求轉發給對應的realserver,此時源IP和目標IP均未改變,僅修改了源MAC為DIP-MAC,目標MAC為RIP-MAC
對應的realserver處理完請求,直接將結果發給客戶端,此時源IP為VIP、MAC為VIP-MAC,目標IP為CIP、MAC為CIP-MAC
特性
- 通過在調度器上修改數據包的目的MAC地址實現轉發
- Real-Server和Direct-Server必須在同一網段
- Real-Server的lo接口必須綁定VIP
為什么要抑制ARP請求
- 由於后端Real-Server要將VIP綁定到lo網卡上,這就出現了一個問題,客戶端請求到達LVS前端路由器的時候,前端路由器會發送一個{*目標地址為VIP*}的請求報文,所以需要抑制Real-Server的ARP,保證讓Direct-Server收到這個報文,而不是realserver收到這個報文
- 一句話說明抑制Real-Server原因:保證前端路由將目標地址為VIP的報文發給Direct-Server,而不是Real-Server
優勢
只有請求報文經過調度器,而Real-Server響應處理后無需經過調度器,因此並發量大的時候效率很高
LVS-NAT模式
轉發流程
將所有入站請求轉發給后端Real-Server,后端Real-Server處理完再發給Direct-Server,Direct-Server再發給客戶端
特性
- 既有RIP也有VIP
- Real-Server必須得跟Direct-Server在同一網段
- Real-Server必須將網關指向Direct-Server
優勢
只需要一個公網IP給Direct-Server,Direct-Server始終跟外接打交道
劣勢
需要依賴Direct-Server把請求轉發給Real-Server,Real-Server處理完把結果發給Direct-Server,Direct-Server再把結果轉發出去,並發高的時候會成為瓶頸
LVS三種模式對比

ipvsadm介紹
ipvsadm參數
添加虛擬服務器 語法:ipvsadm -A [-t|u|f] [vip_addr:port] [-s:指定算法] -A:添加 -t:TCP協議 -u:UDP協議 -f:防火牆標記 -D:刪除虛擬服務器記錄 -E:修改虛擬服務器記錄 -C:清空所有記錄 -L:查看 添加后端RealServer 語法:ipvsadm -a [-t|u|f] [vip_addr:port] [-r ip_addr] [-g|i|m] [-w 指定權重] -a:添加 -t:TCP協議 -u:UDP協議 -f:防火牆標記 -r:指定后端realserver的IP -g:DR模式 -i:TUN模式 -m:NAT模式 -w:指定權重 -d:刪除realserver記錄 -e:修改realserver記錄 -l:查看 通用: ipvsadm -ln:查看規則 service ipvsadm save:保存規則
ipvsadm配置LVS負載均衡
需求
用LVS實現后端兩台httpd的負載均衡
環境說明
| lb01 | 192.168.0.91 | lvs |
| realserver-1 | 192.168.0.92 | httpd |
| realserver-2 | 192.168.0.93 | httpd |
| test | 192.168.0.94 | 用來測試負載均衡 |
負載均衡器端
安裝LVS [root@lb01 ~]#yum -y install ipvsadm [root@lb01 ~]#ipvsadm 添加綁定VIP [root@lb01 ~]#ip addr add 192.168.0.89/24 dev eth0 label eth0:1 配置LVS-DR模式 [root@lb01 ~]#ipvsadm -A -t 192.168.0.89:80 -s rr [root@lb01 ~]#ipvsadm -a -t 192.168.0.89:80 -r 192.168.0.93 -g [root@lb01 ~]#ipvsadm -a -t 192.168.0.89:80 -r 192.168.0.94 -g
Real-Server端
配置測試后端realserver 配置httpd省略 [root@realserver-1 ~]#curl 192.168.0.93 #測試realserver-1網站是否正常 192.168.0.93 [root@realserver-2 ~]#curl 192.168.0.94 #測試realserver-2網站是否正常 192.168.0.94 綁定VIP到lo網卡 [root@realserver-1 ~]#ip addr add 192.168.0.89/32 dev lo label lo:1 #由於DR模式需要realserver也有VIP 抑制ARP [root@realserver-1 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@realserver-1 ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce [root@realserver-1 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@realserver-1 ~]#echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
客戶端測試
[root@test ~]#curl 192.168.0.89 192.168.0.93 [root@test ~]#curl 192.168.0.89 192.168.0.94
配置LVS+keepalived
需求
- LVS給兩台httpd做負載均衡
- keepalived做lvs高可用,同時做Real-Server健康檢查,如果發現Real-Server80端口沒開,就認為故障,從集群中剔除
- 在keepalived配置文件內就能配置LVS
環境說明
| lb01 | 192.168.0.91 | lvs keepalived-master |
| lb02 |
192.168.0.92 | lvs keepalived-backup |
| realserver-1 | 192.168.0.93 | httpd |
| realserver-2 | 192.168.0.94 | httpd |
在負載均衡器端配置lvs+keepalived
lb01節點
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived ##################全局配置########################## global_defs { #如有故障,發郵件地址 notification_email { 9618154@qq.com #收件人 } notification_email_from Alexandre.Cassen@firewall.loc #keepalived報警郵件,發件人 smtp_server 192.168.200.1 #郵件服務器地址 smtp_connect_timeout 30 #郵件服務器超時時間 router_id LVS_01 #類似於MySQL的server-id,每個keepalived節點不能相同 } #################keepalived配置##################### vrrp_instance VI_1 { state MASTER #keepalived角色,MASTER和BACKUP interface eth0 #通信接口,下面的virtual_ipaddress(VIP)綁定到這個網卡 virtual_router_id 51 #vrrp_instance的唯一標識 priority 150 #keepalived權重,數值越大權重越大,MASTER應大於BACKUP advert_int 1 #發送心跳間隔,如果backup1秒收不到心跳就接管,單位是秒 authentication { #每個keepalived節點通過這里設置的驗證通信,必須得設置成一樣 auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.0.89/24 #VIP } } ##################LVS配置############## #添加虛擬服務器 #相當於 ipvsadm -A -t 192.168.0.89:80 -s wrr virtual_server 192.168.0.89 80 { delay_loop 6 #服務健康檢查周期,單位是秒 lb_algo wrr #調度算法 lb_kind DR #模式 nat_mask 255.255.255.0 persistence_timeout 50 #回話保持時間,單位是秒 protocol TCP #TCP協議轉發 #添加后端realserver #相當於 ipvsadm -a -t 192.168.0.89:80 -r 192.168.0.93:80 -w 1 real_server 192.168.0.93 80 { #realserver的真實IP weight 1 #權重 #健康檢查 TCP_CHECK { connect_timeout 8 #超時時間 nb_get_retry 3 #重試次數 delay_before_retry 3 #重試間隔 connect_port 80 #檢查realserver的80端口,如果80端口沒監聽,就會從集群中剔除 } } real_server 192.168.0.94 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
lb02節點
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived ################全局配置########################### global_defs { notification_email { } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_02 } ################keepalived配置##################### vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.0.89/24 } } ################lvs配置########################## virtual_server 192.168.0.89 80 { delay_loop 6 lb_algo wrr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.0.93 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.94 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
配置后端Real-Server
確保網站服務是正常的 curl 192.168.0.93 192.168.0.93 curl 192.168.0.94 192.168.0.94 綁定VIP到lo網卡 ip addr add 192.168.0.89/32 dev lo label lo:0 抑制ARP [root@realserver-1 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@realserver-1 ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce [root@realserver-1 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@realserver-1 ~]#echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
客戶端測試
- 負載均衡是否正常
- 后端Real-Server出問題是否自動剔除
- lvs高可用是否正常,提供服務的LVS宕機,vip漂移到另一台LVS繼續提供服務
