LVS簡介:前端
lvs是負載均衡較經常使用的軟件之一,lvs官方提供了一個命名的約定:linux
vip:虛擬ip地址,縮寫是vip,vip是負載均衡器對外提供服務的ip。nginx
rip:真實ip地址,縮寫是rip,rip是集羣下面節點上使用的ip地址。web
dip:負載均衡器的真實ip,用於鏈接內外網絡的ip。算法
cip:客戶端的ip地址,訪問來源ip。docker
lvs的工做模式有以下幾種,直接路由(dr)模式、nat模式、tunnel模式、full nat模式。vim
DR模式-直接路由模式:bash
Virtual Server via Direct
VS/DR模式是經過改寫請求報文的目標MAC地址,將請求發給真實服務器的,而真 實服務器將響應後的處理結果直接返回給客戶端用戶。同VS/TUN技術同樣,VS/DR技術 可極大地提升集羣系統的伸縮性。並且,這種DR模式沒有IP隧道的開銷,對集羣中的真 實服務器也沒有必須支持IP隧道協議的要求,可是要求調度器LB與直實服努器RS都有一塊網卡連在同一物理網段上,即必須在同一個局域網環境。服務器
固然也包括iptables防火牆的forward功能(DR和TUX模式不須要)網絡
DR模式特色: 1、經過在調度器LB上修改數據包的目的MAC地址實現轉發。注意,源IP地址仍然是 CIP,目的IP地址仍然是VIP。 2、請求的報文通過調度器,而RS響應處理後的報文無需通過調度器LB,所以,併發訪問量大時使用效率很高(和NAT模式比)。 3、因DR模式是經過MAC地址的改寫機制實現的轉發,所以,全部RS節點和調度器LB 只能在一個局域網LAN中(小缺點)。 4、須要注意RS節點的VTP的綁定(lo:vip,lo1:vip)和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取代之。這符合運維的原則:簡單、易用、高效。日2000W PV或併發請 求1萬如下均可以考慮用haproxy/nginx (LVS的NAT模式) 9、直接對外的訪問業務,例如:web服務作RS節點,RS最好用公網IP地址。若是不直 接對外的業務,例如:MySQL,存儲系統RS節點,最好只用內部IP地址。
NAT模式:
一、NAT技術將請求的報文(DNAT)和響應的報文(SNAT),經過調度器地址重寫而後 在轉發發給內部的服務器,報文返回時在改寫成原來的用戶請求的地址。
二、只須要在調度器LB上配置WAN公網IP便可,調度器也要有私有LAN IP和內部RS節點通訊。
三、每臺內部RS節點的網關地址,必需要配置成調度器LB的私有LAN內物理網卡地址(LDIP),這樣才能確保數據報文返回時仍然通過調度器LB。
四、因爲請求與響應的數據報文都通過調度器LB,所以,網站訪問量大時,調度器LB有較大瓶頸,通常要求最多10-20臺節點。
五、NAT模式支持對IP及端口的轉換,即用戶請求10.0.0.1:80,能夠經過調度器轉換到 RS 節點的10.0.0.2:8080 (DR和TUN模式不具有的)
六、全部NAT內部RS節點只需配置私有LAN IP便可。
七、因爲數據包來回都須要通過調度器,所以要開啓內核轉發net.ipv4.ip_forward = 1
固然也包括iptables防火牆的forward功能(DR和TUN模式不須要)。
其餘模式的負載均衡不太經常使用,這裏不作詳細說明。tunnel模式主要是把ip前端包裝一個頭,適合用於跨機房的狀況。fullnat則是淘寶使用的負載均衡模式。
關於LVS的調度算法:
固定調度算法:rr,wrr,dh;sh
動態調度算法:wlc,lc,lblc,lblcr,SED,NQ(後兩種官方站點沒提到,編譯LVS,make過 程能夠看到 rr|wrr|lc|wlc|lblc|lblcrjdli|sli|sed|nq)
3經常使用種調度算法見以下:
rr 輪循調度(Round-Robin):
它將請求依次分配不一樣的RS節點,也就是在RS節點中 均攤請求。這種箅法簡單,可是隻適合於RS節點處理性能相差不大的狀況。
wrr:
加權輪循調度(Weighted Round-Robin),它將依據不一樣RS節點的權值分配任務。權值較高的RS將優先得到任務,而且分配到的鏈接數將比權值較低的RS節點更多。 相同權值的RS獲得相同數目的鏈接數。
Wlc加權最小鏈接數調度算法:
假設各臺RS的全職依次爲Wi,當前tcp鏈接數依次爲Ti,依次去Ti/Wi爲最小的RS做爲下一個分配的RS
1、lvs服務的配置方法
1.安裝內核開發包
[root@slave02 ~]# yum install -y kernel-devel [root@slave02 ~]# ln -s /usr/src/kernels/3.10.0-514.16.1.el7.x86_64/ /usr/src/linux [root@slave02 ~]# yum install -y ipvsadm
2.裝載ip_vs模塊到內核
[root@slave02 ~]# lsmod |grep ip_vs [root@slave02 ~]# modprobe ip_vs [root@slave02 ~]# lsmod |grep ip_vs ip_vs 141092 0 nf_conntrack 111302 6 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4 libcrc32c 12644 3 xfs,ip_vs,dm_persistent_data
3.手工添加lvs轉發
[root@slave02 ~]# ifconfig eth0:0 192.168.3.177/24 up [root@slave02 ~]# route add -host 192.168.3.177 dev eth0 [root@slave02 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.3.1 0.0.0.0 UG 100 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 192.168.3.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 192.168.3.177 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
4.添加lvs服務並增長兩臺RS 192.168.3.12 和 192.168.3.13
[root@slave02 ~]# ipvsadm -C # clear the whole tables [root@slave02 ~]# ipvsadm --set 30 5 60 # set tcp tcpfin udp [root@slave02 ~]# ipvsadm -A -t 192.168.3.177:80 -s rr -p 20 [root@slave02 ~]# ipvsadm -a -t 192.168.3.177:80 -r 192.168.3.12 -g -w 1 [root@slave02 ~]# ipvsadm -a -t 192.168.3.177:80 -r 192.168.3.13 -g -w 1 [root@slave02 ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.3.177:80 rr persistent 20 -> 192.168.3.12:80 Route 1 0 6 -> 192.168.3.13:80 Route 1 0 1
刪除方法:
[root@slave02 ~]# ipvsadm -D -t 192.168.3.177:80
此時訪問http://192.168.3.177/不出意外是沒法訪問的
rs01操做:
[root@master ~]# ifconfig lo:0 192.168.3.177/32 up [root@master ~]# route add -host 192.168.3.177 dev lo [root@master ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.3.177 0.0.0.0 255.255.255.255 UH 0 0 0 lo 192.168.3.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 1002 0 0 eth0 0.0.0.0 192.168.3.1 0.0.0.0 UG 0 0 0 eth0
rs02操做:
[root@slave01 ~]# ifconfig lo:0 192.168.3.177/32 up [root@slave01 ~]# route add -host 192.168.3.177 dev lo [root@slave01 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.3.177 0.0.0.0 255.255.255.255 UH 0 0 0 lo 192.168.3.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 1002 0 0 eth0 0.0.0.0 192.168.3.1 0.0.0.0 UG 0 0 0 eth0
5.在RS端配置抑制ARP響應
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
lvs腳本:
[root@slave02 ~]# cat ipvs.sh
#!/bin/bash VIP=192.168.3.177 PORT=80 RIP=( 192.168.3.12 192.168.3.13 ) start(){ ipvsadm -C ipvsadm --set 30 5 60 ipvsadm -A -t $VIP:$PORT -s rr -p20 for ((i=0;i<${#RIP[*]};i++)) do ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]} -g -w 1 done } stop(){ ipvsadm -C } main(){ case $1 in start) start echo "ipvs is started" ;; stop) stop echo "ipvs is stoped" ;; restart) stop echo "ipvs is stoped" start echo "ipvs is started" ;; *) echo "USAGE:$0 {start|stop|restart}" esac } main $1
2、keepalived的經常使用配置
1.在lvs節點上安裝keepalived軟件
# yum install -y keepalived
2.修改keepalived配置,並重啓keepalived軟件
# systemctl restart keepalived
主節點配置:
# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@chinasoft.com } notification_email_from haproxy-ha@chinasoft.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lvs_01 } vrrp_instance VI_1 { interface eth0 state MASTER virtual_router_id 198 priority 150 advert_int 3 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.177 } }
backup節點配置:
# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@chinasoft.com } notification_email_from haproxy-ha@chinasoft.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lvs_02 } vrrp_instance VI_1 { interface eth0 state BACKUP virtual_router_id 198 priority 150 advert_int 3 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.177 } }
能夠看到vip 192.168.3.177漂移到了master 192.168.3.198上
[root@slave02 keepalived]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:50:56:3b:dc:7e brd ff:ff:ff:ff:ff:ff inet 192.168.3.198/24 brd 192.168.3.255 scope global eth0 valid_lft forever preferred_lft forever inet 192.168.3.177/32 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::250:56ff:fe3b:dc7e/64 scope link valid_lft forever preferred_lft forever
3.雙實例配置方法:
[root@slave02 keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@chinasoft.com } notification_email_from haproxy-ha@chinasoft.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lvs_01 } vrrp_instance VI_1 { interface eth0 state MASTER virtual_router_id 198 priority 150 advert_int 3 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.177 } } vrrp_instance VI_2 { interface eth0 state BACKUP virtual_router_id 199 priority 100 advert_int 3 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.188 } }
互備的實例配置:
[root@manager keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@chinasoft.com } notification_email_from haproxy-ha@chinasoft.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lvs_02 } vrrp_instance VI_1 { interface eth0 state BACKUP virtual_router_id 198 priority 150 advert_int 3 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.177 } } vrrp_instance VI_2 { interface eth0 state MASTER virtual_router_id 199 priority 150 advert_int 3 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.188 } }
3、構建實戰:LVS+Keepalived實現負載均衡
1.實驗結構總覽
(1)本次基於centsos系統所構成的一個服務器集羣,其中兩臺負載均衡服務器(一臺爲主機,另外一臺爲備機),另外兩臺做爲真實的Web服務器(向外部提供http服務,這裏僅僅使用了CentOS的nginx服務。
(2)本次實驗基於DR負載均衡模式,設置了一個VIP(Virtual IP)爲192.168.3.177,用戶只須要訪問這個IP地址便可得到網頁服務,在生產環境中通常將域名解析指向VIP地址。其中,負載均衡主機爲192.168.3.198,備機爲192.168.3.200。Web服務器A爲192.168.3.12,Web服務器B爲192.168.3.13。
2.編輯realserver腳本文件(主要是自動完成ARP抑制的設置)
# vim /etc/init.d/realserver SNS_VIP=192.168.3.177 #source /etc/rc.d/init.d/functions case "$1" in start) 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 sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac
這裏咱們設置虛擬IP爲:192.168.3.177
③保存腳本文件後更改該文件權限:chmod 755 /etc/init.d/realserver
④開啓realserver服務:/etc/init.d/realserver start
3.配置主負載服務器
安裝Keepalived相關包
yum install -y keepalived
(2)編輯keepalived.conf配置文件
①進入keepalived.conf所在目錄:cd /etc/keepalived
②首先清除掉keepalived原有配置:> keepalived.conf
③從新編輯keepalived配置文件:vi keepalived.conf
global_defs { notification_email { edisonchou@hotmail.com } notification_email_from sns-lvs@gmail.com smtp_server 192.168.3.198 smtp_connection_timeout 30 router_id LVS_DEVEL # 設置lvs的id,在一個網絡內應該是惟一的 } vrrp_instance VI_1 { state MASTER #指定Keepalived的角色,MASTER爲主,BACKUP爲備 interface eth0 #指定Keepalived的角色,MASTER爲主,BACKUP爲備 virtual_router_id 51 #虛擬路由編號,主備要一致 priority 100 #定義優先級,數字越大,優先級越高,主DR必須大於備用DR advert_int 1 #檢查間隔,默認爲1s authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.177 #定義虛擬IP(VIP)爲192.168.2.33,可多設,每行一個 } } # 定義對外提供服務的LVS的VIP以及port virtual_server 192.168.3.177 80 { delay_loop 6 # 設置健康檢查時間,單位是秒 lb_algo rr # 設置負載調度的算法爲wlc lb_kind DR # 設置LVS實現負載的機制,有NAT、TUN、DR三個模式 nat_mask 255.255.255.0 persistence_timeout 0 protocol TCP real_server 192.168.3.12 80 { # 指定real server1的IP地址 weight 3 # 配置節點權值,數字越大權重越高 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.3.13 80 { # 指定real server2的IP地址 weight 3 # 配置節點權值,數字越大權重越高 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
從新啓動keepalived服務
systemctl restart keepalived
4.配置從負載服務器
從負載服務器與主負載服務器大體相同,只是在keepalived的配置文件中須要改如下兩處:
(1)將state由MASTER改成BACKUP
(2)將priority由100改成99
global_defs { notification_email { edisonchou@hotmail.com } notification_email_from sns-lvs@gmail.com smtp_server 192.168.3.200 smtp_connection_timeout 30 router_id LVS_DEVEL # 設置lvs的id,在一個網絡內應該是惟一的 } vrrp_instance VI_1 { state BACKUP #指定Keepalived的角色,MASTER爲主,BACKUP爲備 interface eth0 #指定Keepalived的角色,MASTER爲主,BACKUP爲備 virtual_router_id 51 #虛擬路由編號,主備要一致 priority 99 #定義優先級,數字越大,優先級越高,主DR必須大於備用DR advert_int 1 #檢查間隔,默認爲1s authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.177 #定義虛擬IP(VIP)爲192.168.2.33,可多設,每行一個 } } # 定義對外提供服務的LVS的VIP以及port virtual_server 192.168.3.177 80 { delay_loop 6 # 設置健康檢查時間,單位是秒 lb_algo wrr # 設置負載調度的算法爲wlc lb_kind DR # 設置LVS實現負載的機制,有NAT、TUN、DR三個模式 nat_mask 255.255.255.0 persistence_timeout 0 protocol TCP real_server 192.168.3.12 80 { # 指定real server1的IP地址 weight 3 # 配置節點權值,數字越大權重越高 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.3.13 80 { # 指定real server2的IP地址 weight 3 # 配置節點權值,數字越大權重越高 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
停掉主節點的keepalived服務vip就漂移到了備用節點上,再次啓動主節點VIP再次回到主節點上