數據分庫分表和遷移方案

在我們業務快速發展的過程中,數據量必然也會迎來突飛猛漲。那么當我們的數據量百倍、千倍、萬倍、億倍增長后,原有的單表性能就不能滿足我們日常的查詢和寫入了,此時數據架構就不得不進行拆分,比如單表拆分成10張表、100張表、單個月分多張表等等。下面我們針對具體案例分析下這種情況。

一、現狀分析

直播簽到業務中,有如下兩張表,簽到表和用戶簽到記錄表。其中用戶簽到記錄表t_sign_in_record現有數據量達到了18億,數據占用空間為233G,索引占用空間為310G,總占用空間為543G。單表數據量太大,導致數據查詢和寫入性能過低。如果某條sql查詢未使用到索引,很容易就會將數據庫打掛。所以對t_sign_in_record的單表拆分很迫切

CREATE TABLE `t_sign_in` (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵自增id',`sign_in_id` varchar(64) NOT NULL DEFAULT '' COMMENT '簽到id',`shop_id` varchar(64) NOT NULL DEFAULT '' COMMENT '商家id',`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',PRIMARY KEY (`id`),KEY `idx_shop_sign` (`shop_id`,`sign_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='簽到表';CREATE TABLE `t_sign_in_record` (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵自增id',`sign_in_id` varchar(64) NOT NULL DEFAULT '' COMMENT '簽到id',`shop_id` varchar(64) NOT NULL DEFAULT '' COMMENT '商家id',`user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '用戶id',`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',PRIMARY KEY (`id`),KEY `idx_shop_sign_user` (`shop_id`,`sign_id`,`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用戶簽到記錄表';

二、數據庫設計

1、分表實例:依現有的存儲空間做10倍的余量參考,所需空間大小為5.3T左右。而騰訊云MySQL最高支持存儲空間上限是6TB,所以原有的騰訊云MySQL實例能滿足需求。如果數據量更大,超過6TB的話,可以考慮將數據庫遷移至TDSQL-C MySQL 版,最高支持至400TB。參考文檔:https://cloud.tencent.com/document/product/1003/30488

2、分表數量:按照業務增長規模,每個月增量7千萬-1億,預計分10張表,平均單表數量在700萬-1000萬左右

3、分表算法:根據簽到表t_sign_in的created_at中的年月日做如下算法,能讓數據較均勻的落入每個月的10個分表中。分表的10張表名為t_sign_in_record_0、t_sign_in_record_1…t_sign_in_record_9
在這里插入圖片描述

三、遷移方案

1、第一階段:
雙寫數據,即將數據同時寫入舊表t_sign_in_record和分表t_sign_in_record_0、t_sign_in_record_1、t_sign_in_record_2…中,此時需要去代碼層創建和更新t_sign_in_record表的地方做處理,寫入舊表的同時,寫一份數據到新的分表。

2、第二階段:
雙寫數據一致性校驗,經過第一階段的雙寫后,我們的新數據已經同時存在于新表和舊表中了,這個時候需要去check一下數據在舊表t_sign_in_record和分表t_sign_in_record_0…中是不是保持一致。有兩個常用的檢驗方法:
(1)第一種是人工校驗,即隨機挑選一些簽到,去check對應的簽到記錄條數和數據記錄是否一致;
(2)另一種是寫腳本去校驗(全量數據或部分數據),將其中新老表中數據不匹配的記錄輸出到日志中,再去排查。

3、第三階段:
寫腳本,將舊表t_sign_in_record的存量數據都刷到分表t_sign_in_record_0…中。

4、第四階段:
跟第二階段的方式一樣,去check第三階段刷入的分表存量數據是否和舊表一致

5、第五階段:
切讀,將現網讀 t_sign_in_record 表的地方都改為讀新分表 t_sign_in_record_0、t_sign_in_record_1、t_sign_in_record_2…

6、第六階段:
確認舊表 t_sign_in_record沒有新的讀請求。可通過DBA審計的方式。

7、第七階段:
停止雙寫,即將代碼改為只往新分表 t_sign_in_record_0、t_sign_in_record_1、t_sign_in_record_2… 里面寫數據。

如上所述,遷移方案大概分為7個階段,其中有三個階段都是check數據一致性,在實際遷移時可以和其它步驟同時進行。拆分的整體時間周期一般為半個月到一個月之間,主要是其中為了確保數據一致性,需要灰度比較久

上面就是我們工作中常用的數據庫表遷移方案了,有同學可能會甩鍋給最初設計庫表的同學,為啥當初設計的時候不考慮下分表呢?其實,這個是很難預估的,誰能知道最初一年只有幾萬數據的簽到業務,現在每年會新增十來億呢?這個主要取決于公司的發展了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66734.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66734.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66734.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

線上突發:MySQL 自增 ID 用完,怎么辦?

線上突發:MySQL 自增 ID 用完,怎么辦? 1. 問題背景2. 場景復現3. 自增id用完怎么辦?4. 總結 1. 問題背景 最近,我們在數據庫巡檢的時候發現了一個問題:線上的地址表自增主鍵用的是int類型。隨著業務越做越…

[Java] Solon 框架的三大核心組件之一插件擴展體系

1、Solon 的三大核心組件 核心組件說明Plugin 插件擴展機制提供“編碼風格”的擴展體系Ioc/Aop 應用容器提供基于注入依賴的自動裝配體系ContextHandler 通用上下文處理接口提供“開放式處理”適配體系(俗稱,三元合一) 2、Solon Plugin 插件…

TRELLIS微軟的圖生3D

TRELLIS 教程目錄: Youtube:https://www.youtube.com/watch?vJqFHZ-dRMhI 官網地址:https://trellis3d.github.io/ GitHub:https://github.com/Microsoft/TRELLIS 部署目錄: 克隆項目 git clone --recurse-submodul…

Java導出通過Word模板導出docx文件并通過QQ郵箱發送

一、創建Word模板 {{company}}{{Date}}服務器運行情況報告一、服務器:總告警次數:{{ServerTotal}} 服務器IP:{{IPA}},總共告警次數:{{ServerATotal}} 服務器IP:{{IPB}},總共告警次數:{{ServerBTotal}} 服務器IP:{{IPC}}&#x…

【22】Word:小李-高新技術企業政策?

目錄 題目? NO1.2 NO3 NO4 NO5.6 NO7.8 NO9.10 若文章中存在刪除空白行等要求,可以到最后來完成。注意最后一定要檢查此部分!注意:大多是和事例一樣即可,不用一摸一樣,但也不要差太多。 題目 NO1.2 F12Fn&a…

自動化部署(三):項目管理平臺

一、項目管理平臺作用 幫助團隊高效規劃、執行和監控項目進度,確保任務按時完成并實現目標 敏捷開發:提供標準敏捷研發管理,支持Scrum 與 Kanban 規模化敏捷:支持大型研發團隊跨項目協同,實現多項目路線圖規劃和資源管…

常用集合-數據結構-MySql

目錄 java核心: 常用集合與數據結構: 單例集合: 雙列集合: 線程安全的集合: ConcurrentHashMap集合: HashTable集合: CopyOnWriteArrayList集合: CopyOnWriteArraySet集合: ConcurrentLinkedQueue隊列: ConcurrentSkipListMap和ConcurrentSkipListSet&…

IP屬地與視頻定位位置不一致:現象解析與影響探討

在數字化時代,IP屬地和視頻定位位置已成為我們獲取網絡信息、判斷內容真實性的重要依據。然而,有時我們會發現,某些視頻內容中展示的定位位置與其發布者的IP屬地并不一致。這種不一致現象引發了廣泛的關注和討論。本文旨在深入剖析IP屬地與視…

計算機畢業設計hadoop+spark股票基金推薦系統 股票基金預測系統 股票基金可視化系統 股票基金數據分析 股票基金大數據 股票基金爬蟲

溫馨提示:文末有 CSDN 平臺官方提供的學長聯系方式的名片! 溫馨提示:文末有 CSDN 平臺官方提供的學長聯系方式的名片! 溫馨提示:文末有 CSDN 平臺官方提供的學長聯系方式的名片! 作者簡介:Java領…

機器學習-數據集劃分

文章目錄 一. 為什么要劃分數據集二. 數據集劃分的方法1. 留出法:2. 交叉驗證:將數據集劃分為訓練集,驗證集,測試集3. 留一法:4. 自助法: 一. 為什么要劃分數據集 為了能夠評估模型的泛化能力,可…

根據當前用戶的活動、當地天氣和喜歡音樂類型,然后根據這些信息來播放相應的Spotify音樂 附python代碼

這段代碼是一個Python腳本,它使用了幾個外部庫來創建一個簡單的圖形用戶界面(GUI),讓用戶根據當前用戶的活動、當地天氣和喜歡音樂類型,然后根據這些信息來播放相應的音樂。 1. **導入庫**: - `openai`:用于與OpenAI API交互(盡管在這段代碼中沒有使用)。 - `sp…

excel導入數據處理前端

dialogErrorVisible false;dialogErrorTitle ;//錯誤標題public get gridErrorOptions(): GridOptions {return {headerHeight: 30, // 表頭高度rowHeight: 30, // 行高columnDefs: [//列定義{headerName: "序號",field: "SerialNumber",width: 40,pinne…

Vue 攔截監聽原理

Vue 漸進式JavaScript 框架 學習筆記 - Vue 攔截監聽原理 目錄 攔截監聽原理 如何跟蹤變化 攔截監聽示例 觀察者 注意:vue3的變化 總結 攔截監聽原理 如何跟蹤變化 當你把一個普通的Javascript 對象傳入 Vue 實例作為data選項,Vue 將遍歷此對象所有的proper…

全面評測 DOCA 開發環境下的 DPU:性能表現、機器學習與金融高頻交易下的計算能力分析

本文介紹了我在 DOCA 開發環境下對 DPU 進行測評和計算能力測試的一些真實體驗和記錄。在測評過程中,我主要關注了 DPU 在高并發數據傳輸和深度學習場景下的表現,以及基本的系統性能指標,包括 CPU 計算、內存帶寬、多線程/多進程能力和 I/O 性…

基于JAVA的校園二手商品交易平臺的設計與開發

摘 要:政府政策引導與社會觀念的轉變使得國內大學生的創業意識逐漸提高,很多高校大學生開始自主創業。目前我國各大高校暫且還沒有較為成型的針對校內學生創業者的校園網絡服務平臺。本文首先主要是介紹了關于java語言以及web開發的相關技術,…

HarmonyOS Next 應用UI生成工具介紹

背景 HarmonyOS Next適配開發過程中難買難要參考之前邏輯,但是可能時間較長文檔不全,只能參考Android或iOS代碼,有些邏輯較重的場景還可以通過AI工具將Android 的Java代碼邏輯轉成TS完成部分復用。對于一些UI場景只能手動去寫,雖…

總結6..

背包問題的解決過程 在解決問題之前,為描述方便,首先定義一些變量:Vi表示第 i 個物品的價值,Wi表示第 i 個物品的體積,定義V(i,j):當前背包容量 j,前 i 個物品最佳組合對應的價值,同…

代碼隨想錄day1

704.二分查找&#xff1a; 1.左閉右閉 int search(vector<int>& nums, int target) {int right nums.size() - 1;int left 0;while(left < right){int middle left ((right - left) >> 1);if(nums.at(middle) target){return middle;}else if(nums[m…

四級詞匯第六期

1.accomplish 完成 2.implication 暗示 3.complicated 復雜的 4.extent 范圍 5.sufficient 充足的 6.remarkable 引人注目的 7.insight 洞察 8.executive 管理的 9.overlook 俯瞰 忽略 10.urge 渴望 激勵 11.urgent 緊急的 12.accumulate 積累 13.appreciate 賞識 …

OpenHarmony OTA升級參考資料記錄

OpenHarmony 作為一個開源分布式操作系統,通過其強大的 OTA(Over-The-Air)升級能力,為開發者和廠商提供了一套靈活而安全的系統升級方案。 OTA升級方式 根據升級包的應用方式,OpenHarmony 的 OTA 升級可以分為兩種:本地升級和網絡OTA升級。 本地升級 本地升級是將已制作…