Shopify如何對商店MySQL實現K8S的Pod分片平衡?
Shopify 的基礎設施為數百萬商家的創業之旅提供支援。當前基礎設施的一個關鍵組成部分是底層的 MySQL 資料庫分片,它們共同儲存每個商店的關鍵資料。隨著流量模式的變化和新商家加入平臺,資源密集型商店有可能最終生活在同一個分片中。某些資料庫分片在其資料庫利用率、商店流量和負載方面變得不平衡。重要的是要確保分片保持良好平衡,以降低資料庫故障的風險,提高更廣泛基礎設施的生產力,並最終保證買家始終可以訪問他們最喜歡的商店。
要全面瞭解分片平衡,簡要回顧一下 Shopify 的架構會有所幫助。Shopify 的應用程式執行時目前是poded:基礎設施由許多pod 組成(不要與Kubernetes Pods 混淆)。Pod 是 Shopify 的一個獨立例項,由一個單獨的 MySQL 資料庫分片以及其他資料儲存(如 Redis 和 Memcached)組成。每個 pod 都包含平臺上獨特的商店子集。商店的 Web 請求由負載均衡器處理,該負載均衡器查詢路由表並將請求轉發到基於商店的正確 Pod。
分片資料庫拓撲支援 Pod 應用程式執行時:每個 Pod 由其自己的分片組成。Shopify 的資料模型非常適合這種拓撲結構,因為它shop是大多數資料模型的標識實體。我們可以將 a 附加shop_id到所有商店擁有的表,並將其用作分片鍵。將商店從一個分片移動到另一個分片涉及從所有表中選擇所有具有所需記錄的記錄shop_id並將它們複製到另一個 MySQL 分片。對於這篇文章,將每個 pod 視為一個 MySQL 分片會很有幫助。
分片再平衡策略
當新商家在平臺上註冊並加入時,他們會被分配到任意一個分片。隨著時間的推移,這些商家的規模不斷擴大。某些資源密集型商店可能最終生活在相同的分片中,導致某些分片的資料庫使用率較高而其他分片的資料庫使用率較低。資料庫使用中的這些不一致削弱了基礎設施,原因有兩個。首先,高流量分片由於可能過度使用而面臨更大的故障風險。其次,資料庫使用率低的分片沒有得到有效使用。
為了平滑分片之間的負載,我們需要重新平衡它們。我們將平衡的基礎架構定義為所有 pod 都健康且其分片得到有效利用的基礎架構。為了實現這種平衡的基礎架構,我們需要一種策略來實現跨分片的商店的持續重新分配。
在設計這種分片平衡策略時,很明顯有兩個問題需要解決:
- 哪些商店應該住在哪些分片中?
- 商店如何在儘可能少的停機時間的情況下從一個分片轉移到另一個分片?
哪些商店應該住在哪些碎片中?
根據商店數量在分片上分佈商店並不是一個好的策略,因為每個商店中的資料大小各不相同。以前使用的一種策略是分析分片的歷史資料庫利用率和流量資料,並根據它們的使用模式(即high_traffic, low_traffic,等)建立分類。適用的商店在這些分片佇列之間遷移,使用的方案是將每 N 家商店從一個high_traffic分片移動到另一個分low_traffic片。擬議的舉措進行了模擬,其預測效果用於驗證假設。
雖然這種策略很有效,但它並不是唯一的策略。放置策略可以任意複雜並優先考慮不同的指標(例如,商店規模、GMV、移動時間、閃購等)。通常會提出多個假設並根據最新資料進行檢驗。一旦確定了理想的商店分佈,就會生成一個商店移動列表,以實現我們系統的理想狀態。
商店如何移動?
瞭解哪些商店需要在哪些分片中居住後,移動商店的過程就可以開始了。當我們很快佈局時,將商店從其源分片移動到所需的目標分片可能是一個複雜的過程。由於對我們使用的策略施加了一些關鍵限制,因此它特別令人感興趣。
- 可用性:商店搬家必須完全線上。這確保商家和更廣泛的平臺不會招致明顯的停機時間。當資料從源資料庫分片移動到目標資料庫分片時,商家的店面必須可以進行互動。
- 資料完整性:移動過程中沒有資料丟失或損壞。該過程必須確保將移動開始時存在的所有資料複製到目標分片。此外,它必須確保複製自移動開始以來對源資料庫的所有寫入。
- 吞吐量:將資料從一個分片移動到另一個分片的過程必須及時,並允許合理的吞吐量。商店規模各不相同,因此一次遷移其中許多商店不應對基礎設施造成過度壓力。
為了幫助描述店鋪移動,我們定義了一個虛構的場景:Paarth 的 Peppy Peppers和Xiaoli 的 Xylophones是我們平臺上的兩個高流量商家。這兩家商店目前都在 Pod 1 上。我們的資料科學與工程團隊得出結論,將這兩個商家放在同一個 pod 上並不是最佳選擇。資料庫利用率極高,來自這兩家商戶的突發流量是同步的。Paarth和小麗好像是同一天限時搶購哦!該團隊建議將Paarth 的 Peppy Peppers移動到 Pod 2。我們將探索Paarth 的 Peppy Peppers如何進入 Pod 2 的端到端過程。
詳細點選標題
相關文章
- 在K8S中,Pod 如何實現對節點的資源控制?K8S
- Shopify如何在商店應用上實現伺服器驅動的UI架構?伺服器UI架構
- 分片叢集平衡器Balancer
- Mycat中介軟體實現Mysql資料分片(上篇)MySql
- Mycat中介軟體實現Mysql資料分片( 下篇)MySql
- k8s podK8S
- k8s 實戰 2 ---- pod 基礎K8S
- 關於負載平衡和分片 - Tim Bray負載
- Shopify如何解決資料發現的挑戰
- Shopify如何使用Ruby實現每小時銷售1億美元?
- K8S系列學習之Pod實戰K8S
- 技術週刊的轉變:如何平衡熱愛與現實?
- 深入掌握K8S PodK8S
- k8s~pod單副本的平滑部署K8S
- Go實現對MySQL的增刪改查GoMySql
- shopify 如何獲取 apikeyAPI
- 在K8S中,Requests 和 Limits 如何影響 Pod 的排程?K8SMIT
- MySQL 06 mysql 如何實現類似 oracle 的 merge intoMySqlOracle
- linux實現DNS輪詢實現負載平衡LinuxDNS負載
- k8s基本單位PodK8S
- k8s之pod講解K8S
- k8s學習 - 概念 - PodK8S
- k8s之pod排程K8S
- Shopify網店的資料如何分析?
- pod 的高階實現汙點親密性探針的實現
- 如何收集pod重啟前現場
- 每秒570000的寫入,MySQL如何實現?MySql
- MySQL是如何實現事務的ACIDMySql
- MySQL 每秒 570000 的寫入,如何實現?MySql
- MySQL 是如何實現資料的排序的?MySql排序
- k8s pod狀態有哪些K8S
- k8s入門之pod(四)K8S
- k8s之深入解剖Pod(三)K8S
- k8s之深入解剖Pod(一)K8S
- k8s之深入解剖Pod(二)K8S
- k8s中pod滾動更新如何減少流量丟失K8S
- k8s裡node 當機後如何提高pod遷移速度K8S
- Kubenetes裡pod和service繫結的實現方式