作者:楊濤濤
今天有客戶問起:如何匯總多臺 MySQL 數據到一臺上?
我回答:可以嘗試下 MySQL 的多源復制。
我們知道 MySQL 單主一從,單主多從,或者級聯的主從架構我們都見的很多了。但是多主一從這種使用場景比較少,比如圖 1:
這種架構一般用在以下三類場景
1. 備份多臺 Server 的數據到一臺
如果按照數據切分方向來講,那就是垂直切分。比如圖 2,業務 A、B、C、D 是之前拆分好的業務,現在需要把這些拆分好的業務匯總起來備份,那這種需求也很適用于多源復制架構。
實現方法我大概描述下:業務 A、B、C、D 分別位于 4 臺 Server,每臺 Server 分別有一個數據庫來隔離前端的業務數據,那這樣,在從庫就能把四臺業務的數據全部匯總起來,而不需要做額外的操作。那沒有多源復制之前,要實現這類需求,只能在匯總機器上搭建多個 MySQL 實例,那這樣勢必會涉及到跨庫關聯的問題,不但性能急劇下降,管理多個實例也沒有單臺來的容易。
2. 用來聚合前端多個 Server 的分片數據。
同樣,按照數據切分方向來講,屬于水平切分。比如圖 3,按照年份拆分好的數據,要做一個匯總數據展現,那這種架構也非常合適。
實現方法稍微復雜些:比如所有 Server 共享同一數據庫和表,一般為了開發極端透明,前端配置有分庫分表的中間件,比如愛可生的 DBLE。
3. 匯總并合并多個 Server 的數據
第三類和第一種場景類似。不一樣的是不僅僅是數據需要匯總到目標端,還得合并這些數據,這就比第一種來的相對復雜些。比如圖 4,那這樣的需求,是不是也適合多源復制呢?答案是 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)
那上面幾張表的數據如果要合并到表 A,可以建立一個 Event,定時的來給表 A 里插入數據。涉及到的核心 SQL 為:
那我們發現這個和第一個類似,只不過,所有的表最后到復制到了相同的數據庫里。
總結下,我上面簡單說明了 MySQL 多源復制的三種常用使用場景,希望對大家有所幫助。