一、無共享架構
1、無共享架構
????? 無共享架構是一種分布式計算架構,這種架構中不存在集中存儲的狀態,系統中每個節點都是獨立自治的,整個系統中沒有資源競爭,這種架構具有非常強的擴張性,目前在web應用中被廣泛使用。
????? 無共享架構的一個重要實踐指導原則就是避免在互聯系統中使用Session,因為實踐已經證明,在一個集群分布式計算環境中,若Session狀態維護在各個節點服務器上,為了保證狀態一致性,節點間Session數據需要互相拷貝同步,嚴重影響性能,我們需要盡可能的改造現有架構不要使用Session。
?2、對比
shared-nothing、shared-memory、shared-disk是并行系統最常使用的模式。
shared-memory:多個cpu共享同一片內存,cpu之間通過內部通訊機制進行通訊
shared-disk:每一個cpu使用自己的私有內存區域,通過內部通訊機制直接訪問所有磁盤系統
和shared-memory、shared-disk相比,shared-nothing優勢明顯,在針對多用戶并行訪問的時候,通過橫向擴充資源,能夠大大減少響應時間,提升整體吞吐量和效率。
3、分片
shared noting需要確立一種分片策略,使得依據不同的分片策略,減少資源競爭。
三種基本的分片策略結構:
(1)功能分片 根據多個功能互相不重疊的特點進行分片,這種方式已經在ebay取得巨大成功。缺點也很明顯,即技術人員需要深入理解應用領域,才能更好地分片;
(2)鍵值分片 在數據中找到一個可以均勻分布到各個分片中的鍵值。
(3)查表 在集群中有一個節點充當目錄角色,用于查詢哪個節點擁有用戶要訪問的數據。缺點在于這個表可能成為整個系統的瓶頸及單點失效點;
二、負載均衡
??????負載均衡(Load Balance),顧名思義,是把服務的并發請求均衡地負載到后端多個具有相同能力的服務進行處理分擔,以廉價有效透明的方式擴展網絡設備或服務的帶寬,增加吞吐量,增強服務的整體處理能力,提供服務的靈活性和可用性。
常見的典型的負載均衡應用場景:
(1)、web集群:將大量的并發訪問或數據流量分擔到多臺節點設備上分別處理,減少用戶等待響應的時間。
(2)、MapReduce:單個重負載的運算分擔到多臺節點設備上做并行處理,每個節點設備處理結束后,將結果匯總,返回給?戶,系統處理能?得到大幅度提高。
負載均衡算法
??????負載均衡算法是負載均衡設備(包括虛擬設備或相關軟件)在執行負載均衡調度,選擇具體處理的后端服務的時候使用的調度和分發的邏輯。負載均衡的算法只是規定了調度和分發的邏輯,在不同的負載均衡方案中都可能使用相同和(或)類似的算法,它只是負載均衡方案的一部分。
常見的主流負載均衡算法包括:
(1)輪詢算法:Round Robin/Weight Round Robin Scheduling
???? 輪詢算法通過依次輪叫的方式依次將請求調度不同的后端服務器(Real Server)。通常可以分為普通輪詢和加權輪詢兩種方式。算法的優點是簡潔且無狀態。
???? 算法簡單表示為:i = ( i + 1 ) mod n
(2)Hash算法: 隨機數Hash,Sources Hashing Scheduling
???? Hash算法,又叫取余算法。一般是對請求報文中的某項數據(key,一般常用客戶端來源IP)計算Hash值,然后按機器數量(n)取模。
???? 算法簡單表示為:idx = Hash(key) % n?
?????Hash算法中,Key的選擇常用實踐如下:
???? a、請求時間或隨機數 特點是簡單,具有一定分散性,但不穩定,一般用于要求不高的負載均衡場景。
???? b、來源IP
???? 特點是簡單。如果客戶的分布比較廣,這種方式分散性較好。但如果較多的客戶請求來源于同一IP(公司網絡通過路由器上網),分散效果較差。
??? 大多負載均衡設備都支持這種算法,著名的nginx和LVS等軟件也支持。
(3)一致性Hash算法:Consistency Hash Scheduling
????一致性Hash算法最常用于分布式緩存(如memcached、redis等)的定位,但同時也可以在系統或程序中用于負載均衡,該算法本來的意義就在于分散負載和快速定位。
(4)最少連接或請求數: (Weight)Least Connection/Request Scheduling
????最小連接調度是一種動態調度算法,它通過服務器當前所活躍的連接數來估計服務器的負載情況。
??? 算法主要邏輯是,調度設備或服務記錄后端服務器接受請求的計數,每次請求總是發給計數最小的服務器處理。
(5)最大空閑:Most idle First(基于監控CPU,內存,帶寬等綜合評估) (6)、平均最快響應:平均最快響應 (7)、最少流量:Least Traffic Scheduling
??? 還有一種常見的就是基于會話的負載實現,但是嚴格來說Session(一般用于WEB)不能算是算法。Session實現負載均衡的主要過程為:首次請求記錄用戶的SessionID,然后再通過輪詢等算法選擇后端服務器,如果用戶后續使用同一SessionID發起請求,則無需再選擇服務器,直接轉發給前面根據SessionID找到的對應的后端服務器。
負載均衡模式
??? 負載均衡模式主要是指在整體方案中選擇從服務網絡的哪個層次或哪個產品來實現負載均衡方案。
1、外部模式(RR-DNS)
??? RR-DNS,即DNS輪詢模式,它的原理是利用DNS服務器支持同一域名配置多個獨立IP指向,然后輪詢解析指向IP實現多次訪問的調度和分發,實現負載均衡。
它的主要特點為:
a、負載均衡實現與后端服務完全沒有關系,有DNS在本地解析指向實現輪詢調度。這個方面來看性能最佳效率最高。
b、DNS服務無法檢測到后端服務器是否正常,在TTL失效前,會一直指向失效的服務器,這就要求在實踐生成中,必須解決后端服務器的高可用問題。
c、一般的第三方DNS服務提供商都支持該功能,但如果更新頻率高或附帶更新邏輯,一般會在系統內自鍵DNS服務,然后在注冊為公共DNS服務。
2、應用層模式
??? 正向代理:用戶通過代理服務訪問internet, 把internet返回的數據轉發給用戶。正向代理對于整個網絡請求,它的角色實際是客戶端,代理客戶對外的訪問請求。 反向代理:接受internet上用戶的請求,轉發給內部的多臺服務器處理,完成后轉發后端服務器的返回給對應的用戶。反向代理對于整個網絡請求,它的角色實際是服務器,代理接受(accept)所有用戶的請求。
?? 反向代理應用模式:常見的反向代理應用模式,比如通過 Apache, nginx等Web服務器軟件實現WEB應用的負載均衡和高可用。利用反向代理軟件實現負載均衡是性價比較高的模式。
三、高可用性系統設計
?? 系統高可用性的常用設計模式包括三種,包括:
???1、主備(Active-Standby)
工作原理:主機工作,備機處于監控準備狀況;當主機宕機時,備機接管主機的一切工作,待主機恢復正常后,按使用者的設定以自動(熱備)或手動(冷備)方式將服務切換到主機上運行。一般需要人工干預才能回復初始狀態。
?? 2、互備(Active-Active)
工作原理:兩臺主機(A標記為主,B標記為備)同時運行各自的服務工作且相互監測情況,當任一臺主機(A)宕機時,另一臺主機(B,啟用并標記為主)立即接管它的一切工作,保證工作實時可用
? 3、集群(Cluster)
工作原理:多臺具有相同能力的服務同時對外提供透明服務,所有服務之間都是Active-Active關系,并分擔處理服務請求,一般通過總控節點或集群軟件(例如zookeeper等)進行高可用的控制。