LB負載均衡的目的是爲了提升訪問的併發性和服務器的性能。實現 LB 的方式主要有軟件方式和硬件方式。軟件方式實現的軟件有LVS工做於傳輸層、nginx工做於應用層haproxy工做於傳輸層和應用層硬件方式實現的軟件有 BIG-IPF5,A10A10等。這裏主要介紹軟件方式實現 LB。php
lvsLinux Virtual Server,Linux虛擬服務是工做在第四層的一款軟件。是工做在內核的netfilter模塊上的相似於iptables的工做模型。它是一個前端調度器Director,由它來具體實現負載均衡。它的工做原理以下圖html
幾個概念說明前端
cip請求客戶端的 ip 地址。mysql
vip是lvs調度器的 ip 地址一般也是客戶端請求服務的的目標 ip 地址。nginx
dip: 是directory和後端 real serveer 之間通訊使用的 ip 地址。web
rip: 是提供真正服務的real server的 IP 地址。算法
Director是lvs的前端調度器是ipvs的核心組件。sql
Real Server: 是後端真正提供服務的服務器。數據庫
lvs在內核中是由ipvs實現具體的數據包轉發包括軟發到後端那個real server、響應報文如何工做在netfilter的INPUT鏈上在此處決定是否進行數據包的轉發。可使用ipvsadm工具配置 ipvs 規則。apache
調度算法是在Directory轉發集羣數包的時候使用的具體算法目的是爲了選擇哪一個後端Real Server服務器。ipvs代碼必須提供的調度方法。
如何查看本身的內核是否支持ipvs功能以及支持的算法
常見的算法有以下
RR: round robin、WRR: weighted 輪詢 、加權輪詢實現了起點公平。新的鏈接請求被輪流分配至各RealServer算法的優勢是其簡潔性它無需記錄當前全部鏈接的狀態因此它是一種無狀態調度。輪叫調度算法假設全部服務器處理性能均相同無論服務器的當前鏈接數和響應速度。該算法相對簡單不適用於服務器組中處理性能不一的狀況並且當請求服務時間變化比較大時輪叫調度算法容易致使服務器間的負載不平衡
SHSource Hash 源地址hash,目的是session保持。意義來源於同一源地址的CIP請求會被定向到同一RS。它根據請求的源IP地址做爲散列鍵Hash Key從靜態分配的散列表找出對應的服務器若該服務器是可用的且未超載將請求發送到該服務器不然返回空。它採用的散列函數與目標地址散列調度算法的相同。除了將請求的目標IP地址換成請求的源IP地址外它的算法流程與目標地址散列調度算法的基本類似。在實際應用中源地址散列調度和目標地址散列調度能夠結合使用在防火牆集羣中它們能夠保證整個系統的惟一出入口。
DH: Destination Hash 目標地址Hash。是針對目標IP地址的負載均衡但它是一種靜態映射算法經過一個散列Hash函數將一個目標IP地址映射到一臺服務器。目標地址散列調度算法先根據請求的目標IP地址做爲散列鍵Hash Key從靜態分配的散列表找出對應的服務器若該服務器是可用的且未超載將請求發送到該服務器不然返回空。
LC: Least Connection 最少鏈接 如何監控通常狀況是根據tcp協議的計數等相關信息判斷
Overhead = Active * 256 + Inactive 表示負載狀況越小說明負載越小,會優先選擇
WLC: weigthed
Overhead = (Active * 256 + Inactive)/weight 默認機制
SED: shortest expection dalay 最短時間望鏈接
Overhead = (Actived + 1)/weight目的是爲了讓權重大的優先匹配。問題權重小的可能一直空的。
NQ: Never Quene 工做機制是先每個 Real Server 都請求一次。
LBLC: locality-based Least connection
LBLCR: Replicated LBLC,帶複製的LBLC
工做模型能夠這麼理解就是 LB 的Real Server接收到報文到底以哪一種方式響應給客戶端。lvs原生態支持的類型有NAT網絡地址轉換、DR直接路由、TUN隧道。
nat特色
一、RS使用私有地址網關爲DIP
二、請求和響應都要通過direstor高負載時可能出現單點故障
三、支持端口映射PNAT意思是director 和 real sever 的服務端口能夠不在同一端口。
四、RS可使用任何操做系統
DR特色
一、要保證前端路由將目標地址爲VIP的報文通通發往Direstory,而不是RS
1) 靜態地址綁定在前端路由器上配置一條靜態ARP地址解析將vip地址和DIP的MAC地址綁定。
2arptables 在realserver主機上設置arp解析規則只要收到vip地址的arp解析就不進行解析
3)修改RS的內核參數修改內核參數arp_ignore arp_announce實現比解析vip的mac地址
此時還要在 Real Server 添加一條靜態路由來實現響應報文的源地址是vip
二、RS可使用私有地址也可使用公網地址
三、RS跟Directory必須在同一物理網絡中。
四、請求報文通過Directory,但響應報文必須不通過Directory.
五、不支持端口映射
六、RS可使常見的OS支持arptables
七、RS的網關不會指向DIP
TUN特色IP隧道 將IP首部經過IP首部隧道傳送
一、rip,vip,dip所有是公網地址
二、rs的網關不會指向DIP
三、不支持端口映射
四、請求報文通過Directory,但響應報文必須不通過Directory。
五、各個real server 必須支持隧道
補充隨着互聯網的出現了lvs的第四種模型。
FullNat模型是基於NAT模型的擴展可實現局域網內能夠有子網的狀況。實現方式同時修改請求報文的源地址和目標地址。
NAT的優勢1)能夠隱藏內部rip地址安全2)配置簡單
ipvsadm是配置ipvs規則的工具和iptables相似。
經常使用的用法
# 一、添加集羣 ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] \ [--pe persistence_engine] -A 添加集羣 -E 修改集羣 -t tcp 協議 -u udpx協議 -f 防火牆標記 service-address:指的是vip的地址 -s 指明調度算法默認是wlc # 二、刪除一個集羣服務 ipvsadm -D -t|u|f service-address # 三、清空全部的規則 ipvsadm -C # 四、導入ipvs規則至關於ipvsadm-restore ipvsadm -R # 五、保存ipvs規則等價於 ipvsadm-save ipvsadm -S [-n] #六、將real server 加入到定義好的集羣服務中去 ipvsadm -a|e -t|u|f service-address -r server-address [options] -a -e 添加、修改real server到指定的集羣中 -r 指定 real server 的IP地址 # 七、刪除集羣中的指定的real sever ipvsadm -d -t|u|f service-address -r server-address # 八、查看配置好的 ipvs 規則常與 -n 一塊兒使用 ipvsadm -L|l [options]
常與的option的有
--gatewaying -g DR模型也是默認的lvs類型gatewaying --ipip -i TUN模型 ipip encapsulation (tunneling) --masquerading -mNAT模型 masquerading (NAT) -w 指明權重
藉助netfilter的mangle將做爲集羣服務的請求報文打標記在PREROUTING鏈上完成。這樣作的目的後者說是好處是隻要是防火牆標記相同的就能夠認爲同一集羣服務。例如在訪問web服務時有用http協議的也有用https協議的此時就須要在director處定義2個集羣服務這樣能夠實現功能。可是管理起來不方便防火牆標記就能夠解決這樣的困擾。
具體作法(例如將http 和 https 服務定義成統一的集羣服務)
1)iptables -t mangle -A PREROUTING -d {vip} -p tcp -m mulitport --dports 80 -j MARK --set-mark 10
2)基於mark定義集羣服務
ipvsadm -A -f 10 -s rr
ipvsadm -a -f 10 -r {rip} -g -w 1
常見的持久鏈接類型
PCC:持久客戶端鏈接
在基於tcp或udp定義集羣服務時其端口爲0。表示未來自客戶端的全部請求都轉發到後端的RS。基於客戶端持久鏈接時來自同一個client的全部請求都被轉發到同一RS.
示例ipvsadm -A -t vip:0 -p 60 -p指定持久鏈接的時間
PPC:持久端口鏈接
僅針對某一特定的服務啓用的持久服務。單服務調度各個集羣分開調度。
示例ipvsadm -A -t vip:80 -s rr -p 60
PFM:持久防火牆標記
持久防火牆標記單服務調度。能夠經過防火牆標記來定義一個集羣的多個端口。
示例ipvsadm -A -f 10 -p 60
實驗原理以下實驗實現的目標是實現經過訪問Director實現Discuz的訪問。真正實現的discuz服務地後端的Real Sever從而實現負載均衡的效果。此時就必需要有單獨的文件服務器和數據庫服務器分別來存儲像圖片等的非結構數據和像帳號、密碼等的結構化數據。
環境
操做系統CentOS 6.5 安裝在VMware虛擬機上
配置步驟
在172.16.10.16
1、配置NFS服務器 # 一、安裝客戶端軟件 yum install -y nfs-utils # 二、提供共享目錄 mkdir /data setfacl -m u:48:rwx /data -R (id爲48的用戶是rpm方式安裝httpd時的apache用戶) # vim /etc/exports /data/ 172.16.0.0/24(rw) # 三、啓動服務 /etc/init.d/nfs start # 之後使用 exports -ar 2、安裝mysql #一、安裝mysql軟件這裏使用rpm安裝 yum install mysql mysql-sever -y # 二、初始化數據庫這裏再也不詳細說明 # 三、受權用戶 mysql> CREATE DATABASE discuz; mysql> GRANT ALL ON discuz.* TO discuz@'172.16.%.%' IDENTIFIED BY '123456';
在172.16.10.22
1、配置ip地址和網關信息 # 臨時配置 ifconfig eth0 172.16.10.22/16 up route add default gw 172.16.10.9 # 也可以使用永久配置以下
2、部署discuz服務 # 一、安裝軟件 yum install httpd php php-mysql # 二、掛載NFS服務 mount -t nfs 172.16.10.16:/data /var/www/html # 解壓 discuz 源代碼將解壓後的upload目錄複製到此目錄 cp upload /var/www/html -r # 修改屬主屬組 chown apache.apache /var/www/html/upload -R # 三、安裝discuz # 不在詳述安裝時須要注意編碼問題和數據庫鏈接時的問題。其餘可根據提示解決。
在172.16.10.33
在172.16.10.33可參照172.16.10.22步驟可完成。
在Director 上172.16.10.9 192.168.1.66
# 配置ipvs規則 ipvsadm -A -t 192.168.1.66:80 -s rr ipvsadm -a -t 192.168.1.66:80 -r 172.16.10.22:80 -m -w 1 ipvsadm -a -t 192.168.1.66:80 -r 172.16.10.33:80 -m -w 1
注意real sever和director的172.16.10.9屬於同一局域網中在VMware中可使用以下方式配置
配置完成驗證結果
實驗原理圖以下實現的目標是web服務。
解釋
arp_announce:如何通告本地地址
0表示有arp請求時會通告本機全部網卡的mac地址。 默認
2 表示僅經過網絡直連的接口的地址
arp_ignore:表示如何響應接收到的arp請求
0 表示請求的地址能夠經過其餘網卡響應 默認。
1 表示僅在請求的地址必須在請求報文接口進行響應
在172.16.10.33中
ifconfig eth0 172.16.10.22/16 up # 這個也能夠寫到配置文件 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/lo/arp_announce echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce ifconfig lo:0 172.16.10.20 netmask 255.255.255.255 broadcast 172.16.10.20 route add -host 172.16.10.20 dev lo:0
在172.16.10.22中
此配置可參照172.16.10.33配置配置基本相同
在Director172.16.10.9 172.16.10.20中
ipvsadm -A -t 172.16.10.20:80 -s rr ipvsadm -a -t 172.16.10.20:80 -r 172.16.10.22:80 -g -w 1 ipvsadm -a -t 172.16.10.20:80 -r 172.16.10.33:80 -g -w 1
實驗結果
實驗拓撲圖以下,實驗實現的目的是:使用防火牆標記實現將80和443端口實現持久鏈接。
在192.168.1.201上
一、提供IP地址和網關
二、安裝軟件
httpd軟件和mod_ssl軟件
三、提供測試頁面和ssl證書
編輯/etc/httpd/conf.d/ssl.conf
四、啓動服務便可
在192.168.1.202上
在192.168.1.202上的配置於192.168.1.201相似ip地址和測試頁面不一樣。
在192.168.1.50172.16.0.50上
iptables -t mangle -A PREROUTING -d 172.16.0.50 -p tcp -m multiport \ --dports 80,443 -j MARK --set-mark 10 ipvsadm -A -j 10 -s rr ipvsadm -a -f 10 -r 192.168.1.201 -m ipvsadm -a -f 10 -r 192.168.1.202 -m
補充說明
如何得到證書能夠參照http://guoting.blog.51cto.com/8886857/1535032。這裏說明一點的是RealServer1和RealServer2使用相同的證書。
結果說明
此時只須要修改ipvs的規則以下
ipvsadm -A -f 10 -s rr -p 60 ipvsadm -a -f 10 -r 192.168.1.201 -m -w 1 ipvsadm -a -f 10 -r 192.168.1.202 -m -w 1
此時在訪問到一個RealServer時會話會保持一段時間結果以下
至此全部配置完成。