精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ES 集群架構演進之路

jf_ro2CN3Fa ? 來源:芋道源碼 ? 作者:芋道源碼 ? 2022-11-05 10:47 ? 次閱讀

ES 集群架構演進之路

1、初始階段

2、集群隔離階段

3、節點副本調優階段

4、主從集群調整階段

5、現今:實時互備雙集群階段

ES 訂單數據的同步方案

遇到的一些坑

1、實時性要求高的查詢走DB

2、避免深分頁查詢

3、FieldData與Doc Values

總結

京東到家訂單中心系統業務中,無論是外部商家的訂單生產,或是內部上下游系統的依賴,訂單查詢的調用量都非常大,造成了訂單數據讀多寫少的情況。

我們把訂單數據存儲在MySQL中,但顯然只通過DB來支撐大量的查詢是不可取的。同時對于一些復雜的查詢,MySQL支持得不夠友好,所以訂單中心系統使用了Elasticsearch來承載訂單查詢的主要壓力。

f7958d0c-5cb0-11ed-a3b6-dac502259ad0.jpg

Elasticsearch作為一款功能強大的分布式搜索引擎,支持近實時的存儲、搜索數據,在京東到家訂單系統中發揮著巨大作用,目前訂單中心ES集群存儲數據量達到10億個文檔,日均查詢量達到5億。

隨著京東到家近幾年業務的快速發展,訂單中心ES架設方案也不斷演進,發展至今ES集群架設是一套實時互備方案,很好地保障了ES集群讀寫的穩定性,下面就給大家介紹一下這個歷程以及過程中遇到的一些坑。

ES 集群架構演進之路

1、初始階段

訂單中心ES初始階段如一張白紙,架設方案基本沒有,很多配置都是保持集群默認配置。整個集群部署在集團的彈性云上,ES集群的節點以及機器部署都比較混亂。同時按照集群維度來看,一個ES集群會有單點問題,顯然對于訂單中心業務來說也是不被允許的。

2、集群隔離階段

和很多業務一樣,ES集群采用的混布的方式。但由于訂單中心ES存儲的是線上訂單數據,偶爾會發生混布集群搶占系統大量資源,導致整個訂單中心ES服務異常。

顯然任何影響到訂單查詢穩定性的情況都是無法容忍的,所以針對于這個情況,先是對訂單中心ES所在的彈性云,遷出那些系統資源搶占很高的集群節點,ES集群狀況稍有好轉。但隨著集群數據不斷增加,彈性云配置已經不太能滿足ES集群,且為了完全的物理隔離,最終干脆將訂單中心ES集群部署到高配置的物理機上,ES集群性能又得到提升。

3、節點副本調優階段

ES的性能跟硬件資源有很大關系,當ES集群單獨部署到物理機器上時,集群內部的節點并不是獨占整臺物理機資源,在集群運行的時候同一物理機上的節點仍會出現資源搶占的問題。所以在這種情況下,為了讓ES單個節點能夠使用最大程度的機器資源,采用每個ES節點部署在單獨一臺物理機上方式。

但緊接著,問題又來了,如果單個節點出現瓶頸了呢?我們應該怎么再優化呢?

ES查詢的原理,當請求打到某號分片的時候,如果沒有指定分片類型(Preference參數)查詢,請求會負載到對應分片號的各個節點上。而集群默認副本配置是一主一副,針對此情況,我們想到了擴容副本的方式,由默認的一主一副變為一主二副,同時增加相應物理機。

f7aea2c4-5cb0-11ed-a3b6-dac502259ad0.jpg

訂單中心ES集群架設示意圖

如圖,整個架設方式通過VIP來負載均衡外部請求:

整個集群有一套主分片,二套副分片(一主二副),從網關節點轉發過來的請求,會在打到數據節點之前通過輪詢的方式進行均衡。集群增加一套副本并擴容機器的方式,增加了集群吞吐量,從而提升了整個集群查詢性能。

下圖為訂單中心ES集群各階段性能示意圖,直觀地展示了各階段優化后ES集群性能的顯著提升:

f7c3ded2-5cb0-11ed-a3b6-dac502259ad0.jpg

當然分片數量和分片副本數量并不是越多越好,在此階段,我們對選擇適當的分片數量做了進一步探索。分片數可以理解為MySQL中的分庫分表,而當前訂單中心ES查詢主要分為兩類:單ID查詢以及分頁查詢。

