天天看點

基于Shard-Jdbc分庫分表,資料庫擴容方案一、資料庫擴容二、擴容解決方案三、源代碼管理

本文源碼: GitHub·點這裡 || GitEE·點這裡

一、資料庫擴容

1、業務場景

網際網路項目中有很多“資料量大,業務複雜度高,需要分庫分表”的業務場景。

基于Shard-Jdbc分庫分表,資料庫擴容方案一、資料庫擴容二、擴容解決方案三、源代碼管理

這樣分層的架構

(1)上層是業務層biz,實作業務邏輯封裝;
(2)中間是服務層service,封裝資料通路;
(3)下層是資料層db,存儲業務資料;           

2、擴容場景和問題

當資料量持續新增,面臨着這樣一些需求,兩台資料庫無法容納,需要資料庫擴容,這裡選擇2台—擴容到3台的模式,如下圖:

基于Shard-Jdbc分庫分表,資料庫擴容方案一、資料庫擴容二、擴容解決方案三、源代碼管理

這樣擴容的問題

(1)分庫分表的政策導緻資料遷移量大;
(2)影響資料的持續服務性;
(3)指定時間完成,技術壓力大,容易導緻預想不到的錯誤;           

如何平穩不停機遷移資料,保證系統持續服務,是本文将要讨論的問題。

二、擴容解決方案

1、擴容方案圖解

基于Shard-Jdbc分庫分表,資料庫擴容方案一、資料庫擴容二、擴容解決方案三、源代碼管理
(1)分庫分表基于MySQL資料庫,使用shard-jdbc中間件
(2)該方案的思路整體基于SpringCloud微服務架構           

2、解決擴容問題

(1)擴容情況下不需要暫停服務;
(2)資料遷移的壓力小,不需要指定時間;           

3、資料通路層邏輯

基于Shard-Jdbc分庫分表,資料庫擴容方案一、資料庫擴容二、擴容解決方案三、源代碼管理

方案描述

基于兩台資料庫分庫分表,簡稱:服務二
基于三台資料庫分庫分表,簡稱:服務三
(1)提供兩套服務,服務二和服務三
(2)資料庫擴容後,如果通路服務三直接擷取到資料,流程結束。
(3)如果通路服務三擷取不到資料,則通路服務二擷取資料。
(4)在遷移開始的一段時間内,通路壓力還會在服務二上面。
(5)這樣就做到資料通路服務不會停機。
(6)這種通路模式基于SpringCloud很容易做到。           

4、資料遷移層邏輯

基于Shard-Jdbc分庫分表,資料庫擴容方案一、資料庫擴容二、擴容解決方案三、源代碼管理
(1)關閉基于兩台庫的資料入庫流程
(2)開啟基于三台庫的資料入庫流程,這樣新入庫資料就可以被服務三直接通路到。
(3)開發資料遷移中間件,掃描原先兩台庫的資料。
(4)掃描的資料根據分三台庫政策判斷是否需要遷移。
(5)如果資料需要遷移,則調用服務三的資料入庫接口。
(6)資料遷移完成後,删除原來的位置的資料。
(7)這種遷移模式基于SpringCloud很容易做到。           

5、該方案遷移的優點

(1)整個過程是持續對線上提供服務;
(2)資料遷移中間件的開發複雜度較低; 
(3)可以限速慢慢遷移,沒有時間壓力;           

三、源代碼管理

GitHub·位址
https://github.com/cicadasmile/cloud-shard-jdbc
GitEE·位址
https://gitee.com/cicadasmile/cloud-shard-jdbc