ShardingSphere 異構遷移最佳實踐:將3.5億量級的顧客系統 RTO 減少60倍

来源:https://www.cnblogs.com/sphereex/archive/2022/06/13/16371022.html
-Advertisement-
Play Games

Apache ShardingSphere 助力噹噹 3.5 億用戶量級顧客系統重構,由 PHP+SQL Server 技術棧無縫轉型為 Java+ShardingSphere+MySQL,性能、可用性及維護性均得到顯著提升,是 ShardingSphere 異構遷移最佳實踐。 ...


Apache ShardingSphere 助力噹噹 3.5 億用戶量級顧客系統重構,由 PHP+SQL Server 技術棧無縫轉型為 Java+ShardingSphere+MySQL,性能、可用性及維護性均得到顯著提升,是 ShardingSphere 異構遷移最佳實踐。

1  顧客系統背景

噹噹顧客系統主要負責賬戶的註冊、登錄、隱私數據維護等功能,歷史技術棧為 PHP+SQL Server,是標準的集中式架構,如下圖。

重構項目啟動前,顧客系統的數個業務模塊存在多個棘手的業務問題和技術挑戰,如邏輯分散、吞吐量低及運維成本高等問題。為改善顧客的購物體驗,噹噹技術團隊決定對業務邏輯和底層數據架構進行優化,實現顧客系統多場景下的可用性、擴展性及綜合提升等多個目標。在重構過程也實現了眾多技術創新,如跨數據源雙寫、讀寫分離、智能網關及灰度發佈等技術。

從需求設計、分庫分表規劃、邏輯優化、壓測再到完全上線等多個環節,噹噹技術團隊用半年的時間完成了基於 3.5 億+用戶的系統重構。

使用 Java 語言重構十餘個模塊,通過 ShardingSphere+ MySQL 構建分散式資料庫解決方案,順利完成異構資料庫線上遷移,案例亮點如下。

  • 使用 Java 語言重構 PHP 業務代碼;

  • 使用 ShardingSphere+MySQL 替換 SQL Server;

  • 線上完成 3.5 億用戶數據完整遷移;

  • 通過數據雙寫方案完成無縫上線。

2  痛點&挑戰

業務痛點

在業務層面,顧客系統部分模塊的註冊和登錄邏輯分散在各端,維護成本較高,且當時的技術架構對於性能的提升和高可用性存在著很大的局限性。

  • 不易維護:多平臺註冊和登錄邏輯較為分散,業務維護複雜;

  • 性能受限:PHP+SQL Server 集中式技術架構,吞吐量不足;

  • 可用性&安全性差

  • SQL Server 主備狀態變化後,訂閱庫會失效,重新配置需要視窗時間;

  • SQL Server 運行在 Windows Server 上,病毒影響導致安全性差,且打補丁後升級啟動時間長(>30min)。

挑戰

  • 數據完整性

顧客系統擁有 3.5 億+ 用戶數據,在數據遷移過程中,需保證數據從 SQL Server 遷移到 MySQL 後的一致性及完整性;

  • API 透明

API 對調用方保持透明,確保調用方無改動,最小化變更界面;

  • 無縫切換

需要滿足業務系統無縫切換,切換過程對業務無影響;

  • 時間緊迫

“618”和“11.11”促銷活動前後會封網,因此需在兩大促活動間、有限視窗的時間內完成切換,並緊接著面對“11.11”的驗證。

3  解決方案

整體規劃

為了改善顧客系統的可維護性、可用性及性能,研發團隊重新梳理顧客系統的架構。

在應用層,統一各端的功能邏輯,提升業務可維護性。在資料庫層,將集中式架構調整為分散式資料庫架構,提升性能及可用性,即 ShardingSphere+MySQL 構建的開源分散式解決方案。

  • 應用層:隨噹噹整體技術棧的變遷,業務開發語言由 PHP 轉為 Java;

  • 中間件:使用成熟的開源資料庫中間件 ShardingSphere 實現分庫分表;

  • 資料庫:使用多套 MySQL 集群代替 SQL Server 資料庫。

在整體架構設計上,引入了分散式主鍵生成策略、分片管理、數據遷移校驗以及灰度發佈等多個方案。

分散式主鍵生成策略

資料庫架構由集中式轉型為基於中間件的分散式架構,分散式主鍵生成策略是首先需要考慮解決問題。在系統重構中,選擇建立兩台以上的資料庫 ID 生成伺服器,每台伺服器都有一張記錄各表當前 ID 的 Sequence 表,Sequence 中 ID 增長的步長是伺服器的數量。起始值依次錯開,這樣相當於把 ID 的生成散列到了每台伺服器節點上。

分片(ShardingSphere)

在顧客系統重構中,通過 Apache ShardingSphere 完成資料庫 Sharding,同時也啟用了讀寫分離功能。

由於顧客系統在高併發、低延時的要求,接入端選擇了 ShardingSphere-JDBC,它定位為輕量級 Java 框架,在 Java 的 JDBC 層提供的額外服務。它使用客戶端直連資料庫,以 jar 包形式提供服務,無需額外部署和依賴,可理解為增強版的 JDBC 驅動,完全相容 JDBC 和各種 ORM 框架。

  • Sharding

ShardingSphere 支持非常全面的分片演算法,包括取模、哈希、範圍、時間及自定義等演算法,顧客系採用取模分片演算法對大表進行拆分。

  • 讀寫分離

除了 Sharding,同時還啟用 ShardingSphere 讀寫分離功能,充分利用 MHA 集群資源,提升系統吞吐能力。

雙寫&數據同步

