1/34
LVS集羣
如何提升服務器性能?
1、增加服務器硬件如CPU、內存或換配置更高的服務器來提升單機的性能
很快會達到瓶頸, 而且成本和性能不成正比
2、應用分離
主機A(Apache) + 主機B(MySQL)
依然會達到瓶頸
3、採用集羣技術
LB Load Balancing 負載均衡
HA High Availability 高可用
HPC High Performance Computing 高性能計算
分佈式集羣
整個提供一個唯一的訪問入口,對最終用戶透明!!!
============================================
HA 又稱雙機 Active/Standby,即一個提供服務,另一個保持等待狀態,至少兩臺服務器;
LB 是負載均衡,即兩個服務器同時提供相同的服務,並分擔壓力,但是至少三臺服務器;
HPC 簡單的說,高性能計算(High-Performance Computing)是計算機科學的一個分支,它
致力於開發超級計算機,研究並行算法和開發相關軟件。高性能集羣主
要用於處理複雜
的計算問題,應用在需要大規模科學計算的環境中,如天氣預報、石油
勘探與油藏模擬、
分子模擬、基因測序等。高性能集羣上運行的應用程序一般使用並行
算法,把一個大的
普通問題根據一定的規則分爲許多小的子問題,在集羣內的不同節點上
進行計算,而這
些小問題的處理結果,經過處理可合併爲原問題的最終結果。由於這些
小問題的計算一
般是可以並行完成的,從而可以縮短問題的處理時間。
HA集羣
1.keepalived 基於vrrp協議,常用於實現前端代理的高可用, 輕量級, 不需要共享存儲
2.corosync+pacemaker 實現的是Service的高可用, 需要共享存儲, 一般用於多個節點
3.Heartbeat 是基於主機或網絡的服務的高可用方式, 不常用
LB集羣
A.硬件: F5 BIG-IP 性能好,成本高
B.軟件: LVS Nginx Haproxy
LB集羣
三大主流軟件負載均衡器對比(LVS --- Nginx --- Haproxy)
2/34
LVS:由中國的章文嵩博士開發,他就職於阿里巴巴集團。
1、抗負載能力強。抗負載能力強、性能高,能達到F5硬件的60%;對內存和cpu資源消耗比較低
2、工作在網絡4層(傳輸層),通過vrrp協議轉發(僅作分發之用),具體的流量由linux內核處理,因此沒有流
量的產生。
3、穩定性、可靠性好,自身有完美的熱備方案;(如:LVS+Keepalived)
4、應用範圍比較廣,可以對所有應用做負載均衡;因爲他是通過修改網絡數據包中的端口號、IP地址來
實現負載均衡的,跟上層應用無直接關係。
5、不支持正則處理,不能做動靜分離。(只有應用層(即七層)的負載均衡才支持正則處理)
6、支持負載均衡算法:rr(輪循、輪詢)、wrr(帶權輪循)、lc(最小連接)、wlc(權重最小連接)
7、配置複雜,對網絡依賴比較大,穩定性很高。[這裏說的配置複雜是跟nginx的負載均衡來做對比]
LVS是通過修改數據包中的端口號、IP地址、MAC地址來實現負載均衡。
高可用(HA:High Availability):高度可用,通常是指服務器集羣中有主(master)、備(backup)關係,當主出
現主故障,自動會由備(backup)來接管任務。
Ngnix:
1、工作在網絡的7層之上,可以針對http應用做一些分流的策略,比如針對域名(server_name)、目錄結
構(用location、rewrite功能來實現);
2、Nginx對網絡的依賴比較小,理論上nginx負載均衡器能ping通後端的真實web服務器就能進行負載功
能;
3、Nginx安裝和配置比較簡單,測試起來比較方便;
4、也可以承擔高的負載壓力且穩定,一般能支撐超過1萬次(C10K)的併發;
5、對後端服務器的健康檢查,只支持通過端口來檢測,不支持通過url來檢測。
6、Nginx對請求的異步處理可以幫助節點服務器減輕負載;
7、Nginx僅能支持http、https和Email協議,這樣就在適用範圍較小。
8、不支持Session的直接保持,但能通過ip_hash來解決。
9、支持負載均衡算法:Round-robin(輪循),Weight-round-robin(帶權輪循),Ip-hash(Ip哈希)
10、Nginx還能做Web服務器即Cache功能。
HAProxy:
1、支持兩種代理模式:TCP(四層)和HTTP(七層),支持虛擬主機;
2、能夠補充Nginx的一些缺點比如Session的保持,Cookie的引導等工作
3、支持url檢測後端的服務器出問題的檢測會有很好的幫助。
4、更多的負載均衡策略比如:動態加權輪循(Dynamic Round Robin),加權源地址哈希(Weighted
Source Hash),加權URL哈希和加權參數哈希(Weighted Parameter Hash)已經實現
5、單純從效率上來講HAProxy更會比Nginx有更出色的負載均衡速度。
6、HAProxy可以對Mysql進行負載均衡,對後端的DB節點進行檢測和負載均衡。
7、支持負載均衡算法:Round-robin(輪循)、Weight-round-robin(帶權輪循)、source(原地址保持)、
RI(請求URL)、rdp-cookie(根據cookie)
8、不能做Web服務器和Cache。
Cookie功能:是由web瀏覽器提供的功能,主要用來記錄用戶在網頁界面表單中輸入的用戶名、密碼等信
息。可以讓用戶在下次訪問網站時不用輸入用戶名和密碼。
1.cookie數據存放在客戶的瀏覽器上,session數據放在服務器上
2.cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,如果主要考慮到安全應當使
用session
3.session會在一定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能,如果主要考慮到減
輕服務器性能方面,應當使用COOKIE
4.單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能3K。
3/34
5.將登陸信息等重要信息存放爲SESSION;其他信息如果需要保留,可以放在COOKIE中
Cache的工作原理是保存CPU最常用數據當Cache中保存着CPU要讀寫的數據時CPU直接訪問Cache。由於
Cache的速度與CPU相當CPU就能在零等待狀態下迅速地實現數據存取,Cache由標記存儲器和數據存儲器
兩個基本部分組成,作用是解決系統中數據讀寫速度不匹配的問題,cache規模小訪問速度快,Cache可以高
效地完成DRAM內存和CPU之間的速度匹配。
緩衝寄存器又稱緩衝器,它分輸入緩衝器和輸出緩衝器兩種。前者的作用是將外設送來的數據暫時存放,
以便處理器將它取走;後者的作用是用來暫時存放處理器送往外設的數據。有了數控緩衝器,就可以使高
速工作的CPU與慢速工作的外設起協調和緩衝作用,實現數據傳送的同步。由於緩衝器接在數據總線上,
故必須具有三態輸出功能
buffer功能有添加功能,刪除功能,替換功能,反轉功能
三大主流軟件負載均衡器適用業務場景:
1、網站建設初期,可以選用Nginx/HAproxy作爲反向代理負載均衡(或者流量不大都可以不選用負載均衡
),因爲其配置簡單,性能也能滿足一般的業務場景。如果考慮到負載均衡器是有單點問題,可以採用Nginx
+Keepalived/HAproxy+Keepalived避免負載均衡器自身的單點問題。
2、網站並發達到一定程度之後,爲了提高穩定性和轉發效率,可以使用LVS、畢竟LVS比Nginx/HAproxy
要更穩定,轉發效率也更高。不過維護LVS對維護人員的要求也會更高,投入成本也更大。
注:Nginx與Haproxy比較:Nginx支持七層,用戶量最大,穩定性比較可靠。Haproxy支持四層和七層,支持
更多的負載均衡算法,支持session保存等。具體選型看使用場景,目前來說Haproxy由於彌補了一些Nginx的
缺點用戶量也不斷在提升。
衡量一個負載均衡服務器主要考量三個指標:
1) session rate(會話率)
此項指標非常重要,它決定了一個Load Balancer (負載均衡器)能不能分發所有接受的請求。這項指標
通常是由CPU性能決定。測量指標的大小跟傳輸的每個對象的大小有關,通常用空對象來測試,Session
rates 在 100,000 sessions/s 左右,使用 Xeon E5 在 2014測試。
2) session concurrency(會話併發)
該指標與前一指標相關聯。這一指標與服務器內存和系統可以處理的文件描述符(FD:file description)
數量有關。 通常每個session佔用34KB,即大概3W個session佔用1GB內存空間,實際上,socket buffer(套接
字緩衝器)也會佔用內存空間,2W個session socket佔用1GB內存。
3) data forwarding rate(數據轉發率)
這一指標與 session rate 相對立,它的衡量單位通常是 Megabytes/s (MB/s), 或者 Gigabits/s
(Gbps)。傳輸較大的對象有利於該指標的提升,因爲較大的對象傳輸可以減少session建立和關閉浪費的時
間。而測量session rate 則在傳輸小對象時有利於指標提升。haproxy 在2014年使用 Xeon E5 測試成績爲
40 Gbps。
LVS工作原理及流程
首先向章文嵩先生致敬
Linux Virtual Server,也就是Linux虛擬服務器,,稱LVS
一、LVS 概述
LVS是Linux內核的一部分,因此性能高
Linux虛擬服務器(即分發器或調度器director):
它不真正提供服務,但它接受客戶的訪問,爲整個集羣提供一個唯一的入口。虛擬服務器再和
真實服務器通信。
4/34
真實服務器(Real Server):
它真正提供服務,集羣中每個Real Server可以是一臺物理主機,也可以是虛擬機。
LVS相關術語(必記):
DS(或DR) :Director Server調度服務器。指的是前端負載均衡器節點。(相當於餐廳服務員)
RS :Real Server。後端真實的工作服務器。(相當於餐廳的廚師)
VIP:Virtual IP虛擬IP,是指向外部直接面向用戶請求,作爲用戶請求的目標的IP地址。(外網IP地址
)(相當於餐廳服務員的左手)
DIP:Director Server IP調度服務器IP,主要用於和內部主機通訊的IP地址。(內網IP地址)(相當於餐
廳服務員的右手)
RIP:Real Server IP,後端服務器的IP地址。
CIP:Client IP,客戶端的IP地址。
注意:LVS調度器需要有兩塊網卡,一塊是對外(WAN口)的網卡,一塊是對內(LAN口)的網卡。
客人到餐廳吃飯的點餐流程:
食客(Client)--->[網卡1:VIP]服務員(DS/DR)[網卡2:DIP]--->後廚的廚師(RS)
二、LVS三種模式
VS/NAT: 網絡地址轉換模式, 進站/出站的數據流量經過分發器。NAT模式是通過修改客
戶請求數據包中的端口號、IP地址來實現負載均衡。
VS/DR : 直接路由模式,只有進站的數據流量經過分發器(數據鏈路層負載均衡,因爲他修改的是
目的mac地址)
VS/TUN: 隧道模式,只有進站的數據流量經過分發器
full-nat :
三、LVS/NAT基本工作原理
LVS的工作過程原理(必須理解記憶):
- 當用戶向負載均衡調度器(Director Server)發起請求,調度器將請求發往至linux的內核(kernel)空間
- PREROUTING鏈(路由前)首先會接收到用戶請求,判斷目標IP確定是本機IP,將數據包發往INPUT鏈
- IPVS(ip virtual service)是工作在INPUT鏈上的,當用戶請求到達INPUT時,IPVS會將用戶請求和自己
已定義好的集羣服務(即LVS上用ipvsadm命令定義的負載均衡列表)進行比對,如果用戶請求的就是定義的集
羣服務,那麼此時IPVS會強行修改數據包裏的目標IP地址及端口,並將新的數據包發往POSTROUTING鏈(路
由後)
5/34 - POSTROUTING鏈接收數據包後發現目標IP地址剛好是自己的後端服務器,那麼此時通過選路(即路由
選擇),將數據包最終發送給後端的服務器
四、LVS 三種工作模式原理以及優缺點比較
1、NAT模式(VS-NAT)
原理:就是把客戶端發來的數據包的IP頭的目的地址,在負載均衡器上換成其中一臺RS的IP地址,併發至
此RS來處理,RS處理完成後把數據交給經過負載均衡器,負載均衡器再把數據包的原IP地址改爲自己的IP,將
目的地址改爲客戶端IP地址即可。期間,無論是進來的流量,還是出去的流量,都必須經過負載均衡器。
優點:集羣中的物理服務器可以使用任何支持TCP/IP操作系統,只有負載均衡器需要一個合法的IP地
址。
缺點:擴展性有限。當服務器節點(普通PC服務器)增長過多時,負載均衡器將成爲整個系統的瓶頸,因爲
所有的請求包和應答包的流向都經過負載均衡器。當服務器節點過多時,大量的數據包都交匯在負載均衡器
那,速度就會變慢!
2、直接路由模式(VS-DR)
原理:負載均衡器和RS都使用同一個IP對外服務。但只有DR對ARP請求進行響應,所有RS對本身這個IP的
ARP請求保持靜默。也就是說,網關會把對這個服務IP的請求全部定向給DR,而DR收到數據包後根據調度算
法,找出對應的RS,把目的MAC地址改爲RS的MAC(因爲IP一致)並將請求分發給這臺RS。這時RS收到這個數據
包,處理完成之後,由於IP一致,可以直接將數據返給客戶,則等於直接從客戶端收到這個數據包無異,處理後直
接返回給客戶端。由於負載均衡器要對二層包頭進行改換,所以負載均衡器和RS之間必須在一個廣播域,也可
以簡單的理解爲在同一臺交換機上。
優點:和TUN(隧道模式)一樣,負載均衡器也只是分發請求,應答包通過單獨的路由方法返回給客戶端。
與VS-TUN相比,VS-DR這種實現方式不需要隧道結構,因此可以使用大多數操作系統做爲物理服務器。
缺點:(不能說缺點,只能說是不足)要求負載均衡器的網卡必須與物理網卡在一個物理段上。
3、IP隧道模式(VS-TUN)
原理:首先要知道,互聯網上的大多Internet服務的請求包很短小,而應答包通常很大。那麼隧道模式就
是,把客戶端發來的數據包,封裝一個新的IP頭標記(僅目的IP)發給RS,RS收到後,先把數據包的頭解開,還原
數據包,處理後,直接返回給客戶端,不需要再經過負載均衡器。注意,由於RS需要對負載均衡器發過來的數據
包進行還原,所以說必須支持IPTUNNEL協議。所以,在RS的內核中,必須編譯支持IPTUNNEL這個選項
優點:負載均衡器只負責將請求包分發給後端節點服務器,而RS將應答包直接發給用戶。所以,減少了負
載均衡器的大量數據流動,負載均衡器不再是系統的瓶頸,就能處理很巨大的請求量,這種方式,一臺負載均衡
器能夠爲很多RS進行分發。而且跑在公網上就能進行不同地域的分發。
缺點:隧道模式的RS節點需要合法IP,這種方式需要所有的服務器支持”IP Tunneling”(IP Encapsulation)
協議,服務器可能只侷限在部分Linux系統上。
三種LVS負載均衡技術的特點歸納以下表:
6/34
點擊這裏 點擊這裏 點擊這裏 點擊這裏
VS/NAT VS/TUN VS/DR
服務器操作系統 任意 支持隧道 多數(支持Non-arp)
服務器網絡 私有網絡 局域網/廣域網 局域網
服務器數目(100M網絡) 10~20 100 大於100
服務器網關 負載均衡器 自己的路由 自己的路由
效率 一般 高 最高
LVS命令
查ipvsadm由某個rpm包提供:yum provides ipvsadm
查是否安裝了:rpm -q ipvsadm
安裝:yum install -y ipvsadm
ipvsadm -h 或 man ipvsadm 查命令幫助.man手冊中有EXAMPLE例子
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
Usage:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe
persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
ipvsadm --stop-daemon state
ipvsadm -h
命令選項解釋:[藍字爲常用選項]
-A --add-service 在內核的虛擬服務器表中添加一條新的虛擬服務器記錄。也就是增加一臺新的虛擬服
務器(VIP)。
-E --edit-service 編輯內核虛擬服務器表中的一條虛擬服務器記錄。
-D --delete-service 刪除內核虛擬服務器表中的一條虛擬服務器記錄。
7/34
-C --clear 清除內核虛擬服務器表中的所有記錄。
-R --restore 恢復虛擬服務器規則
-S --save 保存虛擬服務器規則,備份輸出爲-R 選項可讀的格式
-a --add-server 在內核虛擬服務器表的一條記錄裏添加一條新的真實服務器記錄(RIP)。也就是在一個虛
擬服務器中增加一臺新的真實服務器
-e --edit-server 編輯一條虛擬服務器記錄中的某條真實服務器記錄
-d --delete-server 刪除一條虛擬服務器記錄中的某條真實服務器記錄
-L|-l --list 顯示內核虛擬服務器表
-Z --zero 虛擬服務表計數器清零(清空當前的連接數量等)
--set tcp tcpfin udp 設置連接超時值
--start-daemon 啓動同步守護進程。他後面可以是master 或backup,用來說明LVS Router 是master 或
是backup。在這個功能上也可以採用keepalived 的VRRP 功能。
--stop-daemon 停止同步守護進程
-h --help 顯示幫助信息
-p --persistent [timeout] 持久穩固的服務(持久性連接)。這個選項的意思是來自同一個客戶的多次請
求,將被同一臺真實的服務器處理。timeout 的默認值爲360 秒。
-t --tcp-service service-address 說明虛擬服務器提供的是tcp 的服務[vip:port] or [real-server-ip:port]
-f --fwmark-service fwmark 說明是經過iptables 標記過的服務類型。
-u --udp-service service-address 說明虛擬服務器提供的是udp 的服務[vip:port] or [real-serverip:port]
-s --scheduler scheduler 使用的調度算法,有這樣幾個選項 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默認的
調度算法是: wlc.
-M --netmask netmask persistent granularity mask
-r --real-server server-address 真實的服務器[Real-Server:port]
-g --gatewaying 指定LVS 的工作模式爲直接路由模式(也是LVS 默認的模式)
-i --ipip 指定LVS 的工作模式爲隧道模式
-m --masquerading 指定LVS 的工作模式爲NAT 模式
-w --weight weight 真實服務器的權值
--mcast-interface interface 指定組播的同步接口
-c --connection 顯示LVS 目前的連接 如:ipvsadm -L -c
--timeout 顯示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemon 顯示同步守護進程狀態
--stats 顯示統計信息
--rate 顯示速率信息
--sort 對虛擬服務器和真實服務器排序輸出
-n --numeric 輸出IP地址和端口的數字形式
ipvsadm實例:man ipvsadm 查看example 1的實例,複製實例中的命令粘貼後得到的結果
ipvsadm -Ln
ipvsadm -A -t 207.175.44.110:80 -s rr
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.1:80 -m
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.2:80 -m
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.3:80 -m
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.4:80 -m
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.5:80 -m
ipvsadm -Ln 顯示結果如下
8/34
yum install ipvsadm
ipvsadm -A -t 192.168.10.11:80 -s rr
-A --add-service 在內核的虛擬服務器表中添加一條新的虛擬服務器記錄。也就是增加一臺新的虛擬
服務器。
-t --tcp-service service-address 說明虛擬服務器提供的是tcp的服務[vip:port] or [real-serverip:port]
-s --scheduler scheduler 使用的調度算法,有這樣幾個選項 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默
認的調度算法是: wlc.
ipvsadm -a -t 192.168.10.11:80 -r 172.16.10.12:80 -m
-a --add-server 在內核虛擬服務器表的一條記錄裏添加一條新的真實服務器記錄。也就是在一個虛擬
服務器中增加一臺新的真實服務器
-r --real-server server-address 真實的服務器[Real-Server:port]
-m --masquerading 指定LVS 的工作模式爲NAT 模式
ipvsadm -a -t 192.168.10.11:80 -r 172.16.10.13:80 -m
ipvsadm -Ln
ipvsadm -Ln --stats
-L|-l --list 顯示內核虛擬服務器表
-n --numeric 輸出IP 地址和端口的數字形式
--stats 顯示統計信息
保存虛擬服務器表所有記錄:
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.10.11:80 rr
-> 172.16.10.12:80 Masq 1 0 0
-> 172.16.10.13:80 Masq 1 0 0
ipvsadm -Sn > /etc/sysconfig/ipvsadm //保存記錄
ipvsadm -R < /etc/sysconfig/ipvsadm //恢復保存的記錄
注意:ipvsadm 命令配置的LVS集羣列表信息是臨時有效的,如果想系統重啓自動加載這些設置信息,必
須將ipvsadm的操作命令寫入到開機啓動腳本/etc/rc.d/rc.local文件中。
抓包:
#tcpdump -i ens33 tcp and port 80 -v -nn
-i 指定網卡
tcp 抓tcp協議的數據包
port 指定要抓哪個端口的包
-v 顯示詳細信息
-nn 以數字的形式顯示ip和端口
9/34
node11新網卡
練習:給node11虛擬機添加一塊新的nat模式的網卡,然後做如下操作。
給新網卡創建配置文件:
ip a 發現多了一塊名稱爲ens37的新網卡設備
cd /etc/sysconfig/network-scripts
ls
cp -av ifcfg-ens33 ifcfg-ens37
vim ifcfg-ens37 內容如下(紅字爲要修改的內容)
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
DEVICE=ens37 網卡設備名稱
ONBOOT=yes
IPADDR=192.168.10.11
PREFIX=24
GATEWAY=192.168.10.2
DNS1=114.114.114.114
DNS2=8.8.8.8
重啓網絡服務,查看IP地址:
systemctl restart network
ip a 顯示結果中的ens37網卡IP是192.168.10.11,說明新網卡設置OK了
開啓路由轉發:
cat /proc/sys/net/ipv4/ip_forward 查看路由轉發是否開啓,0爲關閉,1爲開啓。
echo 1 > /proc/sys/net/ipv4/ip_forward 臨時開啓路由轉發功能
sysctl -a | grep ip_forward 查內核運行參數
開啓永久路由轉發:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
立即生效:
sysctl -p
cat /proc/sys/net/ipv4/ip_forward
方法一(首選):臨時開啓路由轉發功能,執行如下命令。
cat /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_forward
方法二(備選):臨時開啓路由轉發功能,執行如下命令。
sysctl -a|grep ip_forward
sysctl -w net.ipv4.ip_forward=1
sysctl -a|grep ip_forward
方法三(備選):臨時開啓路由轉發功能,執行如下命令。
首先,vim /etc/sysctl.conf 添加如下內容
10/34
net.ipv4.ip_forward=1
然後,執行sysctl -p讓sysctl.conf配置文件中的設置立即生效。
最後,驗收。sysctl -a|grep ip_forward 或 cat /proc/sys/net/ipv4/ip_forward。
IP負載均衡
LVS本身完全可以說是四層負載均衡,因爲他要用端口
在網絡層通過修改請求目標地址進行負載均衡
用戶請求數據包到達負載均衡服務器後,負載均衡服務器在操作系統內核進程獲取網絡數據包,根據負載均
衡算法計算到一臺真實web服務器,然後將數據目的ip地址修改成這臺真實web的ip,不需通過用戶進程處
理。真實web應用服務器處理完成後,響應數據包回到負載均衡服務器,負載均衡服務器再將數據包源地址
修改爲自身的ip發送給用戶瀏覽器
IP負載均衡在內核進程完成數據分支,較反向代理負載均衡(在應用程序中分發數據)有更好的處理性能。但
是由於所有請求響應都需要經過負載均衡服務器,集羣的最大響應數據吞吐量不得不受制於負載均衡服務器
網卡帶寬,對於提供下載服務或者視頻服務等需要傳輸大量數據的網站而言,難以滿足需求。
能不能讓負載均衡服務器只分發請求,而使響應數據從正式物理服務器直接返回給用戶呢?數據鏈路層負載
均衡
LVS-NAT原理
1). 當用戶請求到達Director Server,,時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文
的源IP爲CIP,目標IP爲VIP
2). PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈
3). IPVS比對數據包請求的服務是否爲集羣服務,若是,修改數據包的目標IP地址爲後端服務器IP,然後將
數據包發至POSTROUTING鏈。 此時報文的源IP爲CIP,目標IP爲RIP
4). POSTROUTING鏈通過選路,將數據包發送給Real Server
5). Real Server比對發現目標爲自己的IP,開始構建響應報文發回給Director Server。 此時報文的源IP爲
RIP,目標IP爲CIP
6). Director Server在響應客戶端前,此時會將源IP地址修改爲自己的VIP地址,然後響應給客戶端。 此時
11/34
報文的源IP爲VIP,目標IP爲CIP
-
LVS-NAT模型的特性
1). RS應該使用私有地址,RS的網關必須指向DIP
2). DIP和RIP必須在同一個網段內
3). 請求和響應報文都需要經過Director Server,高負載場景中,Director Server易成爲性能瓶頸
4). 支持端口映射
5). RS可以使用任意操作系統
6). 缺陷:對Director Server壓力會比較大,請求和響應都需經過director server
VS/NAT模式拓撲:
++++++++++++-
Client + eth0: 192.168.10.1
+++++++++++++++++++++++ VIP eth0網卡: 192.168.11.11
-
Director +
+++++++++++ DIP eth1網卡: 172.16.10.11
_______ ++++++++++++++++ +++++++++++++++
-
Real Server A + + Real Server B +
++++++++++++++++ +++++++++++++++
eth0: 172.16.11.12 eth0: 172.16.11.13
gateway: 172.16.10.11 gateway: 172.16.10.11
VS/NAT模式數據包走向:1.Client------------------>Director
sip: CIP dip: VIP
smac: Client_mac dmac: VIP_mac
2.Director--------------->Real Server
sip: CIP dip: RIP
smac: DIP_mac dmac: RealServer_mac
3.Real Server----------->Director
sip: RIP dip: CIP
smac: RealServer_mac dmac: DIP_mac
4.Director-------->Client
sip: VIP dip: CIP
smac: VIP_mac dmac: Client_mac
=================配置LVS================
Real Server A & Real Server B:
[root@localhost ~]# yum install httpd
[root@localhost ~]# route add default gw 172.16.10.11
Director(LVS調度器):
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
12/34
LVS-NAT(DNAT)負載均衡的網絡拓撲圖:
NAT:網絡地址轉換
DNAT:目標(destination)網絡地址轉換
SNAT:源(source)網絡地址轉換
13/34
LVS-NAT
14/34
15/34
16/34
LVS部署腳本
###編寫lvs_nat.sh腳本
mkdir -pv /sh
17/34
vi /sh/lvs_nat.sh
#!/bin/bash
VIP=192.168.10.11
DIP=192.168.10.11
RIP1=192.168.10.12
RIP2=192.168.10.13
PORT=80
lvs_nat(){
rpm -q ipvsadm && echo "ipvsadm exsits" ||yum install -y ipvsadm &> /dev/null
echo 1 > /proc/sys/net/ipv4/ip_forward
ipvsadm -C
ipvsadm -A -t ${VIP}:${PORT} -s wrr
ipvsadm -a -t ${VIP}:${PORT} -r ${RIP1}:${PORT} -m -w 1
ipvsadm -a -t ${VIP}:${PORT} -r ${RIP2}:${PORT} -m -w 1
ipvsadm -Ln --stats
}
rs_web(){
rpm -q httpd && echo "httpd already installd" || yum install -y httpd curl &> /dev/null
route add default gw $DIP
systemctl restart httpd
systemctl enable httpd
web_ip=$(ifconfig ens33 | awk '/netmask/{print $2}')
echo $web_ip > /var/www/html/index.html
curl $web_ip
}
case $1 in
start)
lvs_nat
ipvsadm --save
;;
stop)
ipvsadm -C
ipvsadm -Ln
;;
rs_web)
rs_web
;;
status)
ipvsadm -ln
;;
*)
echo "usage : $0 [start|stop|status|rs_web]"
;;
esac
###測試腳本的運行
chmod +x /sh/lvs_nat.sh
sh /sh/lvs_nat.sh
數據鏈路層負載均衡
18/34
數據鏈路層負載均衡
顧名思義,數據鏈路層負載均衡是指在通信協議的數據鏈路層修改mac地址進行負載均衡。
這種數據傳輸方式又稱作三角傳輸模式,負載均衡數據分發過程中不修改IP地址,只修改目的mac地址,通
過配置真實物理服務器集羣所有機器虛擬IP和負載均衡服務器IP地址一致,從而達到不修改數據包的源地址
和目的地址就可以進行數據分發的目的,由於實際處理請求的真實物理服務器IP和數據請求目的IP一致,不需
要通過負載均衡服務器進行地址轉換,可將相應數據包直接返回給用戶瀏覽器,避免負載均衡服務器網卡帶
寬成爲瓶頸。這種負載均衡方式又稱作直接路由方式(DR)。
使用三角傳輸模式的鏈路層負載均衡時目前大型網站使用最廣的一種負載均衡手段。在linux平臺上最好
的鏈路層負載均衡開源產品是LVS(linux virtual server)VS/DR原理和特點
-
- LVS/DR模式的原理:
1). 當用戶請求到達Director Server,,時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文
的源IP爲CIP,目標IP爲VIP
2). PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈
3). IPVS比對數據包請求的服務是否爲集羣服務,若是,將請求報文中的源MAC地址修改爲DIP的MAC地
址,將目標MAC地址修改RIP的MAC地址,然後將數據包發至POSTROUTING鏈。 此時的源IP和目的IP均未修
改,僅修改了源MAC地址爲DIP的MAC地址,目標MAC地址爲RIP的MAC地址
4). 由於DS和RS在同一個網絡中,所以是通過二層來傳輸。POSTROUTING鏈檢查目標MAC地址爲RIP的
MAC地址,那麼此時數據包將會發至Real Server。
5). RS發現請求報文的MAC地址是自己的MAC地址,就接收此報文。處理完成之後,將響應報文通過lo接口
傳送給eth0網卡然後向外發出。 此時的源IP地址爲VIP,目標IP爲CIP
6). 響應報文最終送達至客戶端 -
2.LVS-DR模型的特性
1). 保證前端路由將目標地址爲VIP報文統統發給Director Server,而不是RS
2). RS可以使用私有地址;也可以是公網地址,如果使用公網地址,此時可以通過互聯網對RIP進行直接訪
問
3). RS跟Director Server必須在同一個物理網絡中
19/34
4). 所有的請求報文經由Director Server,但響應報文必須不能進過Director Server
5). 不支持地址轉換,也不支持端口映射,因爲DR模型是工作在二層的,二層只處理數據包中的MAC地址
6). RS可以是大多數常見的操作系統
7). RS的網關絕不允許指向DIP(因爲我們不允許他經過director)
8). RS上的lo接口配置VIP的IP地址 - 過程及解決方案:
1). 客戶端要找vip訪問80端口,因爲是在同一個網段,所以發arp廣播找vip的mac地址通信
2). 因爲有RS上也有vip,我們不能直接讓RS上的vip迴應客戶端的廣播,所以設置內核參數arp_ignore的內
容爲1
將arp_ignore 設置爲1,意味着當別人的arp請求過來的時候,如果接收的設備上面沒有這個ip,就不
做出響應.
默認是0,只要這臺機器上面任何一個設備上面有這個ip,就響應arp請求,併發送mac地址
3). 當DR的vip收到這個廣播之後,迴應mac地址,然後得到客戶端發來的80端口請求,再通過lvs分發到一個
RS
4). 那麼DR如何分發到一個RS?
dip發出arp廣播詢問RS的ip地址所對應的mac地址,然後發出一個目標ip爲RS_vip,目標mac爲
RS_eth0_mac的包到RS
5). RS必須要使用vip把迴應包發出去(這樣client收到之後一看源地址是vip,他就會相信這是正確的地址
發來的包)
6). 那麼怎樣讓RS使用lo的vip而不使用eth0?
設置arp_announce文件的內容爲2, 2的意思是使用本機最好的本地IP地址把迴應包發出去
7). 最後怎麼算是最好的本地IP地址?
同一個網段下,使用可變長度子網掩碼最長的IP地址被認爲是好IP,因爲他更精確
VS/DR模式拓撲:
DR:direct routing直接路由。
++++++++++++ +-----------> + Client + eth0 192.168.11.10/24 |
++++++++++++ |
---|---|
++++++++++++ VIP eth0:0 192.168.11.100/24 | |
+ Director + | |
++++++++++++ DIP eth0 192.168.11.11/24 | |
+------------------------ | --------------------------------+ |
++++++++++++++++++ +++++++++++++++++
-
Real Server A + + Real Server B +
++++++++++++++++++ +++++++++++++++++
eth0 192.168.11.12/24 eth0 192.168.11.13/24
lo:0 192.168.11.100/32 lo:0 192.168.11.100/32
VS/DR模式數據包走向:1.Client-------------------------->Director
sip: CIP dip: VIP
smac: Client_mac dmac: VIP_mac
20/34
2.Director---------------------->Real Server
- Director在給Real Server發包前要廣播找Real Server mac *
- sip: DIP dip: RIP *
- smac: DIP_mac dmac: broadcast *
- sip: RIP dip: DIP *
- smac: RealServer_mac dmac: DIP_mac *
sip: CIP dip: VIP
smac: DIP_mac dmac: RealServer_mac
3.Real Server------------------>Client
sip: VIP dip: CIP //這裏的VIP是realserver的lo額外添加
的那個VIP地址
smac: RealServer_mac dmac: Client_mac
LVS-DR
=============VS/DR模式配置====================
Real Server A & Real Server B:
[root@localhost ~]# yum install httpd
[root@localhost ~]# vim lo.sh 腳本內容如下
#!/bin/bash
ifconfig lo:1 192.168.11.100 netmask 255.255.255.255
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ip a
運行腳本(在192.168.11.12上做如下操作):
chmod -v +x lo.sh
. lo.sh
scp lo.sh [email protected]:/root/
ssh [email protected] '. /root/lo.sh' 遠程給192.168.11.13運行lo.sh腳本
Director調度器(node11):
[root@localhost ~]# ifconfig ens33:0 192.168.11.100/24 up 給網卡臨時設置VIP地址
[root@localhost ~]# ip a
[root@localhost ~]# yum install ipvsadm
[root@localhost ~]# ipvsadm -Ln
[root@localhost ~]# ipvsadm -C
[root@localhost ~]# ipvsadm -A -t 192.168.11.100:80 -s wrr
[root@localhost ~]# ipvsadm -at 192.168.11.100:80 -r 192.168.11.12:80 -g -w 1
[root@localhost ~]# ipvsadm -at 192.168.11.100:80 -r 192.168.11.13:80 -g -w 3
[root@localhost ~]# ipvsadm -Ln
[root@localhost ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm 保存ipvsadm配置
[root@localhost ~]# curl 192.168.11.12
21/34
[root@localhost ~]# curl 192.168.11.13
訪問測試(win7/win10上做):
打開mobaxterm軟件,點窗口上的+加號來開啓一個cmd命令行界面,執行5次如下命令,看顯示的網頁信
息有何不同
curl 192.168.11.100
保存:ipvsadm -Sn > /etc/sysconfig/ipvsadm 或 service ipvsadm save (centos 6用service,centos
7不能用)
Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
清空(不做):ipvsadm -C
查看
ipvsadm -Ln
ipvsadm -Ln --stats 顯示連接次數狀態信息
ipvsadm -Ln --rate
實時查看(必做):
watch -n.5 'ipvsadm -Ln -c'
-n.5 是0.5秒刷新一次
-n 5 5秒刷新一次要解決的問題:
1 .兩個http服務器除了有自己的rip以外還要擁有vip
因爲:數據包需從realServer返回 ,realServer返回的數據需要源IP爲VIP
解決:添加 lo接口(本地環路接口) ,lo:1 vip/32.
ifconfig lo:0 192.168.10.100/32 up
2 .當GW(網關)向下廣播vip的時候 要分發器的vip響應 而兩個http的vip不要響應
因爲:realServer的vip有了,接着就是同一個網段中擁有兩個vip, 客戶端在網關發送arp廣播需找vip時需
要讓realServer不接受響應.
解決:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
arp_ignore 設置爲1,意味着當別人的arp請求過來的時候,如果接收的設備沒有這個ip,就不做出響應
(這個ip在lo上,lo接收設備)
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
使用最好的ip來回應,什麼是最好的ip?同一個網段內子網掩碼最長的
抓包:
#tcpdump -i ens33 tcp and port 80 -v -nn
-i 指定網卡
tcp 抓tcp協議的數據包
port 指定要抓哪個端口的包
-v 顯示詳細信息
-nn 以數字的形式顯示ip和端口
22/34
LVS部署腳本
###編寫lvs_nat.sh腳本
mkdir -pv /sh
vi /sh/lvs_dr.sh
#!/bin/bash
VIP=192.168.10.10
DIP=192.168.10.11
RIP1=192.168.10.12
RIP2=192.168.10.13
PORT=80
lvs_dr(){
ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 up
route add -host $VIP dev ens33:0
rpm -q ipvsadm && echo "ipvsadm exsits" ||yum install -y ipvsadm &> /dev/null
echo 1 > /proc/sys/net/ipv4/ip_forward
ipvsadm -C
ipvsadm -A -t ${VIP}:${PORT} -s wrr
ipvsadm -a -t ${VIP}:${PORT} -r ${RIP1}:${PORT} -g -w 1
ipvsadm -a -t ${VIP}:${PORT} -r ${RIP2}:${PORT} -g -w 2
ipvsadm -Ln
}
rs_web(){
ifconfig lo:0 $VIP netmask 255.255.255.255 up
route add -host $VIP dev lo:0
rpm -q httpd && echo "httpd already installd" || yum install -y httpd curl &> /dev/null
systemctl restart httpd
systemctl enable httpd
web_ip=$(ifconfig ens33 | awk '/netmask/{print $2}')
echo $web_ip > /var/www/html/index.html
curl $web_ip
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
}
case $1 in
start)
lvs_dr
ipvsadm --save
;;
stop)
ipvsadm -C
ipvsadm -Ln
;;
rs_web)
rs_web
;;
)
echo "usage : $0 [start|stop|rs_web]"
;;
esac
23/34
###測試腳本的運行
chmod +x /sh/lvs_nat.sh
sh /sh/lvs_nat.sh
HA集羣
0 0
0 0 一、高可用集羣(High Availability Cluster)
集羣(cluster)就是一組計算機,它們作爲一個整體向用戶提供一組網絡資源。每一個單個的計算機系
統都叫集羣節點(node)。隨着業務的增長,集羣通過添加新的節點,滿足資源的高可擴展性。
計算機硬件和軟件易錯性不可避免,這樣在節點上的服務會不可避免的中斷。高可用集羣的出現是爲
保證即使節點失效,而服務能不中斷。
高可用集羣在一組計算機中,採用主備模式,主節點提供服務,備節點等待;一旦,主節點失效,備節點無
需人工的無縫取代主節點提供服務,這樣保證了服務的不中斷。
高可用集羣軟件的主要作用就是實現故障檢查和業務切換的自動化,以提供不中斷的服務。
二、高可用集羣(HA)的衡量標準
高可用性集羣是通過系統的可靠性(reliability)和可維護性(maintainability)來度量的。
通常用平均無故障時間(MTTF)來度量系統的可靠性,用平均維修時間(MTTR)來度量系統的可維護
性。
HA=MTTF/(MTTF+MTTR)100%
HA衡量標準:
◇ 99% 一年宕機時間不超過4天
◇ 99.9% 一年宕機時間不超過10小時
◇ 99.99% 一年宕機時間不超過1小時
◇ 99.999% 一年宕機時間不超過6分鐘
三、高可用集羣的層次結構
24/34
1.信息層(Messaging)
也叫底層基礎架構層,主要用於節點之間傳遞心跳信息,也稱爲心跳層。節點之間傳遞心跳信息可以通
過廣播,組播,單播等方式。
心跳信息:集羣中每一臺服務器都不停的將自己在線的信息通告給集羣中的其他主機。
心跳信息的傳遞是基於套接字通信的,通過軟件提供服務監聽套接字,實現數據發送、請求。必須安裝
軟件,並開啓服務,這是實現高可用集羣的基礎。
2.成員層(Membership)
這層最重要的作用是通過Cluster Consensus Membership Service(CCM)這種服務由Messaging層提供
的信息,來產生一個完整的成員關係。
CCM 組件(Cluster Consensus Menbership Service):承上啓下,監聽底層接受的心跳信息,當監聽不
到心跳信息的時候就重新計算整個集羣的票數和收斂狀態信息,並將結果轉遞給上層,讓上層做出決定採取
怎樣的措施。CCM 還能夠生成一個各節點狀態的拓撲結構概覽圖,以本節點做爲視角,保證該節點在特殊情
況下能夠採取對應的動作。
Messaging & Membership一般由同一軟件實現。
25/34
3.資源分配層(Resource Allocation)
也叫資源管理器層,真正實現集羣服務的層。包含CRM(集羣資源管理器,cluster Resource
Manager),CIB(集羣信息基庫,Cluster Infonation Base),PE(策略引擎,Policy Engine),TE(實施引
擎,Transition Engine), LRM(Local Resource Manager,本地資源管理器)。
CRM組件: 核心組件,實現資源的分配和管理。每個節點上的CRM都維護一個CIB用來定義資源特定
的屬性,哪些資源定義在同一個節點上。主節點上的CRM被選舉爲 DC(Designated Coordinator指定協調員,
主節點掛掉會選出新的DC),成爲管理者,它的工作是決策和管理集羣中的所有資源。
任何DC上會額外運行兩個進程,一個叫PE,;一個叫TE。
PE :定義資源轉移的一整套轉移方式,但只做策略,並不親自來參加資源轉移的過程,而是讓TE來執行
自己的策略。
TE : 就是來執行PE做出的策略的並且只有DC上才運行PE和TE。
CIB組件:XML格式的配置文件,工作的時候常駐內存,只有DC才能對CIB進行修改,其他節點上的複製
DC上的CIB而來。集羣的所有信息都會反饋在CIB中。
LRM組件:是執行CRM傳遞過來的在本地執行某個資源的執行和停止的具體執行人。
資源:
在集羣中構成一個完整服務的每一部分都叫資源,都需要配置和管理。
以web應用爲例:vip是資源,web服務器是資源,存儲也是資源。不同的服務的資源也不盡相同,其中
存儲資源的選擇、配置、管理是高可用集羣中的難點問題。
4.資源代理層(Resource Agents)
集羣資源代理,能夠管理本節點上的屬於集羣資源的某一資源的啓動,停止和狀態信息的腳本,資源代
理分爲:LSB(/etc/init.d/*),OCF(比LSB更專業,更加通用)。
任何資源代理都要使用同一種風格,接收四個參數:{start|stop|restart|status},每個種資源的代理都
要完成這四個參數據的輸出。
工作機制:
PE 根據CIB獲取資源的配置信息(集羣上的所有信息都會收集到DC的CIB,同步到其它節點),而後做出
決策,一旦做得決策就會進行資源的管理。PE藉助於本地的CCM通知給其它節點CIB來實現對某些資源管理
信息的傳遞,比如說通告其它CRM要啓動某一資源了,收到信息後CRM並不負責啓動,轉由 LRM(Local
Resource Manager本地資源管理)啓動,而併發資源又藉助於RA(Resource Agent資源代理)實現資源管
理。
四、高可用集羣軟件
Messaging and Membership Layer(信息與關係層):
• heartbeat (v1,v2,v3)
• corosync
• cman
• keepalived
• ultramokey
Cluster Resource Manager Layer(資源管理層,簡稱:CRM):
• haresource,crm (heartbeat v1/v2)
• pacemaker (heartbeat v3/corosync)
• rgmanager (cman)
常用組合:
• heartbeat v2+haresource(或crm) (一般常用於CentOS 5.X)
• heartbeat v3+pacemaker (一般常用於CentOS 6.X)
• corosync+pacemaker (現在最常用的組合)
• cman + rgmanager (紅帽集羣套件中的組件,還包括gfs2,clvm)
26/34
• keepalived+lvs (常用於lvs的高可用)
五、補充
1.STONITH(Shoot The Other Node in the Head,"爆頭")組件
這種機制直接操作電源開關,控制故障節點的電源開關,通過暫時斷電又上電的方式,使故障節點重啓,
這種方式需要硬件支持。
主節點在某一段時間由於某種原因,沒傳遞心跳信息,這個時候集羣會選取新的DC,重新分配資源提供
服務,如果主節點服務器還沒有宕掉,這樣就會導致服務器分隔、資源爭用,這種情況被稱爲腦裂(brainsplit)。此時,用戶能訪問,一旦有寫的操作,就會導致文件系統崩潰,損失慘重。爲避免這種 情況,新的DC一旦
產生,第一時間對主節點執行stonith,這種操作叫做資源隔離。
2.資源隔離
節點級別:這種就叫STONITH,直接把對方的電源給切斷,一般這種主機都是連接到電源交換機上
的。
資源級別:同樣需要依賴一些硬件設備來完成。比如節點通過光纖交換機連接到共享存儲,通過把需
要踢除出去的節點的光纖接口屏蔽來實現資源隔離。
3.仲裁設備
ping node:兩個節點的模式下,一旦其中一個節點發生故障,發生集羣分隔以後,無法判定哪個節點
不正常,但工作正常的節點一定是可以連到互聯網,故正常的節點是可以跟前端路由通信,所以可以把前端路
27/34
由當成第三個節點,如果可以ping通,那就說明自己是正常的,可以將對方隔離掉。
qdisk: RHCS不是使用ping節點來判斷,而是使用一個共享存儲的設備,節點按照心跳信息頻率每隔一個
信息頻率時間就往磁盤裏寫一個數據位,如果設備每隔一個心跳時間間隔就更新一次數據位,就說明這個設
備處於活動狀態的,可以將對方隔離掉。
keepalive
keepalived
1.Keepalived 定義
Keepalived 是一個基於VRRP協議來實現的LVS服務高可用方案,可以利用其來避免單點故障。一個
LVS服務會有2臺服務器運行Keepalived,一臺爲主服務 器(MASTER),一臺爲備份服務器(BACKUP),但是對
外表現爲一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消 息的時候,即主
服務器宕機的時候, 備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。Keepalived是VRRP
的完美實現,keepalived是集羣管理中保證集羣高可用的一個服務軟件,其功能類似於heartbeat,用來防止單
點故障。
2.keepalived工作原理
keepalived是以VRRP協議爲實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協
議。
keepalived主要有三個模塊,分別是core(核心)、check(檢測)和vrrp(虛擬路由冗餘協議)。core模塊爲
keepalived的核心,負責主進程的啓動、維護以及全局配置文件(keepalived.conf)的加載和解析。check負
責健康檢查,包括常見的各種檢查方式(TCP、腳本檢測進程狀態等)。vrrp模塊是來實現VRRP協議的。
keepalived的常見組合:
keepalived+LVS
keepalived+nginx
keepalived+mysql-proxy
keepalived+mycat
28/34
2.VRRP 協議簡介
虛擬路由冗餘協議,可以認爲是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器
組,這個組裏面有一個master(主)和多個backup(備份),master上面有一個對外提供服務的vip(該路由器所在
局域網內其他機器的默認路由爲該vip),master會發組播(224.?.?.?),當backup收不到vrrp包時就認爲master
宕掉了,這時就需要根據VRRP的優先級(priority)來選舉一個backup當master。這樣的話就可以保證路由器
的高可用了。
在現實的網絡環境中,兩臺需要通信的主機大多數情況下並沒有直接的物理連接。對於這樣的情況,它們之
間路由怎樣選擇?主機如何選定到達目的主機的下一跳路由,這個問題通常的解決方法有二種:
• 在主機上使用動態路由協議(RIP、OSPF等)
• 在主機上配置靜態路由
很明顯,某些環境下在主機上配置動態路由是非常不切實際的,因爲管理、維護成本以及是否支持等諸多問
題。配置靜態路由就變得十分流行,但路由器(或者說默認網關 default gateway)卻經常成爲單點故障。
VRRP的目的就是爲了解決靜態路由單點故障問題,VRRP通過一競選(election)協議來動態的將路由任務 交
給LAN中虛擬路由器中的某臺VRRP路由器。
3.VRRP 工作機制
在一個VRRP虛擬路由器中,有多臺物理的VRRP路由器,但是這多臺的物理的機器並不能同時工作,而
是由一臺稱爲MASTER的負責路由工作,其它的 都是BACKUP,MASTER並非一成不變,VRRP讓每個VRRP路由
器參與競選,最終獲勝的就是MASTER。MASTER擁有一些特權,比如,擁 有虛擬路由器的IP地址,我們的主機
就是用這個IP地址作爲靜態路由的。擁有特權的MASTER要負責轉發發送給網關地址的包和響應ARP請求。
VRRP通過競選協議來實現虛擬路由器的功能,所有的協議報文都是通過IP多播(multicast)包(多播地
址224.0.0.18)形式發送的。 虛擬路由器由VRID(範圍0-255)和一組IP地址組成,對外表現爲一個周知的
MAC地址。所以,在一個虛擬路由器中,不管誰是MASTER,對外都是相同的MAC和IP(稱之爲VIP)。客戶端主
29/34
機並不需要因爲MASTER的改變而修改自己的路由配置,對客戶端來 說,這種主從的切換是透明的。
在一個虛擬路由器中,只有作爲MASTER的VRRP路由器會一直髮送VRRP通告信息(VRRP
Advertisement message),BACKUP不會搶佔MASTER,除非它的優先級(priority)更高。當MASTER不可用時
(BACKUP收不到通告信 息), 多臺BACKUP中優先級最高的這臺會被搶佔爲MASTER。這種搶佔是非常快速
的(<1s),以保證服務的連續性。由於安全性考慮,VRRP包使 用了加密協議進行加密。
4.VRRP 工作流程
(1).初始化:
路 由器啓動時,如果路由器的優先級是255(最高優先級,路由器擁有路由器地址),要發送VRRP通告信息,並
發送廣播ARP信息通告路由器IP地址對應的 MAC地址爲路由虛擬MAC,設置通告信息定時器準備定時發送
VRRP通告信息,轉爲MASTER狀態;否則進入BACKUP狀態,設置定時器檢查定時檢 查是否收到MASTER的
通告信息。
(2).Master
• 設置定時通告定時器;
• 用VRRP虛擬MAC地址響應路由器IP地址的ARP請求;
• 轉發目的MAC是VRRP虛擬MAC的數據包;
• 如果是虛擬路由器IP的擁有者,將接受目的地址是虛擬路由器IP的數據包,否則丟棄;
• 當收到shutdown的事件時刪除定時通告定時器,發送優先權級爲0的通告包,轉初始化狀態;
• 如果定時通告定時器超時時,發送VRRP通告信息;
• 收到VRRP通告信息時,如果優先權爲0,發送VRRP通告信息;否則判斷數據的優先級是否高於本機,或相等
而且實際IP地址大於本地實際IP,設置定時通告定時器,復位主機超時定時器,轉BACKUP狀態;否則的話,丟
棄該通告包;
(3).Backup
• 設置主機超時定時器;
• 不能響應針對虛擬路由器IP的ARP請求信息;
• 丟棄所有目的MAC地址是虛擬路由器MAC地址的數據包;
• 不接受目的是虛擬路由器IP的所有數據包;
• 當收到shutdown的事件時刪除主機超時定時器,轉初始化狀態;
• 主機超時定時器超時的時候,發送VRRP通告信息,廣播ARP地址信息,轉MASTER狀態;
• 收到VRRP通告信息時,如果優先權爲0,表示進入MASTER選舉;否則判斷數據的優先級是否高於本機,如果
高的話承認MASTER有效,復位主機超時定時器;否則的話,丟棄該通告包;
5.ARP查詢處理
當內部主機通過ARP查詢虛擬路由器IP地址對應的MAC地址時,MASTER路由器回覆的MAC地址爲虛
擬的VRRP的MAC地址,而不是實際網卡的 MAC地址,這樣在路由器切換時讓內網機器覺察不到;而在路由
器重新啓動時,不能主動發送本機網卡的實際MAC地址。如果虛擬路由器開啓的ARP代理 (proxy_arp)功能,
代理的ARP迴應也迴應VRRP虛擬MAC地址
keepalived+LVS/DR
30/34
keepalive的詳解(必看):http://outofmemory.cn/wiki/keepalived-configuration
keepalived.conf配置文件可以通過man keepalived.conf來查看官方解釋
keepalived+LVS-DR模式拓撲
軟件功能說明:
keepalived:實現中間件(代理服務器的高可用)。
LVS:是中間件軟件(即代理服務器軟件),是用來實現集羣的負載均衡。
+++++++++
+---------------------------> + Client + 192.168.11.1 win7/10
| +++++++++
| ____|
| | VIP eth0:1 192.168.10.100 |
| +++++++++++++++++++++ ++++++++++++++++++++
-
+ Director master主 node11 + + Director backup備 node12 + +++++++++++++++++++++ +++++++++++++++++++++ DIP 192.168.11.11 ens33網卡 DIP 192.168.11.12 ens33網卡 ____ _____ ____ +++++++++++++++++ ++++++++++++++++++ +--------+ RealServer A node13 + + Real Server B node14 +
+++++++++++++++++ ++++++++++++++++++
192.168.11.13/24 192.168.11.14/24
分別在Director master、Director backup 上部署浮動資源(VIP IPVS策略)
測試2個Director在DR模式下都工作正常。測試完成後都撤掉浮動資源。
首先:在node11、node12上分別安裝keepalived和ipvsadm軟件包,並做keepalived相關配置。
在Director master上安裝配置Keepalivedyum install keepalived ipvsadm -y
cp -av /etc/keepalived/keepalived.conf{,.bak} 備份原始配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { 全局定義,說明:在實驗測試環境中,以下內容可以隨便寫,但是master和
backup的router_id必須相同
notification_email { 設置通知郵箱
root@localhost 管理員的郵箱地址
}
notification_email_from keepalived@localhost 通知郵件的發件人郵箱
smtp_server 127.0.0.1 郵箱服務器IP地址
smtp_connect_timeout 30 郵件服務器連接超時時間爲30秒
router_id dr1 路由器ID名稱,同一個keepalived高可用集羣中master和backup的ID名稱必
須相同
}
vrrp_instance VI_1 { vrrp虛擬路由冗餘協議的實例設置 ,實例名稱爲VI_1
state MASTER 狀態,主爲MASTER,備爲BACKUP狀態
31/34
interface ens33 //心跳檢測網卡接口,要根據實際情況寫網卡接口名,用
ip a查網卡接口名
virtual_router_id 51 //master主和backup備兩邊必須一樣,此處是集羣的羣號
priority 100 //優先級,MASTER的值必須高於BACKUP的值,類似於現實生活
中的競選的票數
advert_int 1 //檢查間隔,單位秒。vrrp的組播地址是224.0.0.18
authentication { 身份認證配置
auth_type PASS //認證類型爲密碼方式,主備要一致
auth_pass 1111 //認證密碼爲1111,主備要一致
}
virtual_ipaddress {
192.168.11.100 //VIP,可多個IP,每行一個IP地址
192.168.11.111
}
}
virtual_server 192.168.11.100 80 { //LVS 配置(即調度器的配置),此行等同於ipvsadm -
At 192.168.11.100:80 -s wrr命令
delay_loop 3 //服務論詢的時間間隔
lb_algo rr //LVS 調度算法
lb_kind DR // LVS 集羣模式
protocol TCP //指定協議爲TCP協議
real_server 192.168.11.13 80 { //RS後端真實服務器的IP及端口號,等同於ipvsadm -at
192.168.11.100:80 -r 192.168.11.13:80 -g -w 1命令
weight 1
TCP_CHECK { //RS健康檢查,如果RS主機上的80端口業務異常關閉了,用ipvsadm -
Ln查不到此RS的IP信息
connect_timeout 3 //連接超時時間爲3秒
}
}
real_server 192.168.11.14 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}cd /etc/keepalived
scp keepalived.conf 192.168.11.12:/etc/keepalived/ 將配置文件發送給node12的主機
拷貝後,修改配置文件
state BACKUP
priority 90
兩個Director(調度器)上啓動服務,並查看vip地址:systemctl restart keepalived [centos 7專用命令]
service keepalived restart [centos 6和7通用命令]
ip a 在master上可以看到ens33網卡有192.168.11.100和192.168.11.111這兩個VIP地址。而
backup備主機上是沒有VIP的。當在master上用systemctl stop keepalived後,備主機上就會有這兩個
VIP。ipvsadm -Ln 查ipvs的集羣配置信息
32/34
抓包:
yum install -y tcpdump
tcpdump -i ens33 -nv vrrp
-i 指定網卡
-n 以數字的方式顯示(ip,port)
-v 顯示詳細信息
-vv 顯示更詳細的信息
-w 保存到文件
----
keepalived通過vrrp協議進行組播的作用:
是爲了競選出由哪臺keepalived主機接管業務(使用VIP的)。誰的priority優先級高(即票數多),誰就有
VIP地址。
當master和backup都在運行keepalived服務時:
node11(master)發送的組播信息:
src:192.168.11.11
dest:224.0.0.18
node12(backup)接收的組播信息:
src:192.168.11.11
dest:224.0.0.18
----
當node11這臺master停止了keepalived服務:
node12發送的組播信息:
src:192.168.11.12
dest:224.0.0.18
keepalived集羣中其他主機接收的組播信息:
src:192.168.11.12
dest:224.0.0.18
keepalived+script
通過腳本的執行結果來提高或降低自身的優先級完成VIP的切換(即master和backup之間的切換)
keepalived+nginx的代理功能
準備工作:在node11和node12主機分別安裝好keepalived和nginx(或httpd)軟件
yum install -y keepalived ipvsadm
設置keepalived.conf配置文件
vim /etc/keepalived/keepalived.conf
track_script { //執行腳本
down
}
}
如果腳本執行結果爲0,並且weight配置的值大於0,則優先級相應的增加(升優先級)
如果腳本執行結果非0,並且weight配置的值小於0,則優先級相應的減少(降優先級)
其他情況,原本配置的優先級不變,即配置文件中priority對應的值。
優先級不會不斷的提高或者降低
可以編寫多個檢測腳本併爲每個檢測腳本設置不同的weight(在配置中列出就行)
不管提高優先級還是降低優先級,最終優先級的範圍是在[1,254],不會出現優先級小於等於0或者優先級大
於等於255的情況
---
測試檢驗:
1.在node11、node12上啓動httpd和keepalived服務。
2.在node11上停止httpd服務,用ip a查VIP信息,會發node11上沒有VIP 了
3.在node12上用ip a查VIP信息,會發node12有VIP 了
2.在node11上啓動httpd服務,用ip a查VIP信息,會發node11有VIP
34/34