溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL分布式恢復(fù)的方法是什么

發(fā)布時(shí)間:2023-05-10 09:44:33 來(lái)源:億速云 閱讀:108 作者:zzz 欄目:MySQL數(shù)據(jù)庫(kù)

這篇“MySQL分布式恢復(fù)的方法是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“MySQL分布式恢復(fù)的方法是什么”文章吧。

1. 概述

每當(dāng)一個(gè)MySQLserver新加入或者重新加入一個(gè)MGR集群時(shí),它都必須追平集群內(nèi)相差的事務(wù),保證這個(gè)節(jié)點(diǎn)的數(shù)據(jù)和集群內(nèi)最新的數(shù)據(jù)是同步的。這個(gè)新加入集群的節(jié)點(diǎn)在追平集群中的數(shù)據(jù)或者重新加入集群的節(jié)點(diǎn)追評(píng)它脫離集群后到現(xiàn)在這段時(shí)間內(nèi)相差的事務(wù)數(shù)據(jù)的過(guò)程稱為分布式恢復(fù)。

申請(qǐng)加入集群的節(jié)點(diǎn)首先檢查groupreplicationapplier通道中的中繼日志,檢查該節(jié)點(diǎn)目前尚未從集群中同步過(guò)來(lái)的事務(wù)數(shù)據(jù)。如果是重新加入集群的節(jié)點(diǎn),則該節(jié)點(diǎn)會(huì)找到在離開(kāi)集群后到現(xiàn)在和集群最新數(shù)據(jù)中未回放的事務(wù)數(shù)據(jù),在這種情況下,該節(jié)點(diǎn)首先會(huì)應(yīng)用這些未同步的事務(wù)。對(duì)于新加入集群的節(jié)點(diǎn),直接從一個(gè)引導(dǎo)節(jié)點(diǎn)上進(jìn)行全量數(shù)據(jù)恢復(fù)即可。

此后,新加入的節(jié)點(diǎn)和集群中現(xiàn)有的online狀態(tài)的節(jié)點(diǎn)(引導(dǎo)節(jié)點(diǎn))建立連接進(jìn)行狀態(tài)轉(zhuǎn)移。新加入的節(jié)點(diǎn)從集群中的引導(dǎo)節(jié)點(diǎn)中同步加入集群之前或者離開(kāi)集群后到現(xiàn)在未同步過(guò)來(lái)的數(shù)據(jù),這些相差的事務(wù)由集群中的引導(dǎo)節(jié)點(diǎn)提供。接下來(lái),新加入的節(jié)點(diǎn)應(yīng)用從集群中的引導(dǎo)節(jié)點(diǎn)同步過(guò)來(lái)的未進(jìn)行應(yīng)用的事務(wù)。此時(shí)申請(qǐng)加入集群的節(jié)點(diǎn)將應(yīng)用在狀態(tài)傳輸過(guò)程中集群內(nèi)新事務(wù)寫入的數(shù)據(jù)。(此時(shí)集群內(nèi)新事物寫入的數(shù)據(jù)暫時(shí)存放在緩存隊(duì)列中,并未將數(shù)據(jù)寫入磁盤中)完成此過(guò)程后,新加入的節(jié)點(diǎn)的數(shù)據(jù)和整個(gè)集群的數(shù)據(jù)相比,處于一個(gè)追平的狀態(tài),并且該節(jié)點(diǎn)設(shè)置為online狀態(tài)。

注意:新加入集群的節(jié)點(diǎn),不論是之前有沒(méi)有在此集群中,都會(huì)先隨機(jī)選一個(gè)online節(jié)點(diǎn)先同步該節(jié)點(diǎn)和集群相差的事務(wù)。

組復(fù)制在分布式恢復(fù)期間用下述方法實(shí)現(xiàn)狀態(tài)傳輸:

使用克隆插件的功能進(jìn)行遠(yuǎn)程克隆操作,該插件可從MySQL 8.0.17開(kāi)始支持。要使用這種方法,必須在引導(dǎo)節(jié)點(diǎn)和新加入的節(jié)點(diǎn)上提前安裝克隆插件。組復(fù)制會(huì)自動(dòng)配置所需的克隆插件設(shè)置,并管理遠(yuǎn)程克隆操作。

從引導(dǎo)節(jié)點(diǎn)的二進(jìn)制日志復(fù)制數(shù)據(jù)并在新加入的節(jié)點(diǎn)上應(yīng)用這些事務(wù)。此方法需要在引導(dǎo)節(jié)點(diǎn)和加入節(jié)點(diǎn)之間建立的名為groupreplicationrecovery的標(biāo)準(zhǔn)異步復(fù)制通道。

在加入節(jié)點(diǎn)上執(zhí)行STARTGROUP_REPLICATION后,組復(fù)制會(huì)自動(dòng)選擇上述方法的最佳組合進(jìn)行狀態(tài)轉(zhuǎn)移。為此,組復(fù)制將會(huì)檢查集群中哪些現(xiàn)有節(jié)點(diǎn)適合用作引導(dǎo)節(jié)點(diǎn),加入節(jié)點(diǎn)需要引導(dǎo)節(jié)點(diǎn)傳輸多少事務(wù),以及是否有事務(wù)不再存在于集群中任意節(jié)點(diǎn)的二進(jìn)制日志文件中。如果加入節(jié)點(diǎn)與引導(dǎo)節(jié)點(diǎn)之間的事務(wù)差距很大,或者如果某些要求的事務(wù)不在引導(dǎo)節(jié)點(diǎn)的二進(jìn)制日志文件中,則組復(fù)制將通過(guò)遠(yuǎn)程克隆操作開(kāi)始分布式恢復(fù)。如果沒(méi)有較大的事務(wù)間隙,或者未安裝克隆插件,則組復(fù)制將直接從引導(dǎo)節(jié)點(diǎn)的二進(jìn)制日志進(jìn)行狀態(tài)轉(zhuǎn)移。