數據同步貫穿了整個重構項目,數據遷移的完整性及數據一致性是重構的關鍵。

該案例基於 Elastic-Job 同步歷史數據,以周期的方式將 SQL Server 的歷史數據同步到 MySQL 中。

關於資料庫切換方面,在切換過程中會採用備份方案,進行資料庫的雙寫,保證切換前後的數據一致性,過程如下。

第 1 步:實現雙寫機制

斷掉鏈路 1,打通鏈路 2、3、4,打通鏈路 9、10。

第 2 步:切換登錄服務

斷掉鏈路 9,10,打通鏈路 7,斷掉鏈路 5。

第 3 步:切換讀服務

打通鏈路 8,斷掉鏈路 6。

第 4 步:取消雙寫機制

斷掉鏈路 2,完成切換。

在數據校驗方面,通過業務側和資料庫側兩個方面進行驗證,均周期性進行檢查,在不同時間段採用不同的頻率,抽樣或全量檢查數據的完整性,在資料庫側也會進行 COUNT/SUM 的驗證。

顧客系統重構使用了基於 apollo 的灰度發佈方式,在新登錄方式的處理上,通過配置項逐步放開、小範圍陸續割接,確保上線成功率。重構後的系統架構如下圖。

4  用戶收益

經過重構,噹噹顧客系統響應速度明顯提升,同時也降低了日常運維成本,ShardingSphere 提供的分散式解決方案功不可沒。該方案適用於各種高流量的互聯網平臺服務,也適用於電商平臺以及其他以數據處理為主的系統。

  • 性能提升,響應速度提升 20% 以上;

  • 可用性增強,ShardingSphere+MySQL 的方案實現 RTO<30s;

  • 易於維護,業務邏輯以及資料庫的可維護性明顯提升;

  • 無縫遷移,6 個月內線上完成各模塊割接,視窗時間為零。

5  總結

在“ShardingSphere 助力噹噹 WMS:訂單效率提升 30%、節約成本上千萬”案例之後,這是第二篇 ShardingSphere 在噹噹的實踐案例。

Apache ShardingSphere 為業務系統提供了強力的支撐。簡單與極致,是 ShardingSphere 突出的兩個特性,讓業務邏輯更簡單,讓性能更極致。

Apache ShardingSphere 社區已在開源領域耕耘了 7 年的時間。長久的堅持,使社區愈加成熟,已呈開放和多元化的勢態。我們誠心歡迎有開源情懷和編碼熱情的朋友一起參與社區共建,也歡迎您提供優質案例內容分享給社區的朋友們。

如果大家對 Apache ShardingSphere 有任何疑問或建議,歡迎在 GitHub Issue 列表提出,或可前往中文社區交流討論。

GitHub Issue:https://github.com/apache/shardingsphere/issues

貢獻指南:https://shardingsphere.apache.org/community/cn/contribute/

中文社區:https://community.sphere-ex.com/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文是clickhouse專欄第五篇,更多內容請關註本號歷史文章! 一、數據類型表 clickhouse內置了很多的column數據類型,可以通過查詢system.data_type_families這張表獲取版本的所有支持的數據類型。下文中第一列是欄位類型,第二列表示該類型的欄位類型是否區分大小寫 ...
  • #region 輸入數字判斷是否是數字 #region 方法實現 /*不管是實參或形參,都在類型中開闢了空間的; 方法的功能一定要單一; 如GetMax(int n1,int n2); 方法中最忌諱的就是提示用戶輸入的字眼。 ///PS:最新版的沒有namespace這些,目前我想到的調用方法和類就 ...
  • #region 調用 /* 我們在main函數中調用Test()函數,我們管main函數稱為調用者, Test函數稱為被調用者. 如果被調用者想要得到調用者的值: 1) 傳遞參數; 2) 使用靜態欄位來模擬全局變數; 如果調用者想要得到被調用者的值: 1) 返回值; */ #endregion na ...
  • #region 複習 /* 常量:一旦賦值,不能被重新賦值; 枚舉:規範開發; 結構:為了一次性聲明多個不同類型的變數(實際為欄位); 數組:為了一次性聲明多個相同類型的變數 通過下標或索引訪問數組中元素 數組的取值和賦值 冒泡排序:兩個for迴圈 Array.Sort(nums);Array.Re ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 1.先查看本機的系統信息 [root@h0436 h0436 zlong]# cat /etc/redhat-release 2.進入yum.repos.d [root@h0436 zlong]# cd /etc/yum.repos.d 3.查看 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 ifconfig 命令可以用於查看、配置、啟用或禁用指定的網路介面,還可以用來配置網卡的IP地址、掩碼、廣播地址、網關等,功能很豐富 功能雖然豐富,但是如果你沒有安裝呢? 嘿嘿嘿 如果沒有安裝ifconfig管理命令的話,直接運行ifconfig ...
  • 好消息!6月13日,騰訊雲資料庫三篇論文再次入選資料庫行業頂會SIGMOD,被SIGMOD 2022 Research Full Paper(研究類長文)收錄。 本次被收錄的研究成果中,新型數據結構設計、AI智能調參優化等均屬於業界首次提出。騰訊雲資料庫多次入選SIGMOD,表明騰訊雲資料庫在存儲、 ...
  • 本文將會和大家一起學習 SQL 的搜索條件中不可或缺的工具——謂詞(predicate)。SQL 謂詞就是返回值為 TRUE、FALSE 或 UNKNOWN 的表達式。 謂詞用於 WHERE 子句 和 HAVING 子句 的搜索條件中,還用於 FROM 子句的聯接條件以及需要布爾值的其他構造中。 本 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...