12月20日任務html
18.6 負載均衡集羣介紹linux
18.7 LVS介紹nginx
18.8 LVS調度算法算法
18.9/18.10 LVS NAT模式搭建apache
負載均衡集羣主流軟件LVS、keepalived、haproxy、nginx等。其中LVS屬於4層的負載均衡,nginx屬於7層的負載均衡。而haproxy既能夠認爲是4層負載均衡,也能夠當作7層負載均衡使用。vim
keepalived的負載均衡功能實際上就是內置的LVS實現的。LVS的負載均衡是能夠分發除80端口外的其餘端口通訊的,好比MySQL;nginx僅支持http、https、mail;haproxy也支持MySQL等端口的分發。後端
相對而言,LVS更穩定,能承受更多的請求;nginx則更靈活,能實現更多的個性化需求。bash
LVS是中國人章文嵩開發的一款世界知名的開源軟件,流行度不亞於apache的httpd,基於TCP/IP作的路由與轉發,穩定性和效率很高。服務器
LVS最新版本基於Linux內核2.6,可是多年未更新了。LVS有三種參見的模式:NAT、DR、IP Tunnel。session
LVS架構中有一個核心角色叫作分發器(Load Balance),用來分發用戶的請求,還有諸多處理用戶請求的服務器(Real Server,簡稱RS)。
NAT模式是藉助iptables的nat表來實現的。
在nat模式中,只須要分發器有公網ip便可,全部比較節省公網ip資源。
須要有一個公共的ip配置在分發器和全部的RS上,該公共ip稱爲vip。
DR模式也須要有一個公共的ip -- vip:分發器和全部RS上都須要配置。
rr(Round Robin)輪詢 依次將請求均勻的發送給負載均衡集羣內的RS上,其特色是實現簡單。輪詢算法假設全部的服務器處理請求的能力相同,分發器會將全部的請求平均分配給每一個RS。
wrr 加權輪詢 輪詢算法的補充,經過給負載均衡集羣內RS設置權重,LVS會經過這個權重來對區別化處理:權重高的處理更多的請求,權重少的處理較少的請求。
lc(least connection)最小鏈接 將新的請求發送給當前鏈接數最小的服務器(最空閒的RS上)
wlc(weight least connection)加權最小鏈接 將新的請求發送給權重較高,同時處理請求較少的RS上。
lblc(locality-based least connection)基於局部性的最小鏈接 針對請求的目標IP地址尋找最近的該目標ip地址全部使用的服務器,若是這臺服務器可用,並能夠處理請求,那麼分發器將會盡可能選擇相同的服務器,不然會繼續選擇其餘可行的服務器。
lblcr(locality-based least connections withreplication)帶複製的基於基本性最小鏈接,它會維護一個目標ip到一組服務器之間的映射關係,防止某個服務器負載太高。
dh(Destination Hashing)目標地址散列調度 將目標ip地址經過散列函數將ip與服務器創建映射關係,當出現服務器不可用或負載太高時,把同一個ip地址的請求,發送給同一個server。
sh(Source Hashing)源地址散列調度 與dh(目標地址散列調度)相似,其根據源地址創建映射,一樣將同一個ip地址的請求發個同一個服務器。將此前創建的session信息保留。
主要由地址轉換(NAT)、直接路由(DR)和隧道(TUN)。用的比較多的是前2種,下面介紹如何搭建NAT/DR方法。
10臺機器之內的可使用NAT模式,其優勢在於節省公網ip資源,節約成本。也能夠將內網內主機都用來搭建LVS(都配置私有ip),使用一個公網ip進行映射,一樣起到節省ip的效果。
實例準備
修改rs1/rs2的網關的操做最好在準備階段的最後再進行操做,不然將致使機器沒法聯網,後續可能須要的yum安裝沒法操做。
rs1/2上關閉firewalld,使用iptables
# 分發器、rs一、rs2都執行下列代碼 # 關閉firewalld systemctl disable firewalld systemctl stop firewalld # 開啓iptables yum install -y iptables-services systemctl enable iptables systemctl start iptables # 清空規則 iptables -F service iptables save # 關閉selinux vi /etc/selinux/config SELINUX=disabled
分發器上須要安裝ipvsadm
[root@director ~]# yum install -y ipvsadm [root@director ~]# vi /usr/local/sbin/lvs_nat.sh #! /bin/bash # 服務器上開啓路由轉發功能 echo 1 > /proc/sys/net/ipv4/ip_forward # 關閉icmp的重定向 echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects # 注意區分網卡名字 echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects # 設置nat防火牆 iptables -t nat -F iptables -t nat -X iptables -t nat -A POSTROUTING -s 192.168.65.0/24 -j MASQUERADE # 設置ipvsadm IPVSADM='/usr/sbin/ipvsadm' $IPVSADM -C # -A 增長規則 # -s指定LVS調度算法,這裏選rr能夠均衡分配請求; # 還可使用-p參數來指定超時時間,在該時間內將請求分發到一個RS上 $IPVSADM -A -t 192.168.19.128:80 -s rr # -r指定rs的ip;-m表示爲nat模式;-w指定權重 $IPVSADM -a -t 192.168.19.128:80 -r 192.168.65.133:80 -m -w 1 $IPVSADM -a -t 192.168.19.128:80 -r 192.168.65.134:80 -m -w 1
rs1和rs2上安裝nginx
rs1和rs2上編輯默認主機網頁進行區分 [root@test1 ~]# yum install nginx [root@test1 ~]# vim /usr/share/nginx/html/index.html this is RS1 [root@test2 ~]# yum install nginx [root@test2 ~]# vim /usr/share/nginx/html/index.html this is RS2
運行腳本,進行測試
[root@director ~]# sh /usr/local/sbin/lvs_nat.sh # 訪問配置的官網ip [root@director ~]# curl 192.168.19.128:80 this is RS1 # 2臺rs都分發了請求,達到均衡的效果 [root@director ~]# 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.19.128:80 rr -> 192.168.65.133:80 Masq 1 0 1 -> 192.168.65.134:80 Masq 1 0 1
能夠修改lvs_nat.sh內的LVS調度算法來顯示不一樣的效果,注意每次修改完腳本後要當即執行,使配置生效。