在遠(yuǎn)程克隆操作期間,將刪除加入節(jié)點(diǎn)上的現(xiàn)有數(shù)據(jù),并用引導(dǎo)節(jié)點(diǎn)數(shù)據(jù)的副本替換。當(dāng)遠(yuǎn)程克隆操作完成并且新加入節(jié)點(diǎn)已重新啟動(dòng)時(shí),將繼續(xù)執(zhí)行來(lái)自引導(dǎo)節(jié)點(diǎn)二進(jìn)制日志來(lái)進(jìn)行狀態(tài)轉(zhuǎn)移,以獲取在進(jìn)行遠(yuǎn)程克隆操作時(shí)集群所寫入的增量數(shù)據(jù)。

在從引導(dǎo)節(jié)點(diǎn)的二進(jìn)制日志進(jìn)行狀態(tài)轉(zhuǎn)移期間,新加入節(jié)點(diǎn)從引導(dǎo)節(jié)點(diǎn)的二進(jìn)制日志中復(fù)制并應(yīng)用所需的事務(wù),并在收到事務(wù)時(shí)應(yīng)用事務(wù),直到二進(jìn)制日志記錄新加入節(jié)點(diǎn)加入了集群。(當(dāng)加入節(jié)點(diǎn)成功加入集群時(shí),二進(jìn)制日志中會(huì)記錄對(duì)應(yīng)的視圖更改event)在此過(guò)程中,加入節(jié)點(diǎn)將緩沖該集群應(yīng)用的新事務(wù)數(shù)據(jù)。從二進(jìn)制日志的狀態(tài)傳輸完成后,新加入節(jié)點(diǎn)將應(yīng)用緩沖的事務(wù)。

當(dāng)加入節(jié)點(diǎn)與該集群的所有事務(wù)保持最新時(shí),該節(jié)點(diǎn)將在設(shè)置為online狀態(tài)并可以作為普通節(jié)點(diǎn)加入集群,并且分布式恢復(fù)已完成。

ps:從二進(jìn)制日志進(jìn)行狀態(tài)轉(zhuǎn)移是組復(fù)制進(jìn)行分布式恢復(fù)的基本機(jī)制,并且如果未將復(fù)制組中的引導(dǎo)節(jié)點(diǎn)和加入節(jié)點(diǎn)設(shè)置為支持克隆。由于從二進(jìn)制日志進(jìn)行狀態(tài)轉(zhuǎn)移是基于經(jīng)典的異步復(fù)制,因此,如果加入該集群的MySQL server根本沒(méi)有該集群的數(shù)據(jù),或者從非常舊的備份中獲取了數(shù)據(jù),則可能要花費(fèi)很長(zhǎng)時(shí)間來(lái)恢復(fù)最新數(shù)據(jù)。因此,在這種情況下,建議在將MySQL server添加到集群之前,則應(yīng)通過(guò)傳輸集群中已有節(jié)點(diǎn)的相當(dāng)近期的快照來(lái)使用集群的數(shù)據(jù)對(duì)其進(jìn)行設(shè)置。這可以最大程度地減少分布式恢復(fù)所需的時(shí)間,并減少對(duì)引導(dǎo)節(jié)點(diǎn)的影響,因?yàn)橐龑?dǎo)節(jié)點(diǎn)必須保留和傳輸較少的二進(jìn)制日志文件。

2. 分布式恢復(fù)的連接

當(dāng)加入節(jié)點(diǎn)連接到現(xiàn)有節(jié)點(diǎn)中的引導(dǎo)節(jié)點(diǎn)進(jìn)行分布式恢復(fù)期間的狀態(tài)轉(zhuǎn)移時(shí),加入節(jié)點(diǎn)充當(dāng)客戶端,而引導(dǎo)節(jié)點(diǎn)充當(dāng)服務(wù)端。當(dāng)通過(guò)此連接(使用異步復(fù)制通道groupreplicationrecovery)從引導(dǎo)節(jié)點(diǎn)的二進(jìn)制日志進(jìn)行狀態(tài)轉(zhuǎn)移時(shí),加入節(jié)點(diǎn)充當(dāng)副本,引導(dǎo)節(jié)點(diǎn)充當(dāng)源端。通過(guò)此連接進(jìn)行遠(yuǎn)程克隆操作時(shí),新加入節(jié)點(diǎn)充當(dāng)全量數(shù)據(jù)接收者,引導(dǎo)節(jié)點(diǎn)充當(dāng)全量數(shù)據(jù)提供者。應(yīng)用于組復(fù)制上下文之外的角色的配置設(shè)置也可以應(yīng)用于組復(fù)制,除非它們被特定于組復(fù)制的配置設(shè)置或行為所覆蓋。

現(xiàn)有節(jié)點(diǎn)提供給新加入節(jié)點(diǎn)以進(jìn)行分布式恢復(fù)的連接與組復(fù)制用于集群內(nèi)節(jié)點(diǎn)之間的通信的連接是不同的。

組通信引擎用于組復(fù)制(XCom,Paxos變體),用于遠(yuǎn)程XCom實(shí)例之間的TCP通信的連接由groupreplicationlocal_address系統(tǒng)變量指定。此連接用于集群內(nèi)online節(jié)點(diǎn)之間的TCP / IP消息傳遞。與本地實(shí)例的通信是通過(guò)使用內(nèi)存內(nèi)共享的傳輸通道進(jìn)行的。

對(duì)于分布式恢復(fù),直到MySQL8.0.20為止,集群內(nèi)的節(jié)點(diǎn)都將其標(biāo)準(zhǔn)SQL客戶端連接提供給加入節(jié)點(diǎn),這由MySQL Server的主機(jī)名和端口系統(tǒng)變量指定。如果report_port系統(tǒng)變量指定了備用端口號(hào),則改用該端口號(hào)。

從MySQL 8.0.21開(kāi)始,組成員可以將分布式恢復(fù)端點(diǎn)的替代列表作為加入成員的專用客戶端連接,從而使得獨(dú)立于成員的常規(guī)客戶端用戶的連接可以用來(lái)控制分布式恢復(fù)??梢允褂胓roupreplicationadvertiserecoveryendpoints系統(tǒng)變量來(lái)指定此列表,并且成員在加入組時(shí)將其分布式恢復(fù)端點(diǎn)的列表傳輸?shù)皆摻M。默認(rèn)值為成員繼續(xù)提供與早期版本相同的標(biāo)準(zhǔn)SQL客戶端連接。

