文/宋衛
分布式系統類似于設計模式里的門面模式,對于外部使用人員來說,它是一個整體,而對于分布式系統本身來說,它是由各種計算機、服務器、網絡、存儲組成的一個組合,分布式系統的目的就是為了滿現在大量的計算、存儲的需求,分布式系統使得我們能夠使用更多相對廉價異構的計算機、服務器及空閑的計算機,通過一種協作的方式來為外部系統或使用者提供更快捷更方便的服務,在分布式系統中,數據和計算被分成不同的小任務,通過負載均衡的調度和網絡傳輸的方式在各個計算機節點上進行計算、存儲和傳輸,最終輸出計算結果進行存儲,并為外部提供服務。
通信機制是分布式系統中非常重要的功能,通信機制決定了計算機、服務器之間,能否互相通信組成集群。負載均衡則決定了任務分配是否合理,則決定了分布式系統處理問題的能力,目前業界已經有很多成熟的通信機制及優秀的適應各種環境的負載均衡的算法,可以借鑒使用。
分布式系統之所以能夠成為一個系統,作為一個整體為用戶提供服務和存儲,必須依賴以網絡通信,本文以Java語言為基礎,介紹網絡通信間的基本原理及一些常用的通信協議。
通信就是把信息完整有效的從一臺計算機傳輸到另一臺計算機。在計算機通信領域涉及到模電與數電的轉換,以太網技術等,涉及到硬件設備有網卡、網線、路由器、轉換器,基站等等,一般是有發送端把信息轉換成數字信號通過發送設備發送出去,接受端再通過相應的網絡設備進行接受。計算機的網絡模型有 OSI(Open System Interconnection)七層網絡模型和TCP/IP四層模型。
七層網絡模型主要有:
如圖1所示,物理層直接涉及到物理設備如網卡、交換機、路由器等,數據鏈路層則包含設備驅動程序等,在往上層是一些傳輸協議,最終有應用層使用這些協議。
TCP/IP四層模型跟OSI七層模型的對比關系如圖2。
無論是OSI七層模型還是TCP/IP四層模型,應用層只關心和處理特定應用程序的細節,病不關系底層的通信通過機協議。在分布式系統中一般情況下我們會處理好底層傳輸協議及網絡、鏈路層的應用假定網絡層、傳輸層、鏈路層是穩定可用,并性能良好的,在分布式通信中一般大多關注上層的應用協議。
應用層的協議又有HTTP協議、FTP協議、SOAP協議、XMPP協議、SMTP、POP3協議等等,基于這些協議在分布式的通信服務中又有同步請求、異步請求、發送消息等不同的方式。在現在很多分布式系統微服務的應用場景中,大多使用REST調用,RPC調用方式來實現服務之間同步請求調用,使用JMS來發送消息,如ActiveMQ、RabittMQ等。
1.2.1 HTTP/HTTPS
HTTP(Hyper Text Transfer Protocol)超文本傳輸協議是最常見的一個協議,我們打開一個瀏覽器瀏覽一個網頁使用的就是HTTP協議。在不斷的發展過程中上層的應用使我們賦予了HTTP更豐富的含義,讓HTTP協議更加豐富,語義化更強,有了POST、PUT、GET、DELETE、OPTION、TRACE、HEAD等不同的請求方式,分別表示增加、修改、查找、刪除、選擇|試探、跟蹤、頭部。近些年已經完善正在應用的HTTP 2.0日漸成熟。
通過HTTP協議人們可以上傳下載文件、瀏覽網頁、傳送XML數據、JSON數據。在現在微服務分布式架構中HTTP協議也經常用于內網微服務子系統之間的互相調用。
由于HTTP協議沒用使用任何加密措施,數據多以明文形式展示,容易受到攔截跟攻擊,特別是涉及到敏感數據時人們希望能有更加安全和保密的方法保證數據安全,所以在基于HTTP協議及SSL/TSL加密的基礎上產生了HTTPS協議。可以把HTTPS協議理解為HTTP協議的安全加強版,當然HTTPS協議也涉及到很多加密協議跟算法如秘鑰,私鑰公鑰,加密協議等。
1.2.2 RPC
RPC(Remote Procedure Call)遠程過程調用,RPC最初是有SUN提出的,后經過IETF ONC修訂成為IETF標準協議,使用RPC協議,你不需要了解底層的網絡技術協議,就可以從遠程的計算機上獲取服務。RPC多用于客戶機/服務器的模式下,由于不需要關注傳輸層及應用層,RPC使得開發更加容易,在現在的分布式系統微服務中RPC也得到了廣泛的應用。
RPC也有缺陷,由于傳輸的數據包的大小及網絡抖動,需要重新多傳額外的包,及系統開銷等溫提,Google提供了更高性能的gRPC調用框架,gRPC使用了基于HTTP2.0協議使用了Netty NIO的一些技術及protobuf等數據壓縮技術是的傳輸個數據處理更快捷,更高效。
1.2.3 SOAP
SOAP(Simple Object Access Protocol)簡單對象訪問協議,是一種基于XML的簡單的、輕量級協議。SOAP協議規范由4個主要的部分組成。
第一部分:SOAP封裝(Envelop)。
第二部分:SOAP編碼規則(Encoding Rules)。
第三部分:SOAP RPC表示(RPC Representation)。
第四部分:SOAP綁定(Binding)。
在早期的環境中SOAP協議多用于分布式計算中,提供跨語言的交換信息,它借助于XML定義的良好的數據格式,為不同的語言服務提供接口。由于需要解析XML,SOAP協議相對效率不高,近些年JSON數據的廣泛應用以及越來越受到各種編程語言及系統喜歡的數據格和REST協議的提出,SOAP協議正在被更新REST替換。
1.2.4 JMS
JMS(Java Message Service) Java消息服務,是實現系統解耦,提供系統處理性能的很重要的一個組件。前幾節介紹的無論HTTP、RPC、SOAP都屬于是同步調用,當然可以使用多線程的方式來實現異步。但真正能實現系統解耦、提供異步消息的還是使用JMS服務。
JMS協議規定JMS支持(p2p)點對點的模式、(pub/sub)發布/訂閱模式,
點對點模式就是一個生產者生產消息,一個消費之消費消息,生產者跟消費者是一對一的關系。
發布訂閱模式就是一個生產者生產消息,多個消費者消費消息,生產者跟消費者是一對多的關系。
在分布式系統,使用消息做中間件時有時候會出現消息丟失或多發的情況,這時可以使用緩存或持久化的方式把消息進行存儲方便校驗跟檢查。
在分布式系統中,整個系統的效率,并不是由單臺服務器的所決定的,而是多臺服務器共同協作的結果。分布式系統的能力受到單臺服務器的性能、網絡延遲、任務的分配、資源調度等各種因素的影響,所以在整個系統中網絡負載均衡,任務調度顯得尤其重要。常用的網絡負載均衡的算法有隨機法、輪詢法、加權法、散列法、最少連接法、最低缺失法、最快響應法,通過這些基礎方法的又可以組合使用,形成更高級一些負載均衡方法。
Random隨機法顧名思義,就是采用隨機的算法對集群的中的各個服務器節點進行調度,隨機方法又可以分為完全隨機和加權重隨機。完全隨機認為集群中的機器性能一樣、處理能力平等對帶每一臺機器,完全隨機。當隨機法和加權法結合時,還可為不同的機器設置不同的權重進行隨機,權重大的隨機概率高,權重小的隨機概率低,權重的設置根據機器的性能和負載,人為的進行設置。
Round Ribbon 輪詢法,可以把集群中的服務器看成是一個環裝的結構,依次對環上節點進行調度,輪詢法和隨機法和類似,不同之處在歲輪詢法采用一種順序調用的方式。在使用輪詢法時也可以為不同的節點進行加權,當輪詢法和加權法結合時,稱為加權輪詢,加權輪詢對權重高的在調度時也會多進行調度。
比如設A的權重為1,B權重2,C權重3,在進行加權調度時順序會是:
A B B C CC,A B B C CC,A……依次輪詢下去。
Weight加權法,是負載均衡中最基礎的一個方法,加權法顧名思義就是對集群中不同的機器進行不同的權重評估,權重評估的依據有機器的CPU、內存、磁盤讀寫、網卡帶寬、網絡負載等,還有人為的一些評估。加權法經常跟其他的算法一起使用組成更高級的一些負載均衡算法。
Hash散列算法也叫哈希算法,常用的哈希算法有普通哈希算法、一致性哈希算法,基于IP的哈希算法和基于URL的哈希算法。其中基于IP及URL的哈希算法都屬于普通哈希算法,基本原理是通過計算IP或URL的哈希值和總權重余數得到請求需要路由到的集群節點上。一致性哈希算法是基于虛擬節點的,一旦一個節點掛掉之后,該節點的請求會平攤到其他節點上不會造成某個節點壓力過大出現雪崩的情況,變化比較平滑不會有大的波動。

圖1

圖2
Least Connect 最少鏈接算法,是指從集群服務器列表中找到鏈接最少的機器,把請求轉發大這臺機器上。這就需要調度器知道或者記錄集群中那臺機器鏈接數最少,增加了管理的開銷,同時如果多臺機器連接數都是相同的,這時可以結合加權的方法來進行選擇。這時候會成為帶權重的最少鏈接算法,當鏈接相同時,優先選擇權重高的節點。
本文介紹了分布式系統中常用的通信協議,介紹了基本的常用的網絡負載均衡的算法,在一個分布式系統中通信機制直接決定了系統集群的穩定與否。在介紹了通信機制后進一步介紹了分布式系統中常見負載均衡調度算法,在分布式系統中,服務器之間的異構化,處理能力的不同,必須要有一個良好的調度算法來均衡各個服務器之間的負載,合理的進行任務調度及分配,只有這樣才能是一個分布式系統變的穩定健壯提高系統的處理能力及吐出量,最后基于這些基礎知識本文為進一步學習機研究分布式系統打下了良好的基礎。