作者:楊濤濤
今天有客戶問起:如何匯總多臺 MySQL 數(shù)據(jù)到一臺上?
我回答:可以嘗試下 MySQL 的多源復(fù)制。
我們知道 MySQL 單主一從,單主多從,或者級聯(lián)的主從架構(gòu)我們都見的很多了。但是多主一從這種使用場景比較少,比如圖 1:

這種架構(gòu)一般用在以下三類場景
1. 備份多臺 Server 的數(shù)據(jù)到一臺
如果按照數(shù)據(jù)切分方向來講,那就是垂直切分。比如圖 2,業(yè)務(wù) A、B、C、D 是之前拆分好的業(yè)務(wù),現(xiàn)在需要把這些拆分好的業(yè)務(wù)匯總起來備份,那這種需求也很適用于多源復(fù)制架構(gòu)。
實現(xiàn)方法我大概描述下:業(yè)務(wù) A、B、C、D 分別位于 4 臺 Server,每臺 Server 分別有一個數(shù)據(jù)庫來隔離前端的業(yè)務(wù)數(shù)據(jù),那這樣,在從庫就能把四臺業(yè)務(wù)的數(shù)據(jù)全部匯總起來,而不需要做額外的操作。那沒有多源復(fù)制之前,要實現(xiàn)這類需求,只能在匯總機器上搭建多個 MySQL 實例,那這樣勢必會涉及到跨庫關(guān)聯(lián)的問題,不但性能急劇下降,管理多個實例也沒有單臺來的容易。

2. 用來聚合前端多個 Server 的分片數(shù)據(jù)。
同樣,按照數(shù)據(jù)切分方向來講,屬于水平切分。比如圖 3,按照年份拆分好的數(shù)據(jù),要做一個匯總數(shù)據(jù)展現(xiàn),那這種架構(gòu)也非常合適。
實現(xiàn)方法稍微復(fù)雜些:比如所有 Server 共享同一數(shù)據(jù)庫和表,一般為了開發(fā)極端透明,前端配置有分庫分表的中間件,比如愛可生的 DBLE。

3. 匯總并合并多個 Server 的數(shù)據(jù)
第三類和第一種場景類似。不一樣的是不僅僅是數(shù)據(jù)需要匯總到目標端,還得合并這些數(shù)據(jù),這就比第一種來的相對復(fù)雜些。比如圖 4,那這樣的需求,是不是也適合多源復(fù)制呢?答案是 YES。

那具體怎么做呢?
我舉個例子,比如下面一張表 A,字段分表為 ID(主鍵)、F1、F2、F3... 、F100。那按照這樣的分法,前端 4 臺 Server 的表分別為:
- A1(ID,F1,F2,...,F25)
- A2(ID,F26,F27,...,F50)
- A3(ID,F51,F52,...,F75)
- A4(ID,F76,F77,...,F100)
那上面幾張表的數(shù)據(jù)如果要合并到表 A,可以建立一個 Event,定時的來給表 A 里插入數(shù)據(jù)。涉及到的核心 SQL 為:
那我們發(fā)現(xiàn)這個和第一個類似,只不過,所有的表最后到復(fù)制到了相同的數(shù)據(jù)庫里。
總結(jié)下,我上面簡單說明了 MySQL 多源復(fù)制的三種常用使用場景,希望對大家有所幫助。