PS:

如果加入節(jié)點(diǎn)無(wú)法使用MySQLServer的系統(tǒng)變量定義的主機(jī)名正確識(shí)別其他節(jié)點(diǎn),則分布式恢復(fù)可能會(huì)失敗。建議運(yùn)行MySQL的操作系統(tǒng)使用DNS或本地設(shè)置具有正確配置的唯一主機(jī)名??梢栽凇皃erformanceschema”庫(kù)下的Replicationgroupmembers表的Memberhost列中驗(yàn)證server用于SQL客戶端連接的主機(jī)名。如果多個(gè)組成員將操作系統(tǒng)設(shè)置的默認(rèn)主機(jī)名外部化,則加入節(jié)點(diǎn)有可能無(wú)法將其解析為正確的地址,并且無(wú)法連接以進(jìn)行分布式恢復(fù)。在這種情況下,可以使用MySQL Server的report_host系統(tǒng)變量來(lái)配置由每個(gè)server外部化的唯一主機(jī)名。

加入節(jié)點(diǎn)為分布式恢復(fù)建立連接的步驟如下:

當(dāng)節(jié)點(diǎn)加入集群時(shí),它會(huì)使用groupreplicationgroupseeds系統(tǒng)變量中列表中包含的一個(gè)種子節(jié)點(diǎn)進(jìn)行連接,最初使用該列表中指定的groupreplicationlocaladdress連接。種子節(jié)點(diǎn)可能是集群數(shù)據(jù)的子集。

通過(guò)此連接,種子節(jié)點(diǎn)使用組復(fù)制的成員資格服務(wù)以視圖的形式向加入的節(jié)點(diǎn)提供集群中所有online節(jié)點(diǎn)的列表。成員資格信息包括每個(gè)成員為分布式恢復(fù)提供的分布式恢復(fù)端點(diǎn)或標(biāo)準(zhǔn)SQL客戶端連接的詳細(xì)信息。

加入節(jié)點(diǎn)從此列表中選擇合適的online節(jié)點(diǎn)作為其引導(dǎo)節(jié)點(diǎn)進(jìn)行分布式恢復(fù)

加入節(jié)點(diǎn)嘗試使用引導(dǎo)節(jié)點(diǎn)的分布式恢復(fù)端點(diǎn)來(lái)連接到引導(dǎo)節(jié)點(diǎn),并按列表中指定的順序依次嘗試連接每個(gè)端點(diǎn)。如果引導(dǎo)節(jié)點(diǎn)沒(méi)有提供端點(diǎn),則加入節(jié)點(diǎn)將嘗試使用引導(dǎo)節(jié)點(diǎn)的標(biāo)準(zhǔn)SQL客戶端連接進(jìn)行連接。連接的SSL要求由groupreplicationrecoveryssl *選項(xiàng)指定。

如果加入節(jié)點(diǎn)無(wú)法連接到指定的引導(dǎo)節(jié)點(diǎn),則它將與其他合適的引導(dǎo)節(jié)點(diǎn)重試連接。如果加入節(jié)點(diǎn)在沒(méi)有建立連接的情況下耗盡了端點(diǎn)的廣播列表,則它不會(huì)回退到引導(dǎo)節(jié)點(diǎn)的標(biāo)準(zhǔn)SQL客戶端連接,而是切換到另一個(gè)引導(dǎo)節(jié)點(diǎn)嘗試重新建立連接。

加入節(jié)點(diǎn)與引導(dǎo)節(jié)點(diǎn)建立分布式恢復(fù)連接時(shí),它將使用該連接進(jìn)行狀態(tài)轉(zhuǎn)移,加入節(jié)點(diǎn)的日志中顯示了所使用的連接的主機(jī)和端口。如果使用遠(yuǎn)程克隆操作,則在操作結(jié)束時(shí)重新啟動(dòng)加入節(jié)點(diǎn)時(shí),它將與新的引導(dǎo)節(jié)點(diǎn)建立連接,從引導(dǎo)節(jié)點(diǎn)的二進(jìn)制日志進(jìn)行狀態(tài)轉(zhuǎn)移。這可能是與用于遠(yuǎn)程克隆操作的引導(dǎo)節(jié)點(diǎn)不同的連接,也可能是與引導(dǎo)節(jié)點(diǎn)建立相同的連接。無(wú)論如何,分布式恢復(fù)將以相同的方式與引導(dǎo)節(jié)點(diǎn)建立連接。

2.1分布式恢復(fù)端地址的查找

groupreplicationadvertiserecoveryendpoints系統(tǒng)變量作為分布式恢復(fù)端提供的IP地址,不必為MySQL Server配置(也就是說(shuō),不必由adminaddress系統(tǒng)變量或在bindaddress系統(tǒng)變量的列表中指定)。

為MySQL Server配置為分布式恢復(fù)端提供的端口,必須由port,reportport或adminport系統(tǒng)變量指定。必須在這些端口上偵聽(tīng)TCP / IP連接。如果指定adminport,則用于分布式恢復(fù)的復(fù)制用戶需要SERVICECONNECTIONADMIN權(quán)限才能連接。選擇adminport可使分布式恢復(fù)連接與常規(guī)MySQL客戶端連接分開(kāi)。

加入節(jié)點(diǎn)按列表中指定的順序依次嘗試每個(gè)端點(diǎn)。如果將groupreplicationadvertiserecoveryendpoints設(shè)置為DEFAULT而不是端點(diǎn)列表,則將提供標(biāo)準(zhǔn)SQL客戶端連接。標(biāo)準(zhǔn)SQL客戶端連接不會(huì)自動(dòng)包含在分布式恢復(fù)端點(diǎn)列表中,并且如果引導(dǎo)節(jié)點(diǎn)的端點(diǎn)列表在沒(méi)有連接的情況下被用盡,則不會(huì)將其作為備用。如果要提供標(biāo)準(zhǔn)SQL客戶端連接作為多個(gè)分布式恢復(fù)端點(diǎn)之一,則必須將其顯式包括在groupreplicationadvertiseadvertiserecovery_endpoints指定的列表中。可以將其放在最后,以便作為連接的最后手段。