分片數越大,集群橫向擴容規模也更大,根據分片路由的單ID查詢吞吐量也能大大提升,但聚合的分頁查詢性能則將降低;分片數越小,集群橫向擴容規模也更小,單ID的查詢性能也會下降,但分頁查詢的性能將會提升。

所以如何均衡分片數量和現有查詢業務,我們做了很多次調整壓測,最終選擇了集群性能較好的分片數。

4、主從集群調整階段

到此,訂單中心的ES集群已經初具規模,但由于訂單中心業務時效性要求高,對ES查詢穩定性要求也高,如果集群中有節點發生異常,查詢服務會受到影響,從而影響到整個訂單生產流程。很明顯這種異常情況是致命的,所以為了應對這種情況,我們初步設想是增加一個備用集群,當主集群發生異常時,可以實時的將查詢流量降級到備用集群。

那備用集群應該怎么來搭?主備之間數據如何同步?備用集群應該存儲什么樣的數據?

考慮到ES集群暫時沒有很好的主備方案,同時為了更好地控制ES數據寫入,我們采用業務雙寫的方式來搭設主備集群。每次業務操作需要寫入ES數據時,同步寫入主集群數據,然后異步寫入備集群數據。同時由于大部分ES查詢的流量都來源于近幾天的訂單,且訂單中心數據庫數據已有一套歸檔機制,將指定天數之前已經關閉的訂單轉移到歷史訂單庫。

所以歸檔機制中增加刪除備集群文檔的邏輯,讓新搭建的備集群存儲的訂單數據與訂單中心線上數據庫中的數據量保持一致。同時使用ZK在查詢服務中做了流量控制開關,保證查詢流量能夠實時降級到備集群。在此,訂單中心主從集群完成,ES查詢服務穩定性大大提升。

f7e44fa0-5cb0-11ed-a3b6-dac502259ad0.jpg

5、現今:實時互備雙集群階段

期間由于主集群ES版本是較低的1.7,而現今ES穩定版本都已經迭代到6.x,新版本的ES不僅性能方面優化很大,更提供了一些新的好用的功能,所以我們對主集群進行了一次版本升級,直接從原來的1.7升級到6.x版本。

集群升級的過程繁瑣而漫長,不但需要保證線上業務無任何影響,平滑無感知升級,同時由于ES集群暫不支持從1.7到6.x跨越多個版本的數據遷移,所以需要通過重建索引的方式來升級主集群,具體升級過程就不在此贅述了。

主集群升級的時候必不可免地會發生不可用的情況,但對于訂單中心ES查詢服務,這種情況是不允許的。所以在升級的階段中,備集群暫時頂上充當主集群,來支撐所有的線上ES查詢,保證升級過程不影響正常線上服務。同時針對于線上業務,我們對兩個集群做了重新的規劃定義,承擔的線上查詢流量也做了重新的劃分。

備集群存儲的是線上近幾天的熱點數據,數據規模遠小于主集群,大約是主集群文檔數的十分之一。集群數據量小,在相同的集群部署規模下,備集群的性能要優于主集群。

然而在線上真實場景中,線上大部分查詢流量也來源于熱點數據,所以用備集群來承載這些熱點數據的查詢,而備集群也慢慢演變成一個熱數據集群。之前的主集群存儲的是全量數據,用該集群來支撐剩余較小部分的查詢流量,這部分查詢主要是需要搜索全量訂單的特殊場景查詢以及訂單中心系統內部查詢等,而主集群也慢慢演變成一個冷數據集群。

同時備集群增加一鍵降級到主集群的功能,兩個集群地位同等重要,但都可以各自降級到另一個集群。雙寫策略也優化為:假設有AB集群,正常同步方式寫主(A集群)異步方式寫備(B集群)。A集群發生異常時,同步寫B集群(主),異步寫A集群(備)。

f806dc1e-5cb0-11ed-a3b6-dac502259ad0.jpg

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

ES 訂單數據的同步方案

MySQL數據同步到ES中,大致總結可以分為兩種方案:

方案1:監聽MySQL的Binlog,分析Binlog將數據同步到ES集群中。

方案2:直接通過ES API將數據寫入到ES集群中。

考慮到訂單系統ES服務的業務特殊性,對于訂單數據的實時性較高,顯然監聽Binlog的方式相當于異步同步,有可能會產生較大的延時性。且方案1實質上跟方案2類似,但又引入了新的系統,維護成本也增高。所以訂單中心ES采用了直接通過ES API寫入訂單數據的方式,該方式簡潔靈活,能夠很好的滿足訂單中心數據同步到ES的需求。

由于ES訂單數據的同步采用的是在業務中寫入的方式,當新建或更新文檔發生異常時,如果重試勢必會影響業務正常操作的響應時間。

所以每次業務操作只更新一次ES,如果發生錯誤或者異常,在數據庫中插入一條補救任務,有Worker任務會實時地掃這些數據,以數據庫訂單數據為基準來再次更新ES數據。通過此種補償機制,來保證ES數據與數據庫訂單數據的最終一致性。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://gitee.com/zhijiantianya/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

遇到的一些坑

1、實時性要求高的查詢走DB

對于ES寫入機制的有了解的同學可能會知道,新增的文檔會被收集到Indexing Buffer,然后寫入到文件系統緩存中,到了文件系統緩存中就可以像其他的文件一樣被索引到。

然而默認情況文檔從Indexing Buffer到文件系統緩存(即Refresh操作)是每秒分片自動刷新,所以這就是我們說ES是近實時搜索而非實時的原因:文檔的變化并不是立即對搜索可見,但會在一秒之內變為可見。

當前訂單系統ES采用的是默認Refresh配置,故對于那些訂單數據實時性比較高的業務,直接走數據庫查詢,保證數據的準確性。

f82b675a-5cb0-11ed-a3b6-dac502259ad0.jpg

2、避免深分頁查詢

ES集群的分頁查詢支持from和size參數,查詢的時候,每個分片必須構造一個長度為from+size的優先隊列,然后回傳到網關節點,網關節點再對這些優先隊列進行排序找到正確的size個文檔。

假設在一個有6個主分片的索引中,from為10000,size為10,每個分片必須產生10010個結果,在網關節點中匯聚合并60060個結果,最終找到符合要求的10個文檔。

由此可見,當from足夠大的時候,就算不發生OOM,也會影響到CPU和帶寬等,從而影響到整個集群的性能。所以應該避免深分頁查詢,盡量不去使用。

3、FieldData與Doc Values

FieldData

線上查詢出現偶爾超時的情況,通過調試查詢語句,定位到是跟排序有關系。排序在es1.x版本使用的是FieldData結構,FieldData占用的是JVM Heap內存,JVM內存是有限,對于FieldData Cache會設定一個閾值。

如果空間不足時,使用最久未使用(LRU)算法移除FieldData,同時加載新的FieldData Cache,加載的過程需要消耗系統資源,且耗時很大。所以導致這個查詢的響應時間暴漲,甚至影響整個集群的性能。針對這種問題,解決方式是采用Doc Values。

Doc Values

Doc Values是一種列式的數據存儲結構,跟FieldData很類似,但其存儲位置是在Lucene文件中,即不會占用JVM Heap。隨著ES版本的迭代,Doc Values比FieldData更加穩定,Doc Values在2.x起為默認設置。

總結

架構的快速迭代源于業務的快速發展,正是由于近幾年到家業務的高速發展,訂單中心的架構也不斷優化升級。而架構方案沒有最好的,只有最合適的,相信再過幾年,訂單中心的架構又將是另一個面貌,但吞吐量更大,性能更好,穩定性更強,將是訂單中心系統永遠的追求。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ES
    ES
    +關注

    關注

    0

    文章

    11

    瀏覽量

    20032
  • 硬件
    +關注

    關注

    11

    文章

    3252

    瀏覽量

    66112
  • 數據存儲
    +關注

    關注

    5

    文章

    963

    瀏覽量

    50856

