mysql dcn_Tdsql DCN同步技术原理介绍
概述:
利用主從復(fù)制+
GTID
的特性實(shí)現(xiàn)異地?cái)?shù)據(jù)同步與讀寫分離。下面是實(shí)現(xiàn)細(xì)節(jié)與不同于常規(guī)方案的特性。
實(shí)現(xiàn)背景
是為了將分屬兩個(gè)不同集群的實(shí)例,建立同步關(guān)系。備實(shí)例會(huì)自動(dòng)選擇主實(shí)例中延遲較小的備機(jī)建立同步,當(dāng)該主實(shí)例備機(jī)發(fā)生故障時(shí),會(huì)自動(dòng)與另一個(gè)備機(jī)建立同步關(guān)系。
DCN同步建立后,主實(shí)例可寫,備實(shí)例只讀。這可作為一種異地容災(zāi)方案,也可作為一種異地讀寫方案
,參照
D
CN
技術(shù)分為兩步:
第一部分:
在主備機(jī)房中,如圖2
在主機(jī)房一主兩備中,master提交事務(wù)后,寫入binlog,通過mysql主從復(fù)制協(xié)議,master機(jī)將binlog傳輸?shù)饺我鈙lave機(jī),然后slave機(jī)回放relaylog,最終完成主從復(fù)制。第二部分:如圖1,主備機(jī)房完成建立DCN同步后,備機(jī)房的master機(jī)會(huì)從主機(jī)房中主備延遲最小的slave機(jī)上的拉取binlog,隨后回放binlog。
第
二
部分:
如果主機(jī)房當(dāng)前已經(jīng)建立DCN同步的slave機(jī)器故障了,會(huì)自動(dòng)與另一個(gè)備機(jī)建立同步關(guān)系如圖2
主從同步的方式實(shí)現(xiàn)異地容災(zāi)方案比較成熟,但仍需要解決一些核心問題。
1.
由于存在“級(jí)聯(lián)復(fù)制”的情況,那么如何準(zhǔn)備的計(jì)算延遲?
2.
如果實(shí)例需要進(jìn)行擴(kuò)容時(shí),同步關(guān)系是否收到影響,作為異地讀寫分離的場(chǎng)景,級(jí)聯(lián)節(jié)點(diǎn)數(shù)據(jù)延遲擴(kuò)大如何解決?
針對(duì)上述問題:
1.
計(jì)算延遲
a)
不采用
Seconds_Behind_Master
的值作為延遲依據(jù),主機(jī)
agent不停地向主機(jī)數(shù)據(jù)庫(kù)寫入帶有當(dāng)前時(shí)間戳的記錄,這些記錄會(huì)同步到備機(jī)數(shù)據(jù)庫(kù)中
備機(jī)的
agent根據(jù)數(shù)據(jù)庫(kù)中最新的記錄與機(jī)器當(dāng)前時(shí)間戳,就可以計(jì)算出實(shí)時(shí)延遲時(shí)間了
,然后備機(jī)
agent再將這些信息(包括實(shí)時(shí)延遲與延遲的主機(jī)信息)寫入到zk中,告知其它模塊
,而這些信也息作為scheduler仲裁擴(kuò)容的依據(jù)。
b)
如下圖延遲的計(jì)算過程,在擴(kuò)容的同步數(shù)據(jù)步驟中
M每寫入一條時(shí)間戳記錄,目標(biāo)實(shí)例中的所有節(jié)點(diǎn)都會(huì)同步到該條記錄,然后上報(bào)到zk中,當(dāng)scheduler發(fā)現(xiàn)所有節(jié)點(diǎn)的延遲小于5秒,且delayip都是M(這點(diǎn)主要是防止異常)時(shí),進(jìn)入到下一個(gè)流程
2.實(shí)例進(jìn)行擴(kuò)容的時(shí)候,集群具備自動(dòng)更新
dcn同步關(guān)系的功能,并且在擴(kuò)容過程中
不需要人為介入,減少了
延遲
得
影響
。由程序介入,并分拆為三步:
a)
建立原實(shí)例與目標(biāo)實(shí)例的同步關(guān)系
b)
檢測(cè)目標(biāo)實(shí)例與原實(shí)例之間的延遲,當(dāng)延遲小于
5S時(shí),設(shè)置原實(shí)例只讀,拒絕掉新的寫入
c)
檢測(cè)目標(biāo)實(shí)例與原實(shí)例之間的
gtid,當(dāng)gtid無差別時(shí),斷開原實(shí)例與目標(biāo)實(shí)例之間的同步關(guān)系,并將Proxy路由切換到目標(biāo)實(shí)例
d)
下圖表示利用D
CN
進(jìn)行集群擴(kuò)容的流程:
i.
MM表示主實(shí)例的主機(jī),MS表示主實(shí)例備機(jī),MSET表示主實(shí)例。SM表示備實(shí)例主機(jī),SS表示備實(shí)例備機(jī),SSET表示備實(shí)例。EMM表示主實(shí)例擴(kuò)容的目標(biāo)實(shí)例的主機(jī),EMS表示主實(shí)例擴(kuò)容的目標(biāo)實(shí)例的備機(jī),EMSET表示主實(shí)例擴(kuò)容的目標(biāo)實(shí)例。ESM表示備實(shí)例擴(kuò)容的目標(biāo)機(jī)器的主機(jī),ESS表示備實(shí)例擴(kuò)容的目標(biāo)機(jī)器的備機(jī),ESSET表示備實(shí)例擴(kuò)容的目標(biāo)實(shí)例
擴(kuò)容流程:
(
1)建立EMSET與MSET之間的擴(kuò)容同步關(guān)系。
(
2)檢測(cè)到EMSET與MSET之間的延遲小于5秒時(shí),斷開SSET與MSET之間的DCN同步關(guān)系。(
提前斷開是為了防止后續(xù)S
SET
的
GTID
的信息不被
EMSET
的
GTID
列表包含,這里的差異信息可能是
MM
節(jié)點(diǎn)與E
MSET
斷開后新寫入Z
K
的時(shí)間戳記錄
)
(
3)確認(rèn)SSET與MSET之間的DCN同步關(guān)系斷開后,設(shè)置MSET為隔離狀態(tài)(此時(shí)網(wǎng)關(guān)會(huì)拒絕掉所有新的連接),并向EMM節(jié)點(diǎn)的agent發(fā)送擴(kuò)容處理任務(wù)。
(
4)當(dāng)EMM節(jié)點(diǎn)的agent接收到scheduler發(fā)送的擴(kuò)容處理后,設(shè)置MM節(jié)點(diǎn)只讀,并計(jì)算EMM與MM節(jié)點(diǎn)gtid的差值,當(dāng)gtid無差值時(shí),反饋scheduler任務(wù)處理成功。如果期間設(shè)置只讀失敗,反饋sheduler處理失敗。
(
5)Scheduler根據(jù)agent反饋進(jìn)行區(qū)分處理,反饋成功進(jìn)入步驟6,反饋失敗進(jìn)入步驟7。
(
6)斷開EMSET與MSET之間的擴(kuò)容同步關(guān)系,返回?cái)U(kuò)容成功,并建立EMSET與SSET之間的DCN同步關(guān)系。
(
7)把MSET設(shè)置為正常狀態(tài)(網(wǎng)關(guān)正常接收新連接),返回?cái)U(kuò)容失敗,并重建MSET與SSET之間的DCN關(guān)系。
總結(jié)
以上是生活随笔為你收集整理的mysql dcn_Tdsql DCN同步技术原理介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EasyBoot使用方法
- 下一篇: SQL中COUNT的用法