無(wú)需將組成員的分布式恢復(fù)終點(diǎn)(或標(biāo)準(zhǔn)SQL客戶端連接,如果未提供終點(diǎn))添加到groupreplicationipallowlist(來(lái)自MySQL 8.0.22)或groupreplicationipwhitelist系統(tǒng)變量指定的組復(fù)制允許列表中。許可列表僅適用于由groupreplicationlocal_address為每個(gè)節(jié)點(diǎn)指定的地址。加入節(jié)點(diǎn)必須具有與允許列表允許的集群的初始連接,以便檢索一個(gè)或多個(gè)地址進(jìn)行分布式恢復(fù)。

設(shè)置系統(tǒng)變量和執(zhí)行STARTGROUP_REPLICATION語(yǔ)句后,將驗(yàn)證列出的分布式恢復(fù)端點(diǎn)。如果無(wú)法正確解析列表,或者由于服務(wù)未在偵聽(tīng)列表而無(wú)法在主機(jī)上訪問(wèn)任何端點(diǎn),則組復(fù)制將記錄錯(cuò)誤并且無(wú)法啟動(dòng)。

2.2分布式恢復(fù)壓縮

在MySQL 8.0.18中,可以選擇使用引導(dǎo)節(jié)點(diǎn)二進(jìn)制日志中的狀態(tài)轉(zhuǎn)移方法為分布式恢復(fù)配置壓縮。在網(wǎng)絡(luò)帶寬有限的情況下,壓縮可以使分布式恢復(fù)受益,而引導(dǎo)節(jié)點(diǎn)必須將許多事務(wù)傳輸給加入節(jié)點(diǎn)。groupreplicationrecoverycompressionalgorithm和groupreplicationrecoveryzstdcompression_level系統(tǒng)變量配置允許的壓縮算法以及zstd壓縮級(jí)別,這些級(jí)別用于從引導(dǎo)節(jié)點(diǎn)的二進(jìn)制日志執(zhí)行狀態(tài)轉(zhuǎn)移時(shí)使用。

這些壓縮設(shè)置不適用于遠(yuǎn)程克隆操作。當(dāng)遠(yuǎn)程克隆操作用于分布式恢復(fù)時(shí),將應(yīng)用克隆插件的cloneenablecompression設(shè)置。

2.3分布式恢復(fù)的用戶

分布式恢復(fù)需要具有正確權(quán)限的復(fù)制用戶,以便組復(fù)制可以建立直接的節(jié)點(diǎn)到節(jié)點(diǎn)的復(fù)制通道。復(fù)制用戶還必須具有正確的權(quán)限,如果該復(fù)制用戶還同充當(dāng)遠(yuǎn)程克隆操作中的克隆用戶,則在引導(dǎo)節(jié)點(diǎn)中該復(fù)制用戶還必須具有遠(yuǎn)程克隆相關(guān)的權(quán)限(BACKUP_ADMIN權(quán)限)才能充當(dāng)引導(dǎo)節(jié)點(diǎn)上的克隆用戶以進(jìn)行遠(yuǎn)程克隆操作。除此之外,必須將同一復(fù)制用戶用于集群內(nèi)每個(gè)節(jié)點(diǎn)上的分布式恢復(fù)。

2.4分布式恢復(fù)和SSL認(rèn)證

用于分布式恢復(fù)的SSL與用于普通組通信的SSL分開(kāi)配置,這由server的SSL設(shè)置和groupreplicationssl_mode系統(tǒng)變量確定。對(duì)于分布式恢復(fù)連接,可以使用專用的組復(fù)制分布式恢復(fù)SSL系統(tǒng)變量來(lái)配置專門用于分布式恢復(fù)的證書(shū)和密鑰的使用。

默認(rèn)情況下,SSL不用于分布式恢復(fù)連接。設(shè)置groupreplicationrecoveryusessl= ON啟用,然后配置組復(fù)制分布式恢復(fù)SSL系統(tǒng)變量,將復(fù)制用戶設(shè)置為使用SSL。

將分布式恢復(fù)配置為使用SSL時(shí),組復(fù)制會(huì)將此設(shè)置應(yīng)用于遠(yuǎn)程克隆操作以及從引導(dǎo)節(jié)點(diǎn)的二進(jìn)制日志進(jìn)行狀態(tài)轉(zhuǎn)移。組復(fù)制會(huì)自動(dòng)配置克隆SSL選項(xiàng)(clonesslca,clonesslcert和clonesslkey),以匹配相應(yīng)組復(fù)制分布式恢復(fù)選項(xiàng)(groupreplicationrecoverysslca,groupreplicationrecoverysslcert和groupreplicationrecoverysslkey)的設(shè)置。

如果未使用SSL進(jìn)行分布式恢復(fù)(groupreplicationrecoveryusessl設(shè)置為OFF),并且組復(fù)制的復(fù)制用戶帳戶使用cachingsha2password插件(MySQL 8.0中的默認(rèn)設(shè)置)或sha256password插件進(jìn)行身份驗(yàn)證,則RSA密鑰對(duì)為用于密碼交換。在這種情況下,使用groupreplicationrecoverypublickeypath系統(tǒng)變量指定RSA公共密鑰文件,或者使用groupreplicationrecoverygetpublic_key系統(tǒng)變量請(qǐng)求公共密鑰。否則整個(gè)分布式回復(fù)會(huì)因?yàn)閳?bào)錯(cuò)導(dǎo)致恢復(fù)失敗。

3. 利用克隆插件進(jìn)行分布式恢復(fù)

MySQLServer的克隆插件可從MySQL8.0.17獲得。如果要將遠(yuǎn)程克隆操作用于集群中的分布式恢復(fù),則必須預(yù)先設(shè)置現(xiàn)有節(jié)點(diǎn)和加入節(jié)點(diǎn)才能支持此功能。如果不想在集群中使用此功能,請(qǐng)不要進(jìn)行設(shè)置,在這種情況下,組復(fù)制僅使用二進(jìn)制日志中的狀態(tài)傳輸。