原文標題:MySQL用得好好的,為啥非要轉ES?

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    京東廣告投放平臺整潔架構演進之路

    設計思想到落地框架都進行了徹底的革新,涉及內容比較多,因此我們希望通過一系列文章循序漸進地闡述本次架構升級的始末。新架構并不是一日而成的,而是經過了多次架構升級的演進,因此我們將本文作
    的頭像 發表于 09-18 10:26 ?779次閱讀
    京東廣告投放平臺整潔<b class='flag-5'>架構</b><b class='flag-5'>演進</b><b class='flag-5'>之路</b>

    2017雙11技術揭秘—阿里巴巴數據庫技術架構演進

    第三代大規模分庫分表 向 第四代X-DB分布式數據庫系統 演進的目標。X-DB分布式數據庫的落地已經在2017年雙11大促中獲得了可行性驗證,同時底層開始引入存儲計算分離架構。分布式在系統穩定性、容災能力
    發表于 01-02 16:31

    kafka架構集群搭建

    kafka入門+集群搭建
    發表于 04-29 17:06

    ES集群的安裝步驟

    ES集群安裝填坑記
    發表于 05-08 17:09

    java的IO演進之路概述

    第一章 java的IO演進之路
    發表于 07-24 16:53

    軟件定義的分組傳送網架構及技術演進,不看肯定后悔

    軟件定義的分組傳送網架構及技術演進,不看肯定后悔
    發表于 05-21 06:59

    3GPP網絡架構演進分析

    3GPP網絡架構演進分析摘要文章介紹了3GPP網絡架構演進需求以及SAE架構,在此基礎上,提出了SAE的候選方案。關鍵詞:3GPP網絡,3
    發表于 01-26 17:57 ?42次下載

    UMTS演進之路

    摘要 UMTS是目前最具影響力的3G標準,文章介紹了UMTS的兩個演進版本——長期演進(LTE)和HSPA演進(HSPA+)的標準化現狀,展望了UMTS標準向更遠期的IMT-Advanced技術
    發表于 06-18 09:39 ?997次閱讀

    淺談UMTS演進之路

    摘要 UMTS是目前最具影響力的3G標準,文章介紹了UMTS的兩個演進版本——長期演進(LTE)和HSPA演進(HSPA+)的標準化現狀,展望了UMTS標準向更遠期的IMT-Advanced技術
    發表于 06-19 13:25 ?701次閱讀

    微服務架構多微才合適

    大家也都認可,隨著數據量、流量、業務復雜度的提升,服務化架構架構演進中的必由之路,今天要討論的話題是:微服務架構多“微”才合適?
    的頭像 發表于 02-07 17:14 ?3341次閱讀
    微服務<b class='flag-5'>架構</b>多微才合適

    簡單分析Java高可用集群和微服務架構

    可能大部分讀者都在想,為什么在這以 dubbo、spring cloud 為代表的微服務時代,我要還要整理這種已經“過時”高可用集群架構
    的頭像 發表于 05-03 18:17 ?2073次閱讀
    簡單分析Java高可用<b class='flag-5'>集群</b>和微服務<b class='flag-5'>架構</b>

    語音網絡架構演進

    語音網絡架構經歷了從固定到移動,從模擬語音到數字語音,從語音通信到多媒體通信幾方面的演進。在先后經歷了固定和移動(2G、3G、4G和5G)的幾個演進階段后,語音網絡架構在形態和功能上都
    的頭像 發表于 12-13 15:37 ?3165次閱讀

    深度解讀ES+Redis+MySQL的高可用架構設計

    我們有兩個機房,分別是機房 A 和機房 B。我們把 ES集群部署在機房 A,把 ES集群部署在機房 B。會員系統的讀寫都在 ES
    的頭像 發表于 06-01 10:09 ?691次閱讀
    深度解讀<b class='flag-5'>ES</b>+Redis+MySQL的高可用<b class='flag-5'>架構</b>設計

    從盤中孔到真空塞孔,線路板樹脂塞孔技術的演進之路

    從盤中孔到真空塞孔,線路板樹脂塞孔技術的演進之路
    的頭像 發表于 02-25 09:17 ?822次閱讀

    GPU服務器AI網絡架構設計

    眾所周知,在大型模型訓練中,通常采用每臺服務器配備多個GPU的集群架構。在上一篇文章《高性能GPU服務器AI網絡架構(上篇)》中,我們對GPU網絡中的核心術語與概念進行了詳盡介紹。本文將進一步深入探討常見的GPU系統架構。
    的頭像 發表于 11-05 16:20 ?187次閱讀
    GPU服務器AI網絡<b class='flag-5'>架構</b>設計