主流的軟件有LVS、keepalived、haproxy、nginx等linux
其中LVS屬於4層(網絡OSI 7層模型),nginx屬於7層,haproxy既能夠認爲是4層,也能夠當作7層使用nginx
keepalived的負載均衡功能其實就是LVS算法
lvs這種4層的負載均衡是能夠分發除80外的其餘端口通訊的,好比MySQL的,而nginx僅僅支持http,https,mail,haproxy也支持MySQL這種 vim
相比較來講,LVS這種4層的更穩定,能承受更多的請求,而nginx這種7層的更加靈活,能實現更多的個性化需求後端
LVS是由國內的大牛張文嵩開發的,這款軟件的流行度不亞於httpd,它是一款四層的負載均衡軟件,針對tcp/ip作的轉發和路由,穩定選哪一個和效率高。可是它已經好久沒更新了,最新的只有基於linux2.6核的版本。bash
LVS架構中有一個核心的角色加分發器(Load Blancer),也叫調度器,是用來分發用戶的請求,還有諸多處理用戶請求的服務器(Real Server)。服務器
LVS有三種常見的模式:NAT模式、DR模式、IP Tunel模式。網絡
這種模式實現的原理是調度器把用戶的情趣經過預設的IPtables規則轉發給後端的真實服務器。其中調度有兩個IP,一個是公網IP,另外一個是內網IP,而真實的服務器只有內網IP。用戶訪問的時候請求的是調度器的公網IP,他會把用戶的請求轉發到真實服務器的內網IP上。這種模式的好處是節省公網IP,當時調度器會成爲一個瓶頸。架構
這種模式須要有一個公共的IP配置在分發器和全部服務器上,咱們把它叫作vip 客戶端請求的目標IP爲vip,分發器接收到請求數據包後,會對數據包作一個加工,會把目標IP改成服務器的IP,這樣數據包就到了服務器上 服務器接收數據包後,會還原原始數據包,這樣目標IP爲vip,由於全部服務器上配置了這個vip,因此它會認爲是它本身負載均衡
這種模式也須要有一個公共的IP配置在分發器和全部服務器上,也就是vip 和IP Tunnel不一樣的是,它會把數據包的MAC地址修改成服務器的MAC地址 服務器接收數據包後,會還原原始數據包,這樣目標IP爲vip,由於全部服務器上配置了這個vip,因此它會認爲是它本身
經過預先設定好算法能夠實現調度器把客戶端發來的請求均衡的分發給後端的真實服務器
輪詢 Round-Robin rr
按順序把請求一次發送給後端的服務器,無論後端服務器的處理速度和響應時間,若是後端服務器的性能不一致時,這種調度算法就會不合適。
加權輪詢 Weight Round-Robin wrr
比上一種算法多了一個權重設置,權重越高的服務器被分配的請求越多,這樣的話,後端服務器性能不一致時,就會給配置低的服務器設置比較小的權重。
最小鏈接 Least-Connection lc
根據各個這是服務器上的裏阿尼額數來決定把新的請求分配給誰,鏈接數少說明服務器是空閒的,這樣吧新的請求分配到空閒服務器上才合理。
加權最小鏈接 Weight Least-Connection wlc
在最小鏈接的算法上加一個權重設置。
基於局部性的最小鏈接 Locality-Based Least Connections lblc
針對請求報文的目標ip地址的負載均衡調度,目前用於Cache集羣系統,由於在Cache集羣中客戶請求報文的目標IP地址是變化的。算法的設計目標是在服務器的負載基本皮平衡的狀況下,將相同目標IP地址的請求調度到同一臺服務器,提升每臺服務器的訪問局部性和主存Cache命中率。
帶複製的基於局部性最小鏈接 Locality-Based Least Connections with Replication lblcr
針對目標IP地址的負載均衡,要維護從一個目標IP地址到一組服務器的映射,先根據請求的目標IP地址找出該目標IP地址對應的服務器組,按照「最小鏈接」原則熊該服務器組中選出一臺服務器,若服務器沒有超載,就會把請求發送到這個服務器;若是服務器超載,就會按照「最小鏈接」從整個集羣裏選出一臺服務器,將該服務器加入到服務器組裏面去,再把請求發送到這個服務器。同時,當這個服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,下降複製的程度。
目標地址散列調度 Destination Hashing dh
這是一種靜態映射算法,這個算法也是針對IP地址的負載均衡的,經過一個散列函數將一個目標IP地址映射到一臺服務器。目標地址散列調度算法先根據請求的目標IP地址,做爲散列鍵從靜態分配的散列表找出對應的服務器,若是這個服務器是可用的而且沒有超載,九江請求發送到這個服務器,否知返回空。
根據請求的源IP地址做爲散列鍵從靜態分配的單列表中找出對應的服務器。
調度器須要有兩個IP,一個是公網IP,一個是內網IP,真實服務器只須要內網IP。
搭建這個架構須要三臺機器,一臺做爲調度器,另外兩臺爲服務器
調度器內網IP192.168.42.128和公網IP192.168.241.128
真實服務器1內網IP192.168.42.129
真實服務器2內網IP192.168.42.130
把三臺服務器都使用防火牆netfilter,iptables規則清空,命令爲:
# iptables -F; iptables -t nat -F; service iptables save
調度器上安裝LVS核心工具 ipvsadm
# yum install -y ipvsadm
調度器上編寫一個腳本
vim /usr/local/sbin/lvs_nat.sh
#! /bin/bash # director 服務器上開啓路由轉發功能 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 # director 設置nat防火牆 iptables -t nat -F iptables -t nat -X iptables -t nat -A POSTROUTING -s 192.168.42.0/24 -j MASQUERADE # director設置ipvsadm IPVSADM='/usr/sbin/ipvsadm' $IPVSADM -C $IPVSADM -A -t 192.168.241.128:80 -s wlc -p 3 $IPVSADM -a -t 192.168.241.128:80 -r 192.168.42.129:80 -m -w 1 $IPVSADM -a -t 192.168.241.128:80 -r 192.168.42.130:80 -m -w 1
兩臺真實服務器上都安裝Nginx
分別給兩臺真實服務器設置主頁
而後在調度器裏用curl訪問兩臺服務器