要使用克隆插件,必須預(yù)先設(shè)置至少一個(gè)現(xiàn)有的集群節(jié)點(diǎn)和加入節(jié)點(diǎn)支持遠(yuǎn)程克隆操作。至少,必須在引導(dǎo)節(jié)點(diǎn)和加入節(jié)點(diǎn)上安裝克隆插件,將BACKUPADMIN權(quán)限授予復(fù)制用戶以進(jìn)行分布式恢復(fù),并將groupreplicationclonethreshold系統(tǒng)變量設(shè)置為適當(dāng)?shù)募?jí)別。(默認(rèn)情況下為GTID序列允許的最大值,表示正常情況下,始終優(yōu)先使用基于二進(jìn)制日志的狀態(tài)傳輸,除非joiner節(jié)點(diǎn)所請(qǐng)求的事務(wù)在組中任意成員中都不存在,這個(gè)時(shí)候,如果設(shè)置好了克隆功能,則無(wú)論該系統(tǒng)變量的值設(shè)置為多少,都會(huì)觸發(fā)通過(guò)克隆的方式進(jìn)行分布式恢復(fù),例如:全新初始化的Server申請(qǐng)加入組時(shí)。如果不希望使用克隆功能,則不要對(duì)其進(jìn)行安裝與配置)為了確保引導(dǎo)節(jié)點(diǎn)的最大可用性,建議設(shè)置所有當(dāng)前和將來(lái)的集群節(jié)點(diǎn)支持遠(yuǎn)程克隆操作。以便后續(xù)有Server加入集群時(shí)能夠使用遠(yuǎn)程克隆操作來(lái)快速追趕集群中的最新數(shù)據(jù)。

在從引導(dǎo)節(jié)點(diǎn)向加入節(jié)點(diǎn)傳輸數(shù)據(jù)之前,遠(yuǎn)程克隆操作會(huì)刪除加入節(jié)點(diǎn)中用戶創(chuàng)建的表空間和數(shù)據(jù)。如果在中途意外終止操作,則加入節(jié)點(diǎn)可能只剩下部分?jǐn)?shù)據(jù)或沒(méi)有數(shù)據(jù)。可以通過(guò)重新執(zhí)行組復(fù)制自動(dòng)執(zhí)行的遠(yuǎn)程克隆操作來(lái)修復(fù)此問(wèn)題。

這里主要針對(duì)遠(yuǎn)程克隆時(shí)使用DATADIRECTORY子選項(xiàng)指定了一個(gè)數(shù)據(jù)保存路徑的情況,指定路徑時(shí),數(shù)據(jù)會(huì)保存在指定的目錄下,即克隆之后的數(shù)據(jù)與操作克隆的實(shí)例沒(méi)有關(guān)聯(lián),需要手動(dòng)啟動(dòng)實(shí)例并指定datadir到保存克隆數(shù)據(jù)的目錄進(jìn)行啟動(dòng),當(dāng)然,MGR插件可以自動(dòng)執(zhí)行遠(yuǎn)程克隆的重試操作(需要保證克隆操作不指定DATA DIRECTORY子選項(xiàng),在這種情況下,遠(yuǎn)程克隆數(shù)據(jù)會(huì)覆蓋掉操作遠(yuǎn)程克隆的Server數(shù)據(jù),完成遠(yuǎn)程克隆操之后,操作遠(yuǎn)程克隆的Server會(huì)基于克隆數(shù)據(jù)自動(dòng)重新啟動(dòng))。另外,克隆插件雖然與組復(fù)制配合使用對(duì)組復(fù)制的管理維護(hù)來(lái)說(shuō)更加自動(dòng)化,但是,克隆插件不要求必須在集群中運(yùn)行(但MGR插件必須要安裝)。

3.1克隆的基本條件

對(duì)于組復(fù)制,使用克隆插件進(jìn)行分布式恢復(fù)需要注意以下要點(diǎn)和區(qū)別:

現(xiàn)有集群節(jié)點(diǎn)和加入節(jié)點(diǎn)必須已安裝克隆插件并處于激活狀態(tài)。

引導(dǎo)節(jié)點(diǎn)和加入節(jié)點(diǎn)必須在相同的操作系統(tǒng)上運(yùn)行,并且必須具有相同的MySQL Server版本(必須為MySQL 8.0.17或更高版本才能支持克隆插件)。因此,克隆不適用于成員運(yùn)行不同MySQL版本的集群。

引導(dǎo)節(jié)點(diǎn)和加入節(jié)點(diǎn)必須已安裝并激活了“組復(fù)制”插件,引導(dǎo)節(jié)點(diǎn)上所有激活的其他插件(例如,密鑰環(huán)插件)也必須在加入節(jié)點(diǎn)上處于激活狀態(tài)。

如果將分布式恢復(fù)配置為使用SSL(groupreplicationrecoveryusessl= ON),則組復(fù)制會(huì)將此設(shè)置應(yīng)用于遠(yuǎn)程克隆操作。組復(fù)制會(huì)自動(dòng)配置克隆SSL選項(xiàng)(clonesslca,clonesslcert和clonesslkey)的設(shè)置,以匹配相應(yīng)組復(fù)制分布式恢復(fù)選項(xiàng)(groupreplicationrecoverysslca,groupreplicationrecoverysslcert和groupreplicationrecoverysslkey)的設(shè)置。

不需要在加入節(jié)點(diǎn)上為加入集群而在clonevaliddonor_list系統(tǒng)變量中設(shè)置有效引導(dǎo)節(jié)點(diǎn)列表。MGR自動(dòng)從現(xiàn)有的集群節(jié)點(diǎn)中選擇引導(dǎo)節(jié)點(diǎn)后,組復(fù)制會(huì)自動(dòng)配置此設(shè)置。注意,遠(yuǎn)程克隆操作使用server的SQL協(xié)議主機(jī)名和端口,而非集群成員之間內(nèi)部通訊的地址和端口。

