一、背景 會員系統是一種基礎系統,跟公司所有業務線的下單主流程密切相關。如果會員系統出故障,會導致用戶無法下單,影響範圍是全公司所有業務線。所以,會員系統必須保證高性能、高可用,提供穩定、高效的基礎服務。 隨著同程和藝龍兩家公司的合併,越來越多的系統需要打通同程APP、藝龍APP、同程微信小程式、藝 ...
一、背景
二、ES高可用方案
1. ES雙中心主備集群架構
2. ES流量隔離三集群架構
3. ES集群深度優化提升
-
ES負載不合理,熱點問題嚴重。ES主集群一共有幾十個節點,有的節點上部署的shard數偏多,有的節點部署的shard數很少,導致某些伺服器的負載很高,每到流量高峰期,就經常預警。 -
ES線程池的大小設置得太高,導致cpu飆高。我們知道,設置ES的threadpool,一般將線程數設置為伺服器的cpu核數,即使ES的查詢壓力很大,需要增加線程數,那最好也不要超過“cpu core * 3 / 2 + 1”。如果設置的線程數過多,會導致cpu在多個線程上下文之間頻繁來回切換,浪費大量cpu資源。 -
shard分配的記憶體太大,100g,導致查詢變慢。我們知道,ES的索引要合理分配shard數,要控制一個shard的記憶體大小在50g以內。如果一個shard分配的記憶體過大,會導致查詢變慢,耗時增加,嚴重拖累性能。 -
string類型的欄位設置了雙欄位,既是text,又是keyword,導致存儲容量增大了一倍。會員信息的查詢不需要關聯度打分,直接根據keyword查詢就行,所以完全可以將text欄位去掉,這樣就能節省很大一部分存儲空間,提升性能。 -
ES查詢,使用filter,不使用query。因為query會對搜索結果進行相關度算分,比較耗cpu,而會員信息的查詢是不需要算分的,這部分的性能損耗完全可以避免。 -
節約ES算力,將ES的搜索結果排序放在會員系統的jvm記憶體中進行。 -
增加routing key。我們知道,一次ES查詢,會將請求分發給所有shard,等所有shard返回結果後再聚合數據,最後將結果返回給調用方。如果我們事先已經知道數據分佈在哪些shard上,那麼就可以減少大量不必要的請求,提升查詢性能。
三、會員Redis緩存方案
1. ES近一秒延時導致的Redis緩存數據不一致問題的解決方案
2. Redis雙中心多集群架構
四、高可用會員主庫方案
1. MySql雙中心Partition集群方案
2. 會員主庫平滑遷移方案
-
會員系統是一刻都不能停機的,要在不停機的情況下完成SqlServer到MySql的切換,就像是在給高速行駛的汽車換輪子。 -
會員系統是由很多個系統和介面組成的,畢竟發展了10多年,由於歷史原因,遺留了大量老介面,邏輯錯綜複雜。這麼多系統,必須一個不落的全部梳理清楚,DAL層代碼必須重寫,而且不能出任何問題,否則將是災難性的。 -
數據的遷移要做到無縫遷移,不僅是存量10多億數據的遷移,實時產生的數據也要無縫同步到mysql。另外,除了要保障數據同步的實時性,還要保證數據的正確性,以及SqlServer和MySql數據的一致性。
3. MySql和ES主備集群方案
五、異常會員關係治理
六、展望:更精細化的流控和降級策略
1. 更精細化的流控策略
2. 更精細化的降級策略
本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/ES_Redis_MySQL-this-highly-available-architecture-design-is-too-top-notch.html