本文介紹MGR中的流量控制(流控)是怎么工作的。

1. MGR流控

在MGR中,各個(gè)節(jié)點(diǎn)的事務(wù)處理能力不盡相同,這就可能會(huì)造成個(gè)別節(jié)點(diǎn)上存在事務(wù)復(fù)制延遲,在這些節(jié)點(diǎn)上就有可能讀取到舊事務(wù)數(shù)據(jù)。復(fù)制延遲的另一個(gè)風(fēng)險(xiǎn)時(shí),當(dāng)有新節(jié)點(diǎn)加入時(shí),需要選擇一個(gè)節(jié)點(diǎn)作為donor節(jié)點(diǎn),若該節(jié)點(diǎn)存在延遲,則可能最后會(huì)選中Primary節(jié)點(diǎn),影響事務(wù)寫入性能。還有,當(dāng)某節(jié)點(diǎn)中堆積大量延遲事務(wù)隊(duì)列時(shí),也很容易造成該節(jié)點(diǎn)發(fā)生OOM風(fēng)險(xiǎn)。


(資料圖片僅供參考)

綜上幾點(diǎn),為了避免個(gè)別節(jié)點(diǎn)存在嚴(yán)重的事務(wù)復(fù)制延遲及其他風(fēng)險(xiǎn),必要時(shí)可以采用流量控制(下面簡(jiǎn)稱“流控”)來(lái)避免/緩解這個(gè)問(wèn)題,降低節(jié)點(diǎn)間的事務(wù)延遲差距。

MGR流控有幾個(gè)要點(diǎn):

基于事務(wù)認(rèn)證隊(duì)列及等待被applied的relay log隊(duì)列這兩個(gè)隊(duì)列(group_replication_flow_control_applier_threshold、group_replication_flow_control_certifier_threshold,默認(rèn)值均為:25000),實(shí)行配額控制。

啟用流控(group_replication_flow_control_mode,默認(rèn)值:QUOTA)后,當(dāng)任何一個(gè)隊(duì)列大小超過(guò)設(shè)定閾值(配額)后,就會(huì)觸發(fā)流控機(jī)制。

只影響啟用流控的節(jié)點(diǎn),不影響MGR中的其他節(jié)點(diǎn)(在PXC里是所有節(jié)點(diǎn)同時(shí)被流控影響)。

當(dāng)設(shè)置流控配額百分比(group_replication_flow_control_member_quota_percent)時(shí),會(huì)在多個(gè)啟用流控的Primary節(jié)點(diǎn)間平攤配額。

流控只針對(duì)寫事務(wù),不影響只讀事務(wù)。

觸發(fā)流控后,會(huì)暫緩事務(wù)寫入請(qǐng)求,在group_replication_flow_control_period(默認(rèn)值:1)秒后再次檢查是否還超過(guò)閾值。如果還是超過(guò)則繼續(xù)流控,否則的話就放開事務(wù)寫入請(qǐng)求。不過(guò)這個(gè)流控機(jī)制在真實(shí)業(yè)務(wù)場(chǎng)景中效果很有限,在事務(wù)寫入高峰期,可能會(huì)頻繁造成TPS抖動(dòng),但卻不能真正起到流控作用。在GreatSQL中, 針對(duì)這個(gè)缺陷進(jìn)行了優(yōu)化,重新設(shè)計(jì)流控算法。增加主從延遲時(shí)間來(lái)計(jì)算流控閾值,并且同時(shí)考慮了大事務(wù)處理和主從節(jié)點(diǎn)的同步,流控粒度更細(xì)致,不會(huì)出現(xiàn)官方社區(qū)版本的1秒小抖動(dòng)問(wèn)題。

在GreatSQL中,新增選項(xiàng)group_replication_flow_control_replay_lag_behind用于控制MGR主從節(jié)點(diǎn)復(fù)制延遲閾值,當(dāng)MGR主從節(jié)點(diǎn)因?yàn)榇笫聞?wù)等原因延遲超過(guò)閾值時(shí),就會(huì)觸發(fā)流控機(jī)制。參數(shù)范圍 0 ~ ULONG_MAX,默認(rèn)值600秒,可在線動(dòng)態(tài)修改,且立即生效。

此外,針對(duì)不同業(yè)務(wù)場(chǎng)景,流控閾值設(shè)置也不盡相同。對(duì)于事務(wù)實(shí)時(shí)性要求不高的業(yè)務(wù),可以設(shè)置較大閾值。對(duì)于內(nèi)存較大的節(jié)點(diǎn),可以適當(dāng)調(diào)大閾值;反之,在內(nèi)存緊張的節(jié)點(diǎn)上,就要降低閾值以避免OOM風(fēng)險(xiǎn)。

2. 小結(jié)

本節(jié)介紹了為什么MGR需要流控,已經(jīng)GreatSQL如何改進(jìn)優(yōu)化流控算法。

參考資料、文檔

MySQL 8.0 Reference Manual(https://dev.mysql.com/doc/refman/8.0/en/group-replication.html)

數(shù)據(jù)庫(kù)內(nèi)核開發(fā) - 溫正湖(https://www.zhihu.com/column/c_206071340)

Group Replication原理 - 宋利兵(https://mp.weixin.qq.com/s/1iO-KISAU1HLSzEVLrxG9g)

標(biāo)簽: