掃二維碼與項目經理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
作者:若小寒 2019-07-08 11:09:09
系統(tǒng)
分布式 分布式系統(tǒng)類型多,涉及面非常廣,不同類型的系統(tǒng)有不同的特點,批量計算和實時計算就差別非常大。這篇文章中,重點會討論下分布式數(shù)據(jù)系統(tǒng)的設計,比如分布式存儲系統(tǒng),分布式搜索系統(tǒng),分布式分析系統(tǒng)等。

分布式系統(tǒng)類型多,涉及面非常廣,不同類型的系統(tǒng)有不同的特點,批量計算和實時計算就差別非常大。這篇文章中,重點會討論下分布式數(shù)據(jù)系統(tǒng)的設計,比如分布式存儲系統(tǒng),分布式搜索系統(tǒng),分布式分析系統(tǒng)等。
我們先來簡單看下Elasticsearch的架構。
Elasticsearch 集群架構
Elasticsearch是一個非常著名的開源搜索和分析系統(tǒng),目前被廣泛應用于互聯(lián)網(wǎng)多種領域中,尤其是以下三個領域特別突出。一是搜索領域,相對于solr,真正的后起之秀,成為很多搜索系統(tǒng)的不二之選。二是Json文檔數(shù)據(jù)庫,相對于MongoDB,讀寫性能更佳,而且支持更豐富的地理位置查詢以及數(shù)字、文本的混合查詢等。三是時序數(shù)據(jù)分析處理,目前是日志處理、監(jiān)控數(shù)據(jù)的存儲、分析和可視化方面做得非常好,可以說是該領域的***者了。
Elasticsearch的詳細介紹可以到官網(wǎng)查看。我們先來看一下Elasticsearch中幾個關鍵概念:
用圖形表示出來可能是這樣子的:
Index流程
建索引(Index)的時候,一個Doc先是經過路由規(guī)則定位到主Shard,發(fā)送這個doc到主Shard上建索引,成功后再發(fā)送這個Doc到這個Shard的副本上建索引,等副本上建索引成功后才返回成功。
在這種架構中,索引數(shù)據(jù)全部位于Shard中,主Shard和副本Shard各存儲一份。當某個副本Shard或者主Shard丟失(比如機器宕機,網(wǎng)絡中斷等)時,需要將丟失的Shard在其他Node中恢復回來,這時候就需要從其他副本(Replica)全量拷貝這個Shard的所有數(shù)據(jù)到新Node上構造新Shard。這個拷貝過程需要一段時間,這段時間內只能由剩余主副本來承載流量,在恢復完成之前,整個系統(tǒng)會處于一個比較危險的狀態(tài),直到failover結束。
這里就體現(xiàn)了副本(Replica)存在的一個理由,避免數(shù)據(jù)丟失,提高數(shù)據(jù)可靠性。副本(Replica)存在的另一個理由是讀請求量很大的時候,一個Node無法承載所有流量,這個時候就需要一個副本來分流查詢壓力,目的就是擴展查詢能力。
角色部署方式
接下來再看看角色分工的兩種不同方式:
Elasticsearch支持上述兩種方式:
1.混合部署(左圖)
2.分層部署(右圖):
上面介紹了Elasticsearch的部署層架構,不同的部署方式適合不同場景,需要根據(jù)自己的需求選擇適合的方式。
Elasticsearch 數(shù)據(jù)層架構
接下來我們看看當前Elasticsearch的數(shù)據(jù)層架構。
數(shù)據(jù)存儲
Elasticsearch的Index和meta,目前支持存儲在本地文件系統(tǒng)中,同時支持niofs,mmap,simplefs,smb等不同加載方式,性能***的是直接將索引LOCK進內存的MMap方式。默認,Elasticsearch會自動選擇加載方式,另外可以自己在配置文件中配置。這里有幾個細節(jié),具體可以看官方文檔。
索引和meta數(shù)據(jù)都存在本地,會帶來一個問題:當某一臺機器宕機或者磁盤損壞的時候,數(shù)據(jù)就丟失了。為了解決這個問題,可以使用Replica(副本)功能。
副本(Replica)
可以為每一個Index設置一個配置項:副本(Replicda)數(shù),如果設置副本數(shù)為2,那么就會有3個Shard,其中一個是PrimaryShard,其余兩個是ReplicaShard,這三個Shard會被Mater盡量調度到不同機器,甚至機架上,這三個Shard中的數(shù)據(jù)一樣,提供同樣的服務能力。
副本(Replica)的目的有三個:
問題
上面說了一些優(yōu)勢,這種架構同樣在一些場景下會有些問題。
Elasticsearch采用的是基于本地文件系統(tǒng),使用Replica保證數(shù)據(jù)可靠性的技術架構,這種架構一定程度上可以滿足大部分需求和場景,但是也存在一些遺憾:
上面介紹了Elasticsearch數(shù)據(jù)層的架構,以及副本策略帶來的優(yōu)勢和不足,下面簡單介紹了幾種不同形式的分布式數(shù)據(jù)系統(tǒng)架構。
分布式系統(tǒng)
***種:基于本地文件系統(tǒng)的分布式系統(tǒng)
上圖中是一個基于本地磁盤存儲數(shù)據(jù)的分布式系統(tǒng)。Index一共有3個Shard,每個Shard除了Primary Shard外,還有一個Replica Shard。當Node 3機器宕機或磁盤損壞的時候,首先確認P3已經不可用,重新選舉R3位Primary Shard,此Shard發(fā)生主備切換。然后重新找一臺機器Node 7,在Node7 上重新啟動P3的新Replica。由于數(shù)據(jù)都會存在本地磁盤,此時需要將Shard 3的數(shù)據(jù)從Node 6上拷貝到Node7上。如果有200G數(shù)據(jù),千兆網(wǎng)絡,拷貝完需要1600秒。如果沒有replica,則這1600秒內這些Shard就不能服務。
為了保證可靠性,就需要冗余Shard,會導致更多的物理資源消耗。
這種思想的另外一種表現(xiàn)形式是使用雙集群,集群級別做備份。
在這種架構中,如果你的數(shù)據(jù)是在其他存儲系統(tǒng)中生成的,比如HDFS/HBase,那么你還需要一個數(shù)據(jù)傳輸系統(tǒng),將準備好的數(shù)據(jù)分發(fā)到相應的機器上。
這種架構中為了保證可用性和可靠性,需要雙集群或者Replica才能用于生產環(huán)境,優(yōu)勢和副作用在上面介紹Elasticsearch的時候已經介紹過了,這里就就不贅述了。
Elasticsearch使用的就是這種架構方式。
第二種:基于分布式文件系統(tǒng)的分布式系統(tǒng)(共享存儲)
針對***種架構中的問題,另一種思路是:存儲和計算分離。
***種思路的問題根源是數(shù)據(jù)量大,拷貝數(shù)據(jù)耗時多,那么有沒有辦法可以不拷貝數(shù)據(jù)?為了實現(xiàn)這個目的,一種思路是底層存儲層使用共享存儲,每個Shard只需要連接到一個分布式文件系統(tǒng)中的一個目錄/文件即可,Shard中不含有數(shù)據(jù),只含有計算部分。相當于每個Node中只負責計算部分,存儲部分放在底層的另一個分布式文件系統(tǒng)中,比如HDFS。
上圖中,Node 1 連接到***個文件;Node 2連接到第二個文件;Node3連接到第三個文件。當Node 3機器宕機后,只需要在Node 4機器上新建一個空的Shard,然后構造一個新連接,連接到底層分布式文件系統(tǒng)的第三個文件即可,創(chuàng)建連接的速度是很快的,總耗時會非常短。
這種是一種典型的存儲和計算分離的架構,優(yōu)勢有以下幾個方面:
這種架構同時也有一個不足:訪問分布式文件系統(tǒng)的性能可能不及訪問本地文件系統(tǒng)。在上一代分布式文件系統(tǒng)中,這是一個比較明顯的問題,但是目前使用了各種用戶態(tài)協(xié)議棧后,這個差距已經越來越小了。HBase使用的就是這種架構方式。
Solr也支持這種形式的架構。
總結
上述兩種架構,各有優(yōu)勢和不足,對于某些架構中的不足或缺陷,思路不同,解決的方案也大相徑庭,但是思路跨度越大,收益一般也越大。
上面只是介紹了分布式數(shù)據(jù)(存儲/搜索/分析等等)系統(tǒng)在存儲層的兩種不同架構方式,希望能對大家有用。但是分布式系統(tǒng)架構設計所涉及的內容廣,細節(jié)多,權衡點眾,如果大家對某些領域或者方面有興趣,也可以留言,后面再探討。

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流