從Elasticsearch來看分布式系統架構設計

2020-12-13 IT168

  【IT168 技術】分布式系統類型多,涉及面非常廣,不同類型的系統有不同的特點,批量計算和實時計算就差別非常大。這篇文章中,重點會討論下分布式數據系統的設計,比如分布式存儲系統,分布式搜索系統,分布式分析系統等。

  我們先來簡單看下Elasticsearch的架構。

  Elasticsearch 集群架構

  Elasticsearch是一個非常著名的開源搜索和分析系統,目前被廣泛應用於網際網路多種領域中,尤其是以下三個領域特別突出。一是搜索領域,相對於solr,真正的後起之秀,成為很多搜索系統的不二之選。二是Json文檔資料庫,相對於MongoDB,讀寫性能更佳,而且支持更豐富的地理位置查詢以及數字、文本的混合查詢等。三是時序數據分析處理,目前是日誌處理、監控數據的存儲、分析和可視化方面做得非常好,可以說是該領域的引領者了。

  Elasticsearch的詳細介紹可以到官網查看。我們先來看一下Elasticsearch中幾個關鍵概念:

  節點(Node):物理概念,一個運行的Elasticearch實例,一般是一臺機器上的一個進程。

  索引(Index),邏輯概念,包括配置信息mapping和倒排正排數據文件,一個索引的數據文件可能會分布於一臺機器,也有可能分布於多臺機器。索引的另外一層意思是倒排索引文件。

  分片(Shard):為了支持更大量的數據,索引一般會按某個維度分成多個部分,每個部分就是一個分片,分片被節點(Node)管理。一個節點(Node)一般會管理多個分片,這些分片可能是屬於同一份索引,也有可能屬於不同索引,但是為了可靠性和可用性,同一個索引的分片儘量會分布在不同節點(Node)上。分片有兩種,主分片和副本分片。

  副本(Replica):同一個分片(Shard)的備份數據,一個分片可能會有0個或多個副本,這些副本中的數據保證強一致或最終一致。

  用圖形表示出來可能是這樣子的:


  Index 1:藍色部分,有3個shard,分別是P1,P2,P3,位於3個不同的Node中,這裡沒有Replica。

  Index 2:綠色部分,有2個shard,分別是P1,P2,位於2個不同的Node中。並且每個shard有一個replica,分別是R1和R2。基於系統可用性的考慮,同一個shard的primary和replica不能位於同一個Node中。這裡Shard1的P1和R1分別位於Node3和Node2中,如果某一刻Node2發生宕機,服務基本不會受影響,因為還有一個P1和R2都還是可用的。因為是主備架構,當主分片發生故障時,需要切換,這時候需要選舉一個副本作為新主,這裡除了會耗費一點點時間外,也會有丟失數據的風險。

  Index流程

  建索引(Index)的時候,一個Doc先是經過路由規則定位到主Shard,發送這個doc到主Shard上建索引,成功後再發送這個Doc到這個Shard的副本上建索引,等副本上建索引成功後才返回成功。

  在這種架構中,索引數據全部位於Shard中,主Shard和副本Shard各存儲一份。當某個副本Shard或者主Shard丟失(比如機器宕機,網絡中斷等)時,需要將丟失的Shard在其他Node中恢復回來,這時候就需要從其他副本(Replica)全量拷貝這個Shard的所有數據到新Node上構造新Shard。這個拷貝過程需要一段時間,這段時間內只能由剩餘主副本來承載流量,在恢復完成之前,整個系統會處於一個比較危險的狀態,直到failover結束。

  這裡就體現了副本(Replica)存在的一個理由,避免數據丟失,提高數據可靠性。副本(Replica)存在的另一個理由是讀請求量很大的時候,一個Node無法承載所有流量,這個時候就需要一個副本來分流查詢壓力,目的就是擴展查詢能力。

  角色部署方式

  接下來再看看角色分工的兩種不同方式:


  Elasticsearch支持上述兩種方式:

  混合部署(左圖):

  默認方式。

  不考慮MasterNode的情況下,還有兩種Node,Data Node和Transport Node,這種部署模式下,這兩種不同類型Node角色都位於同一個Node中,相當於一個Node具備兩種功能:Data和Transport。

  當有index或者query請求的時候,請求隨機(自定義)發送給任何一個Node,這臺Node中會持有一個全局的路由表,通過路由表選擇合適的Node,將請求發送給這些Node,然後等所有請求都返回後,合併結果,然後返回給用戶。一個Node分飾兩種角色。

  好處就是使用極其簡單,易上手,對推廣系統有很大價值。最簡單的場景下只需要啟動一個Node,就能完成所有的功能。

  缺點就是多種類型的請求會相互影響,在大集群如果某一個Data Node出現熱點,那麼就會影響途經這個Data Node的所有其他跨Node請求。如果發生故障,故障影響面會變大很多。

  Elasticsearch中每個Node都需要和其餘的每一個Node都保持13個連接。這種情況下,每個Node都需要和其他所有Node保持連接,而一個系統的連接數是有上限的,這樣連接數就會限制集群規模。

  還有就是不能支持集群的熱更新。

  分層部署(右圖):

  通過配置可以隔離開Node。

  設置部分Node為Transport Node,專門用來做請求轉發和結果合併。

  其他Node可以設置為DataNode,專門用來處理數據。

  缺點是上手複雜,需要提前設置好Transport的數量,且數量和Data Node、流量等相關,否則要麼資源閒置,要麼機器被打爆。

  好處就是角色相互獨立,不會相互影響,一般Transport Node的流量是平均分配的,很少出現單臺機器的CPU或流量被打滿的情況,而DataNode由於處理數據,很容易出現單機資源被佔滿,比如CPU,網絡,磁碟等。獨立開後,DataNode如果出了故障只是影響單節點的數據處理,不會影響其他節點的請求,影響限制在最小的範圍內。

  角色獨立後,只需要Transport Node連接所有的DataNode,而DataNode則不需要和其他DataNode有連接。一個集群中DataNode的數量遠大於Transport Node,這樣集群的規模可以更大。另外,還可以通過分組,使Transport Node只連接固定分組的DataNode,這樣Elasticsearch的連接數問題就徹底解決了。

  可以支持熱更新:先一臺一臺的升級DataNode,升級完成後再升級Transport Node,整個過程中,可以做到讓用戶無感知。

  上面介紹了Elasticsearch的部署層架構,不同的部署方式適合不同場景,需要根據自己的需求選擇適合的方式。

  Elasticsearch 數據層架構

  接下來我們看看當前Elasticsearch的數據層架構。

  數據存儲

  Elasticsearch的Index和meta,目前支持存儲在本地文件系統中,同時支持niofs,mmap,simplefs,smb等不同加載方式,性能最好的是直接將索引LOCK進內存的MMap方式。默認,Elasticsearch會自動選擇加載方式,另外可以自己在配置文件中配置。這裡有幾個細節,具體可以看官方文檔。

  索引和meta數據都存在本地,會帶來一個問題:當某一臺機器宕機或者磁碟損壞的時候,數據就丟失了。為了解決這個問題,可以使用Replica(副本)功能。

  副本(Replica)

  可以為每一個Index設置一個配置項:副本(Replicda)數,如果設置副本數為2,那麼就會有3個Shard,其中一個是PrimaryShard,其餘兩個是ReplicaShard,這三個Shard會被Master儘量調度到不同機器,甚至機架上,這三個Shard中的數據一樣,提供同樣的服務能力。

  副本(Replica)的目的有三個:

  保證服務可用性:當設置了多個Replica的時候,如果某一個Replica不可用的時候,那麼請求流量可以繼續發往其他Replica,服務可以很快恢復開始服務。

  保證數據可靠性:如果只有一個Primary,沒有Replica,那麼當Primary的機器磁碟損壞的時候,那麼這個Node中所有Shard的數據會丟失,只能reindex了。

  提供更大的查詢能力:當Shard提供的查詢能力無法滿足業務需求的時候, 可以繼續加N個Replica,這樣查詢能力就能提高N倍,輕鬆增加系統的並發度。

  問題

  上面說了一些優勢,這種架構同樣在一些場景下會有些問題。

  Elasticsearch採用的是基於本地文件系統,使用Replica保證數據可靠性的技術架構,這種架構一定程度上可以滿足大部分需求和場景,但是也存在一些遺憾:

  Replica帶來成本浪費。為了保證數據可靠性,必須使用Replica,但是當一個Shard就能滿足處理能力的時候,另一個Shard的計算能力就會浪費。

  Replica帶來寫性能和吞吐的下降。每次Index或者update的時候,需要先更新Primary Shard,更新成功後再並行去更新Replica,再加上長尾,寫入性能會有不少的下降。

  當出現熱點或者需要緊急擴容的時候動態增加Replica慢。新Shard的數據需要完全從其他Shard拷貝,拷貝時間較長。

  上面介紹了Elasticsearch數據層的架構,以及副本策略帶來的優勢和不足,下面簡單介紹了幾種不同形式的分布式數據系統架構。

  分布式系統

  第一種:基於本地文件系統的分布式系統


  上圖中是一個基於本地磁碟存儲數據的分布式系統。Index一共有3個Shard,每個Shard除了Primary Shard外,還有一個Replica Shard。當Node 3機器宕機或磁碟損壞的時候,首先確認P3已經不可用,重新選舉R3位Primary Shard,此Shard發生主備切換。然後重新找一臺機器Node 7,在Node7 上重新啟動P3的新Replica。由於數據都會存在本地磁碟,此時需要將Shard 3的數據從Node 6上拷貝到Node7上。如果有200G數據,千兆網絡,拷貝完需要1600秒。如果沒有replica,則這1600秒內這些Shard就不能服務。

  為了保證可靠性,就需要冗餘Shard,會導致更多的物理資源消耗。

  這種思想的另外一種表現形式是使用雙集群,集群級別做備份。

  在這種架構中,如果你的數據是在其他存儲系統中生成的,比如HDFS/HBase,那麼你還需要一個數據傳輸系統,將準備好的數據分發到相應的機器上。

  這種架構中為了保證可用性和可靠性,需要雙集群或者Replica才能用於生產環境,優勢和副作用在上面介紹Elasticsearch的時候已經介紹過了,這裡就就不贅述了。

  Elasticsearch使用的就是這種架構方式。

  第二種:基於分布式文件系統的分布式系統(共享存儲)


  針對第一種架構中的問題,另一種思路是:存儲和計算分離。

  第一種思路的問題根源是數據量大,拷貝數據耗時多,那麼有沒有辦法可以不拷貝數據?為了實現這個目的,一種思路是底層存儲層使用共享存儲,每個Shard只需要連接到一個分布式文件系統中的一個目錄/文件即可,Shard中不含有數據,只含有計算部分。相當於每個Node中只負責計算部分,存儲部分放在底層的另一個分布式文件系統中,比如HDFS。

  上圖中,Node 1 連接到第一個文件;Node 2連接到第二個文件;Node3連接到第三個文件。當Node 3機器宕機後,只需要在Node 4機器上新建一個空的Shard,然後構造一個新連接,連接到底層分布式文件系統的第三個文件即可,創建連接的速度是很快的,總耗時會非常短。

  這種是一種典型的存儲和計算分離的架構,優勢有以下幾個方面:

  在這種架構下,資源可以更加彈性,當存儲不夠的時候只需要擴容存儲系統的容量;當計算不夠的時候,只需要擴容計算部分容量。

  存儲和計算是獨立管理的,資源管理粒度更小,管理更加精細化,浪費更少,結果就是總體成本可以更低。

  負載更加突出,抗熱點能力更強。一般熱點問題基本都出現在計算部分,對於存儲和計算分離系統,計算部分由於沒有綁定數據,可以實時的擴容、縮容和遷移,當出現熱點的時候,可以第一時間將計算調度到新節點上。

  這種架構同時也有一個不足:

  訪問分布式文件系統的性能可能不及訪問本地文件系統。在上一代分布式文件系統中,這是一個比較明顯的問題,但是目前使用了各種用戶態協議棧後,這個差距已經越來越小了。

  HBase使用的就是這種架構方式。

  Solr也支持這種形式的架構。

  總結

  上述兩種架構,各有優勢和不足,對於某些架構中的不足或缺陷,思路不同,解決的方案也大相逕庭,但是思路跨度越大,收益一般也越大。

  上面只是介紹了分布式數據(存儲/搜索/分析等等)系統在存儲層的兩種不同架構方式,希望能對大家有用。但是分布式系統架構設計所涉及的內容廣,細節多,權衡點眾,如果大家對某些領域或者方面有興趣,也可以留言,後面再探討。

相關焦點

  • ElasticSearch架構反向思路
    spm=a2c4e.11153940.bloghomeflow.526.162d291aRoS8gf我曾經在多個場合說過,我分析一個系統的設計思路,往往不是一開始就去看看這個系統的設計文檔或者原始碼,而是去看系統的基本介紹,特別是框架類的功能詳細介紹,然後根據介紹可以大概了解這樣一個系統用來解決什麼問題,有哪些特色,然後基於自己對這些問題的想法,
  • elasticsearch Discovery 發現模塊學習
    一、基於單播的方式發現可以在 elasticsearch.yml 配置文件中使用discovery.zen.ping.unicast.hosts靜態設置設置主機列表。discovery.zen.ping.unicast.hosts: ["host1", "host2"]具體的值是一個主機數組或逗號分隔的字符串。
  • Elasticsearch 索引設計實戰指南
    僅就 Elasticsearch 索引設計,請回答如下幾個問題:  1. 每天幾百 GB 增量實時數據的TB級甚至PB級別的大索引如何設計?2. 分片數和副本數大小如何設計,才能提升 ES 集群的性能?3. ES 的 Mapping 該如何設計,才能保證檢索的高效?4.
  • 構建高可擴Web架構和分布式系統實戰
    本文是作者在AOSA一書介紹如何構建可擴展的分布式系統裡的內容,在此翻譯並分享給大家。開源軟體已經成為許多大型網站的基本組成部分,隨著這些網站的逐步壯大,他們的網站架構和一些指導原則也開放在開發者們的面前,給予大家切實有用的指導和幫助。這篇文章主要側重於Web系統,並且也適用於其他分布式系統。
  • 青雲QingCloud面向核心業務的全閃分布式存儲架構設計與實踐
    無中心設計使集群不易形成瓶頸節點,理論上可以無限擴展。第三,針對 NVMe SSD 進行特殊的設計和優化,性能強勁。另外,隨著 25G、100G 網絡的普及和 RDMA 網絡低延遲的特性,使得分布式全閃的跨節點擴展不再是瓶頸。在全快閃記憶體和高速 RDMA 網絡的加持下,分布式全閃架構已經成為企業核心業務的理想之選。
  • 哪種Scale out架構能更有效滿足分布式計算?
    近些年,隨著「分布式」計算的越來越火熱,Scale out分布式應用架構也如雨後春筍般不斷湧現,大到Big Data平臺架構,小到前端應用App的架構,似乎都要基於Scale out 的架構才算是與時俱進的先進架構。
  • 光大銀行分布式實戰:國內最大繳費平臺的資料庫架構轉型
    我今天分享的主題是《高並發場景下,光大銀行分布式資料庫的架構轉型實戰》。 光大銀行也是很有魄力的,拿出了一個重要的業務系統進行一次試點,做了一次這種分布式架構轉型的項目。我有過十餘年DBA相關的經驗,不過之前接觸比較多的主要還是傳統的商用型資料庫,所以能作為這次項目的推進人,也是我個人在這種新的架構下的一次學習的過程。
  • 軟體項目實訓及課程設計指導——系統設計中的系統架構設計示例
    軟體項目實訓及課程設計指導——軟體系統設計中的系統架構設計示例1、軟體系統概要設計中所涉及的主要設計內容和工作過程(1)在軟體應用系統項目的系統概要設計工作中,首先是要完成軟體系統的總體架構設計及系統的分層設計,然後再利用UML包視圖體現出軟體系統架構設計的最終結果
  • 閱讀架構和權限方面的書籍,更好的輔助設計產品
    (原理到實踐都有了) 第三本:《大型分布式網站架構設計與實踐》,很抱歉本書也出自阿里系。對面向服務的架構,分布式基礎設施(緩存,持久化,消息系統,搜尋引擎(lucence,solr)),網際網路安全架構,系統穩定性,數據分析等做了較好的講解。
  • 網際網路系統架構的演進
    但這些框架並不是通常意義上的架構,架構一般可分為物理架構、運行架構、邏輯架構、開發架構、數據架構等多個維度,框架往往只是代碼架構的一部分。代碼架構是指代碼的組織形式、規範、設計模式等,框架其實是常用設計模式的軟體化。例如Struts是MVC模式的實現,Hibernate、iBATIS是ORM模式的實現。
  • 15 年架構設計經驗:我眼中的那些優秀架構師
    後來,在和他進一步溝通的過程中,我發出了這樣的感慨:一個工程師,如果不能從架構師的角度思考問題,帶領團隊,整體完成一個系統的架構設計與開發,就永遠也不會了解如何做一個架構師。而如果他不去做一個架構師,又永遠沒有機會帶領一個團隊,完成一個系統的架構設計與開發。 這裡似乎形成一個死循環。能否解開呢?
  • 你知道嗎 機房動環系統架構
    機房動環系統架構是為了優化機房自身業務而作重新的構架;目前我們斯必得在機房中運用最多得架構是分為動力監控、能耗監控、環境監控、安防監控、消防監控、視頻監控等幾大主流系統。
  • 【精品】長江雲融媒體平臺新聞指揮調度系統的構架與設計
    餘竹敏(湖北廣播電視臺,湖北 430010) 【摘 要】 本文結合長江雲融媒體平臺新聞指揮調度系統的建設現狀,闡述了平臺基於分布式微服務的架構設計、安全設計、系統核心技術、功能設計及融合應用的創新點。
  • 從QingStor NeonSAN看存儲架構的演進
    青雲QingCloud認為,符合雲時代業務市場下需求的存儲,需要滿足以下幾個特點:首先,基於標準X86架構,軟體/硬體冗餘設計,整體架構高可用;第二,可根據業務架構與規模進行存儲架構的調整;第三,容量和性能擴展能力;第四,開放的API、支持與業務耦合;第五,統一管理、統一運維。
  • 什麼是微內核架構設計?
    阿里妹導讀:作為一名Java程式設計師,相信同學們都聽說過微內核架構設計,也有自己的理解。那麼微內核是如何被提出來的?微內核在作業系統內核的設計中又有什麼作用?本文從插件化(Plug-in)架構的角度來詮釋微內核架構設計,通過微內核架構和微服務架構的對比,分享其對微服務設計的參考意義。
  • 分布式微服務架構成確定性趨勢 撬動銀行新一輪IT改造
    容錯糾錯補償機制是指對於實時處理不完整的情形,設計了事後補償方案,同時,採用差錯對帳和差錯調整機製作為兜底方案,最終確保數據的一致性;技術建模分析則是模擬真實環境的測試,通過大數據技術建模分析,來不斷優化技術補償能力。即便在集中式系統中,穩定性也是通過事後補償機制加以實現的,分布式架構與此並無差別。
  • 區塊鏈與分布式帳本技術(上)
    客戶端和分布式背書節點網絡之間的鏈碼的移動,以及滿足認可政策的交易機制和收據傳輸在封閉系統中是有效的。而在專用信道內傳播交易的Gossip 協議允許協調大型數據集。雖然基礎設施強大且有能力,但在思考如何設計架構以允許多邊協調結構的過程中,要考慮最終可能存在一個難以管理的網絡涉及的因素。
  • 華為金融開放創新聯盟與國泰君安合作打造新一代分布式核心業務系統
    當前,有相當數量的證券公司核心系統採用小型機或者基於傳統資料庫的集中式架構,很難滿足證券核心業務對系統可靠性和交易性能的極致追求;同時在系統的橫向擴展性方面存在不足,不能滿足證券業務網際網路化和機構業務蓬勃發展雙重背景下交易峰值的需求。華為公司、華銳和國泰君安致力於實現證券行業核心業務的低時延分布式架構轉型,聯合打造相關解決方案。
  • 並行和分布式系統國際會議ICPADS 2019今日在天津召開!
    重磅乾貨,第一時間送達 會議之眼B類,CCF C類,國際並行和分布式系統會議ICPADS(International Conference on Parrallel and Distributed Systems)旨在介紹並行和分布式計算中的網絡、系統、算法、框架和體系結構的前言思想和最新成果