克隆插件具有許多系統(tǒng)變量,可管理遠(yuǎn)程克隆操作的網(wǎng)絡(luò)負(fù)載和性能影響。組復(fù)制未配置這些設(shè)置,因此可以查看它們并根據(jù)需要進(jìn)行設(shè)置,也可以將其設(shè)置為默認(rèn)設(shè)置,當(dāng)使用遠(yuǎn)程克隆操作進(jìn)行分布式恢復(fù)時(shí),克隆插件的cloneenablecompression設(shè)置將應(yīng)用于該操作,而不會(huì)影響現(xiàn)有配置好的組復(fù)制壓縮設(shè)置。

為了對(duì)加入節(jié)點(diǎn)調(diào)用遠(yuǎn)程克隆操作,組復(fù)制使用內(nèi)部mysql.session用戶,該用戶已經(jīng)具有CLONE_ADMIN特權(quán),因此無(wú)需進(jìn)行特別設(shè)置。

作為遠(yuǎn)程克隆操作的引導(dǎo)節(jié)點(diǎn)上的克隆用戶,組復(fù)制使用為分布式恢復(fù)設(shè)置的復(fù)制用戶。因此,必須在所有支持克隆的集群節(jié)點(diǎn)上將此復(fù)制用戶賦予BACKUP_ADMIN特權(quán)。在為節(jié)點(diǎn)配置組復(fù)制時(shí),如果有加入節(jié)點(diǎn),還應(yīng)向該節(jié)點(diǎn)上的復(fù)制用戶授予此權(quán)限,因?yàn)榧尤牍?jié)點(diǎn)加入集群后,他們可以充當(dāng)其他加入節(jié)點(diǎn)的引導(dǎo)節(jié)點(diǎn)。同一復(fù)制用戶用于每個(gè)集群節(jié)點(diǎn)上的分布式恢復(fù)。要將此權(quán)限授予現(xiàn)有節(jié)點(diǎn)上的復(fù)制用戶,可以在禁用二進(jìn)制日志記錄的情況下在每個(gè)集群節(jié)點(diǎn)上單獨(dú)執(zhí)行此語(yǔ)句,或者在啟用二進(jìn)制日志記錄的情況下在一個(gè)集群的primary節(jié)點(diǎn)上執(zhí)行如下語(yǔ)句:

GRANT BACKUP_ADMIN ON *.* TO *rpl_user*@'%';

如果在使用STARTGROUPREPLICATION以前在提供用戶憑據(jù)的server上使用CHANGE MASTER TO指定復(fù)制用戶憑據(jù),請(qǐng)確保在進(jìn)行任何遠(yuǎn)程克隆操作之前,從復(fù)制元數(shù)據(jù)存儲(chǔ)庫(kù)中刪除該用戶憑據(jù)。還要確保在加入成員上設(shè)置了groupreplicationstartonboot =OFF。如果未取消設(shè)置用戶憑據(jù),則在遠(yuǎn)程克隆操作期間會(huì)將它們轉(zhuǎn)移到加入成員。然后,可能會(huì)在原始成員或從其克隆的成員上意外地使用存儲(chǔ)的憑據(jù)啟動(dòng)groupreplicationrecovery通道。server啟動(dòng)時(shí)(包括在遠(yuǎn)程克隆操作之后)自動(dòng)啟動(dòng)組復(fù)制將使用存儲(chǔ)的用戶憑據(jù),并且如果未在START GROUPREPLICATION命令上指定分布式恢復(fù)憑據(jù),也將使用它們。

3.2克隆的閾值

設(shè)置組成員支持克隆后,groupreplicationclonethreshold系統(tǒng)變量將指定一個(gè)閾值,表示為多少個(gè)事務(wù),以便在分布式恢復(fù)中使用遠(yuǎn)程克隆操作。如果引導(dǎo)節(jié)點(diǎn)上的事務(wù)與加入節(jié)點(diǎn)上的事務(wù)之間的數(shù)量大于此數(shù)目,則在技術(shù)上可行時(shí),將使用遠(yuǎn)程克隆操作將狀態(tài)轉(zhuǎn)移到加入節(jié)點(diǎn)。組復(fù)制基于現(xiàn)有組成員的gtidexecuted集來(lái)計(jì)算是否已超過(guò)閾值。在事務(wù)間隙較大的情況下使用遠(yuǎn)程克隆操作,可以將新成員添加到集群中,而無(wú)需事先將集群的數(shù)據(jù)手動(dòng)傳輸?shù)?a title="服務(wù)器" target="_blank" href="http://www.kemok4.com/">服務(wù)器,還可以使落后的節(jié)點(diǎn)更有效地進(jìn)行數(shù)據(jù)追趕。

groupreplicationclone_threshold組復(fù)制系統(tǒng)變量的默認(rèn)設(shè)置非常高(GTID中事務(wù)的最大允許序列號(hào)),因此,只要有可能從二進(jìn)制日志轉(zhuǎn)移狀態(tài),它都會(huì)有效地禁用克隆。要使組復(fù)制能夠選擇更適合狀態(tài)傳輸?shù)倪h(yuǎn)程克隆操作,設(shè)置系統(tǒng)變量,以指定多少個(gè)事務(wù)作為要進(jìn)行克隆的事務(wù)間隔。

PS:

不要在活躍的集群中為groupreplicationclone_threshold使用較低的設(shè)置。如果在進(jìn)行遠(yuǎn)程克隆操作的同時(shí)集群中發(fā)生了超過(guò)閾值的事務(wù),則加入成員在重新啟動(dòng)后會(huì)再次觸發(fā)遠(yuǎn)程克隆操作,并且可以無(wú)限期地繼續(xù)進(jìn)行。為避免這種情況,確保將閾值設(shè)置為一個(gè)可靠的數(shù)字,該閾值應(yīng)大于在遠(yuǎn)程克隆操作所花費(fèi)的時(shí)間段內(nèi)集群中預(yù)期發(fā)生的事務(wù)數(shù)。

當(dāng)無(wú)法從引導(dǎo)節(jié)點(diǎn)的二進(jìn)制日志進(jìn)行狀態(tài)轉(zhuǎn)移時(shí),組復(fù)制嘗試執(zhí)行遠(yuǎn)程克隆操作,而不管此時(shí)的閾值如何,例如,因?yàn)榧尤氤蓡T所需的事務(wù)在任何現(xiàn)有組成員的二進(jìn)制日志中均不可用。組復(fù)制基于現(xiàn)有組成員的gtidpurged集對(duì)此進(jìn)行標(biāo)識(shí)。當(dāng)所需的事務(wù)在任何成員的二進(jìn)制日志文件中不可用時(shí),不能使用groupreplicationclonethreshold系統(tǒng)變量來(lái)停用克隆,因?yàn)樵谶@種情況下,克隆是手動(dòng)將數(shù)據(jù)傳輸?shù)郊尤牍?jié)點(diǎn)的唯一選

3.3克隆操作

設(shè)置集群節(jié)點(diǎn)和加入節(jié)點(diǎn)進(jìn)行克隆后,組復(fù)制將管理遠(yuǎn)程克隆操作。遠(yuǎn)程克隆操作需要一些時(shí)間才能完成,具體取決于數(shù)據(jù)的大小。

performanceschema.cloneprogress表中記錄了整個(gè)克隆操作的每一個(gè)階段及其對(duì)應(yīng)的階段信息,每一個(gè)階段會(huì)生成一行記錄(注意,該表中只記錄一次克隆操作的過(guò)程信息,下一次執(zhí)行克隆操作時(shí),上一次的信息會(huì)被覆蓋)

select * from clone_progress;
+------+-----------+-----------+---------------------------- 
+----------------------------+---------+------------+-------- 
----+------------+------------+---------------+
| ID | STAGE | STATE | BEGIN_TIME | END_TIME | THREADS | 
ESTIMATE | DATA | NETWORK | DATA_SPEED | NETWORK_SPEED |
+------+-----------+-----------+---------------------------- 
+----------------------------+---------+------------+------- 
-----+------------+------------+---------------+
| 1 | DROP DATA | Completed | 2019-10-08 16:46:58.757964 | 
2019-10-08 16:46:59.128436 | 1 | 0 | 0 | 0 | 0 | 0 |
| 1 | FILE COPY | Completed | 2019-10-08 16:46:59.128766 | 
 2019-10-08 16:47:16.857536 | 8 | 8429731840 | 8429731840 | 
 8430190882 | 0 | 0 |
| 1 | PAGE COPY | Completed | 2019-10-08 16:47:16.857737 | 
 2019-10-08 16:47:17.159531 | 8 | 0 | 0 | 785 | 0 | 0 |
| 1 | REDO COPY | Completed | 2019-10-08 16:47:17.159748 | 
2019-10-08 16:47:17.460516 | 8 | 2560 | 2560 | 3717 | 0 | 0 
|
| 1 | FILE SYNC | Completed | 2019-10-08 16:47:17.460788 | 
2019-10-08 16:47:20.926184 | 8 | 0 | 0 | 0 | 0 | 0 |
| 1 | RESTART | Completed | 2019-10-08 16:47:20.926184 |
| 1 | RESTART | Completed | 2019-10-08 16:47:20.926184 | 
2019-10-08 16:47:28.623732 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | RECOVERY | Completed | 2019-10-08 16:47:28.623732 | 
2019-10-08 16:47:34.898453 | 0 | 0 | 0 | 0 | 0 | 0 |
+------+-----------+-----------+---------------------------- 
+----------------------------+---------+------------+------- 
-----+------------+------------+---------------+
7 rows in set (0.00 sec)
select * from clone_status\G
*************************** 1. row ***************************
ID: 1
PID: 0
STATE: Completed
BEGIN_TIME: 2019-10-08 16:46:58.758
END_TIME: 2019-10-08 16:47:34.898
SOURCE: 10.10.30.162:3306
DESTINATION: LOCAL INSTANCE
ERROR_NO: 0
ERROR_MESSAGE:
BINLOG_FILE: mysql-bin.000022
BINLOG_POSITION: 222104704
GTID_EXECUTED: 320675e6-de7b-11e9-b3a9-5254002a54f2:1-4,
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-2771494
1 row in set (0.01 sec)

PS:

狀態(tài)轉(zhuǎn)移完成后,組復(fù)制將重新啟動(dòng)加入節(jié)點(diǎn)以完成該過(guò)程。如果在加入節(jié)點(diǎn)上設(shè)置了groupreplicationstartonboot = OFF,例如,因?yàn)樵赟TART GROUPREPLICATION語(yǔ)句上指定了復(fù)制用戶憑據(jù),則在重新啟動(dòng)后必須再次手動(dòng)發(fā)布START GROUPREPLICATION。如果在配置文件中或使用SET PERSIST語(yǔ)句設(shè)置了groupreplicationstartonboot = ON以及啟動(dòng)組復(fù)制所需的其他設(shè)置,則無(wú)需干預(yù),該過(guò)程會(huì)自動(dòng)繼續(xù)使加入節(jié)點(diǎn)設(shè)置為online狀態(tài)。

遠(yuǎn)程克隆操作會(huì)將引導(dǎo)節(jié)點(diǎn)的數(shù)據(jù)目錄下的各種數(shù)據(jù)文件克隆到加入節(jié)點(diǎn)中(表中可能包含了一些配置信息及其用戶數(shù)據(jù)等)。但保存在配置文件(如組復(fù)制本地地址配置等)中的組復(fù)制成員設(shè)置不會(huì)被克隆,也不會(huì)在加入節(jié)點(diǎn)上做任何更改。即,組復(fù)制相關(guān)的配置需要自行配置好,不能跟集群中的現(xiàn)有成員沖突,遠(yuǎn)程克隆操作只負(fù)責(zé)克隆數(shù)據(jù)文件,不會(huì)克隆配置信息(當(dāng)然,如果某些配置信息保存在表里,對(duì)于克隆操作來(lái)說(shuō),也會(huì)被當(dāng)做數(shù)據(jù)進(jìn)行克隆)。

如果遠(yuǎn)程克隆過(guò)程花費(fèi)很長(zhǎng)時(shí)間,則在MySQL 8.0.22之前的發(fā)行版中,在該時(shí)間段內(nèi)為該集群累積的一組認(rèn)證信息可能會(huì)變得太大而無(wú)法傳輸給加入成員。在這種情況下,加入成員會(huì)記錄一條錯(cuò)誤消息,并且不會(huì)加入該集群。從MySQL 8.0.22開(kāi)始,組復(fù)制以不同的方式管理應(yīng)用事務(wù)的垃圾收集過(guò)程,以避免發(fā)生這種情況。在早期版本中,如果確實(shí)看到此錯(cuò)誤,則在遠(yuǎn)程克隆操作完成之后,請(qǐng)等待兩分鐘,以允許進(jìn)行一輪垃圾收集,以減小集群的認(rèn)證信息的大小。然后在加入成員上發(fā)出以下聲明,以使其停止嘗試應(yīng)用先前的認(rèn)證信息集:

RESET SLAVE FORCHANNEL group_replication_recovery;
RESET REPLICA FOR CHANNEL group_replication_recovery;(從8.0.22開(kāi)始)

引導(dǎo)節(jié)點(diǎn)中用于組復(fù)制專用通道groupreplicationrecovery的用戶憑證(復(fù)制用戶和密碼),在克隆操作完成之后,會(huì)被新成員使用,所以,該用戶和密碼及其權(quán)限必須在新成員中也有效。因此,所有組成員才能夠使用相同的復(fù)制用戶和密碼通過(guò)遠(yuǎn)程克隆操作接收狀態(tài)傳輸進(jìn)行分布式恢復(fù)。但是,組復(fù)制會(huì)保留與使用SSL相關(guān)的組復(fù)制通道設(shè)置,這些設(shè)置對(duì)單個(gè)成員來(lái)說(shuō)可以是惟一的(即,每個(gè)組成員使用不同的復(fù)制用戶和密碼)。如果使用了PRIVILEGECHECKSUSER帳戶來(lái)幫助保護(hù)復(fù)制應(yīng)用線程(從MySQL8.0.18開(kāi)始,可以創(chuàng)建一個(gè)具有特定權(quán)限的用戶賬號(hào),然后將其指定為PRIVILEGECHECKSUSER帳戶,這樣可以防止將未經(jīng)授權(quán)或意外將具有特權(quán)的賬號(hào)用于組復(fù)制通道),則在克隆操作完成之后新加入成員不會(huì)使用該用戶帳戶作為組復(fù)制通道的用戶。此時(shí)必須為組復(fù)制通道手工指定合適的復(fù)制用戶。

如果引導(dǎo)節(jié)點(diǎn)用于groupreplicationrecovery復(fù)制通道的復(fù)制用戶憑據(jù)已使用CHANGE MASTER TO語(yǔ)句存儲(chǔ)在復(fù)制元數(shù)據(jù)存儲(chǔ)庫(kù)中,則在克隆后將它們轉(zhuǎn)移到加入成員并由其使用,并且它們?cè)诖颂幈仨氂行?。因此,使用存?chǔ)的憑據(jù),所有通過(guò)遠(yuǎn)程克隆操作接收狀態(tài)轉(zhuǎn)移的組成員都會(huì)自動(dòng)接收復(fù)制用戶和密碼,進(jìn)行分布式恢復(fù)。如果在START GROUPREPLICATION語(yǔ)句上指定了復(fù)制用戶憑據(jù),則這些憑據(jù)將用于啟動(dòng)遠(yuǎn)程克隆操作,但是在克隆后它們不會(huì)傳輸?shù)郊尤牍?jié)點(diǎn)并由其使用。如果不希望將憑據(jù)轉(zhuǎn)移到新的server上并記錄在那里,確保在進(jìn)行遠(yuǎn)程克隆操作之前取消設(shè)置它們,并使用START GROUPREPLICATION代替提供它們。

ps:如果已使用PRIVILEGECHECKSUSER帳戶來(lái)幫助保護(hù)復(fù)制應(yīng)用程序,則從MySQL 8.0.19開(kāi)始,會(huì)將PRIVILEGECHECKSUSER帳戶以及來(lái)自引導(dǎo)節(jié)點(diǎn)的相關(guān)設(shè)置克隆出來(lái)。如果將加入節(jié)點(diǎn)設(shè)置為在啟動(dòng)時(shí)啟動(dòng)組復(fù)制,它將自動(dòng)使用該帳戶在相應(yīng)的復(fù)制通道上進(jìn)行權(quán)限檢查。(在MySQL 8.0.18中,由于許多限制,建議不要將PRIVILEGECHECKSUSER帳戶用于組復(fù)制通道。)

3.4克隆的其他用處

組復(fù)制啟動(dòng)并管理用于分布式恢復(fù)的克隆操作。設(shè)置為支持克隆的組成員也可以參與用戶手動(dòng)啟動(dòng)的克隆操作。例如,可能希望通過(guò)從組成員作為引導(dǎo)節(jié)點(diǎn)來(lái)進(jìn)行克隆來(lái)創(chuàng)建新的MySQL實(shí)例,但是不希望新的服務(wù)器實(shí)例立即加入或可能永遠(yuǎn)不會(huì)加入該集群。

在所有支持克隆的發(fā)行版中,可以手動(dòng)啟動(dòng)涉及停止了組復(fù)制的組成員的克隆操作。由于克隆要求引導(dǎo)節(jié)點(diǎn)和接收數(shù)據(jù)的節(jié)點(diǎn)上的克隆插件必須匹配,因此即使不希望該實(shí)例加入集群,也必須在另一個(gè)實(shí)例上安裝并激活組復(fù)制插件??梢酝ㄟ^(guò)發(fā)出以下語(yǔ)句來(lái)安裝插件:

INSTALL PLUGIN group_replication SONAME'group_replication.so';

在MySQL 8.0.20之前的發(fā)行版中,如果操作涉及正在運(yùn)行“組復(fù)制”的組成員,則無(wú)法手動(dòng)啟動(dòng)克隆操作。從MySQL8.0.20開(kāi)始,只要克隆操作不會(huì)刪除和替換接收者上的數(shù)據(jù),就可以執(zhí)行此操作。因此,如果正在運(yùn)行組復(fù)制,則用于啟動(dòng)克隆操作的語(yǔ)句必須包含DATA DIRECTORY子句。

以上就是關(guān)于“MySQL分布式恢復(fù)的方法是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI