1.前言
近期在做某一個數(shù)據(jù)中臺項(xiàng)目的架構(gòu)設(shè)計(jì)方案,其中有一個模塊需要使用到mysql來提供一些信息交互的聯(lián)機(jī)服務(wù),代替原先使用的公用的hbase集群,主要原因是公用的hbase作業(yè)進(jìn)程多,經(jīng)常會發(fā)生數(shù)據(jù)訪問延時(shí)(GC導(dǎo)致的)。改用mysql集群來對這部分服務(wù)提升響應(yīng)的穩(wěn)定性(查詢延時(shí)不超過100ms)。
Mysql的性能指標(biāo)要求是在規(guī)劃的單表5000w數(shù)據(jù)量的規(guī)模下,高并發(fā)查詢響應(yīng)延時(shí)不超過100ms。其中,mysql的初始化數(shù)據(jù)量級在1000w左右,需要從數(shù)據(jù)倉庫系統(tǒng)中同步過來,上線后每日同步增量數(shù)據(jù),并下發(fā)結(jié)果數(shù)據(jù)返回到數(shù)據(jù)倉庫中。
同時(shí),由于企業(yè)IT服務(wù)性質(zhì)要求mysql數(shù)據(jù)庫具有高可用性,7*24小時(shí)不停機(jī),當(dāng)發(fā)生故障時(shí),仍能正常提供服務(wù),并能恢復(fù)原樣。
經(jīng)過對需求的理解分析,在架構(gòu)設(shè)計(jì)方案中應(yīng)該要包括:
1. Mysql的高可用部署設(shè)計(jì)
2. Mysql大表拆分設(shè)計(jì)
3. Mysql的ETL設(shè)計(jì)
根據(jù)網(wǎng)上查的各類方案,針對這次項(xiàng)目的需求進(jìn)行方案的選型設(shè)計(jì)
2.高可用部署設(shè)計(jì)
2.1 方案選型
Mysql的高可用需求要求數(shù)據(jù)庫能夠支持7*24小時(shí)不停機(jī),當(dāng)故障發(fā)生時(shí)能夠?qū)崿F(xiàn)自動切換,保障服務(wù)正常,并能在主機(jī)故障回復(fù)后迅速恢復(fù)原樣。
Mysql的高可用部署大致上分兩類:雙機(jī)或多機(jī)熱備方案,分布式部署方案。 從使用工具上區(qū)分,一是利用mysql自有的半數(shù)據(jù)同步工具加keepalived軟件實(shí)現(xiàn)雙機(jī)主備,而是使用各種中間件來實(shí)現(xiàn)多機(jī)主備、主主、分布式等方案。
本項(xiàng)目中由于對數(shù)據(jù)庫服務(wù)穩(wěn)定性要求較高,數(shù)據(jù)量規(guī)模相對較大,因此建議基于中間件的一主多從部署架構(gòu)和一個開源分布式MYSQL數(shù)據(jù)庫TIDB,這兩種方案可以滿足高可用要求。
2.2.1 MHA+MYCAT部署一主多從方案
2.2.1.1 使用軟件說明
2.2.1.1.1 MHA
MHA Manager可以單獨(dú)部署在一臺獨(dú)立的機(jī)器上管理多個master-slave集群,也可以部署在一臺slave節(jié)點(diǎn)上。MHA Node運(yùn)行在每臺MySQL服務(wù)器上,MHA Manager會定時(shí)探測集群中的master節(jié)點(diǎn),當(dāng)master出現(xiàn)故障時(shí),它可以自動將最新數(shù)據(jù)的slave提升為新的master,然后將所有其他的slave重新指向新的master。整個故障轉(zhuǎn)移過程對應(yīng)用程序完全透明。
MHA(Master HA)是一款開源的 MySQL 的高可用程序,它為 MySQL 主從復(fù)制架構(gòu)提供了 automating master failover 功能。MHA 在監(jiān)控到 master 節(jié)點(diǎn)故障時(shí),會提升其中擁有最新數(shù)據(jù)的 slave 節(jié)點(diǎn)成為新的master 節(jié)點(diǎn),在此期間,MHA 會通過于其它從節(jié)點(diǎn)獲取額外信息來避免一致性方面的問題。MHA 還提供了 master 節(jié)點(diǎn)的在線切換功能,即按需切換 master/slave 節(jié)點(diǎn)。
MHA的目的在于維持主從復(fù)制中master節(jié)點(diǎn)的高可用性,其最大特點(diǎn)是可以修復(fù)多個slave節(jié)點(diǎn)之間的差異日志,最終使所有slave節(jié)點(diǎn)保持?jǐn)?shù)據(jù)一致,然后從中選擇一個作為新的master節(jié)點(diǎn),并將其它slave節(jié)點(diǎn)指向它。當(dāng)master節(jié)點(diǎn)出現(xiàn)故障時(shí),可以通過對比slave節(jié)點(diǎn)之間I/O線程讀取master節(jié)點(diǎn)二進(jìn)制日志的position事件位置,選取最接近的slave節(jié)點(diǎn)作為備選master節(jié)點(diǎn),其它的slave節(jié)點(diǎn)可以通過與備選master節(jié)點(diǎn)對比生成差異的中繼日志,在備選master節(jié)點(diǎn)上應(yīng)用從原來master節(jié)點(diǎn)保存的二進(jìn)制日志,同時(shí)將備選master節(jié)點(diǎn)提升為新的master節(jié)點(diǎn),最后在其它slave節(jié)點(diǎn)上應(yīng)用相應(yīng)的差異中繼日志并從新的master節(jié)點(diǎn)開始復(fù)制。
2.2.1.1.2 MYCAT
MYCAT是一款主要作為分布式數(shù)據(jù)庫系統(tǒng)的中間層,可以用來實(shí)現(xiàn)以下功能:
- 讀寫分離
- 負(fù)載均衡
- 數(shù)據(jù)庫的垂直拆分
- 數(shù)據(jù)庫水平拆分
在一主多從的部署方案中,主要用來是利用MYCAT的讀寫分離功能。
####### 2.2.1.2 架構(gòu)方案說明

(圖片中補(bǔ)充數(shù)據(jù)庫使用MHA做主從復(fù)制的方案)
使用MHA實(shí)現(xiàn)Mysql數(shù)據(jù)庫的自動故障切換,使用Mycat作為數(shù)據(jù)庫使用的中間件,實(shí)現(xiàn)應(yīng)用對接的主從庫配置。
一個主寫庫A多個從庫,當(dāng)主庫A故障時(shí),提升從庫B為主寫庫,同時(shí)修改C、D庫為B的從庫。A故障修復(fù)后,作為B的從庫。
主庫A故障后,Mycat會自動把從B提升為寫庫。而C、D從庫通過MHA自動修改其主庫為B。進(jìn)而實(shí)現(xiàn)自動切換的目地。
由于配置了多個讀節(jié)點(diǎn),讀并發(fā)的能力有了質(zhì)的提高,可以負(fù)載很高級別的讀并發(fā)。
在這種方案下,通過Mycat對Mysql的連接訪問實(shí)現(xiàn)了高可用方案,但相應(yīng)的需要對Mycat本身也做高可用部署設(shè)計(jì),因此需要使用Haproxy、keepalive結(jié)合實(shí)現(xiàn)。
在這種方案下,一主多從的部署架構(gòu)相當(dāng)于一個Mycat集群化部署的一個分片結(jié)構(gòu),后續(xù)基于這個架構(gòu)橫向擴(kuò)展,支持更大的業(yè)務(wù)體量。