本文是對這篇文章MySQL InnoDB Cluster - Navigating the Cluster[1]的翻譯,翻譯如有不當(dāng)?shù)牡胤?,敬請諒解,請尊重原?chuàng)和翻譯勞動成果,轉(zhuǎn)載的時候請注明出處。謝謝!
當(dāng)我們管理InnoDB Cluster時,一件非常重要的事情就是了解集群處于什么樣的狀態(tài),特別是要了解如何解釋集群狀態(tài)的報告,以及如何從各種具體失敗的故障場景中恢復(fù)。
組復(fù)制成員狀態(tài)
組成員所處的狀態(tài)取決于您是直接查詢該成員還是通過其他成員間接查詢該成員。
成員本身可見的狀態(tài):
OFFLINE
RECOVERING
ERROR
ONLINE
對其他成員可見的狀態(tài):
RECOVERING
UNREACHABLE
ONLINE
當(dāng)MySQL實例正在運行但是其尚未加入任何組時,它就處于OFFLINE的狀態(tài)。一旦它加入一個組后,MySQL實例與該組的其它節(jié)點/成員同步數(shù)據(jù)時,它將切換為RECOVERING。一旦數(shù)據(jù)同步恢復(fù)完成(分布式恢復(fù)完成),它最終切換到ONLINE狀態(tài).?如果數(shù)據(jù)同步由于某些原因失敗時,節(jié)點則會切換到ERROR狀態(tài).
如果一個ONLINE的成員停止響應(yīng)其他成員時(因為MySQL實例崩潰、網(wǎng)絡(luò)問題、極高的負載、超時等),其狀態(tài)將切換為UNREACHABLE。如果該UNREACHABLE成員在超時之前沒有恢復(fù),它將被其它成員從組中剔除/驅(qū)逐,因此在命令cluster.status()的輸出中狀態(tài)顯示為MISSING。驅(qū)逐成員的過程是通過投票完成的,因此只有在有足夠的成員并達到法定人數(shù)的情況下才會發(fā)生。

組或副本集狀態(tài)
下圖概述了組呈現(xiàn)的可能狀態(tài)以及狀態(tài)轉(zhuǎn)換是如何發(fā)生的。
實線過渡線顯示您可以在每種狀態(tài)下執(zhí)行的 MySQL Shell 命令,而虛線則是在我們控制之外觸發(fā)的事件。
為了減少混亂,圖中省略了一些可能性。例如,只要有法定人數(shù),您就可以在任何狀態(tài)下執(zhí)行大多數(shù)命令,例如addInstance()或rejoinInstance()命令
cluster.status()命令顯示的組狀態(tài)信息:
OK???????????????–當(dāng)所有成員都屬于ONLINE狀態(tài)并且有足夠的冗余來容忍至少一個節(jié)點故障時顯示。
OK_PARTIAL???????–當(dāng)一個或多個成員不可用,但仍有足夠的冗余來容忍至少一個節(jié)點故障時。
OK_NO_TOLERANCE??–當(dāng)有足夠的ONLINE成員達到法定人數(shù),但沒有冗余節(jié)點時。兩個成員組成的團體沒有冗余,因為如果其中一個成員變成了UNREACHABLE,另一個成員就無法單獨形成大多數(shù);
????????????????????這意味著您將遇到數(shù)據(jù)庫中斷(database?outage)情況。但與單個成員組不同的是,至少您的數(shù)據(jù)在至少一個節(jié)點上仍然是安全的。
NO_QUORUM????????–?一個或多個成員可能仍然是ONLINE,但不能達到法定人數(shù)。在此狀態(tài)下,您的集群不能寫入,因此無法執(zhí)行事務(wù)。但是,只讀查詢?nèi)匀豢梢詧?zhí)行,并且您的數(shù)據(jù)是完整且安全的。
UNKNOWN??????????–?如果您從一個不是ONLINE或RECOVERING狀態(tài)的實例執(zhí)行命令status()時,則會顯示此狀態(tài)。在這種情況下,請嘗試連接到其他成員。?
UNAVAILABLE??????–?該狀態(tài)在圖中顯示,但不會出現(xiàn)在cluster.status()命令顯示中。在這種狀態(tài)下,該組的所有成員都是OFFLINE。他們可能仍在運行,但他們不再是該集群的一部分。例如,如果所有成員重新啟動而沒有重新加入集群,則可能會發(fā)生這種情況。

InnoDB集群的狀態(tài)轉(zhuǎn)換圖。(PDF版[2])
組分區(qū)
一種特殊場景是組分區(qū),雖然這種情況很少見,但可能會造成混亂,有時甚至很危險,即組的成員實際上分為2個組或多個組。例如,如果您的成員位于不同的網(wǎng)絡(luò)中并且他們之間的通信中斷,則可能會發(fā)生這種情況。在這種情況下,所有成員都是ONLINE,但一個組的成員將被另一個組成員視為UNREACHABLE,反之亦然。由于需要多數(shù),只有一個組(最多一個組)能夠接收數(shù)據(jù)更新,從而保持?jǐn)?shù)據(jù)庫的一致性。
但是,當(dāng)使用cluster.forceQuorumUsingPartitionOf()命令時,就像下面所解釋的那樣,您必須小心,不要讓組成員處于這種情況。如果遇到這種情況,您可能會創(chuàng)建2個單獨的組來分別接收更新,這將導(dǎo)致您的數(shù)據(jù)庫獨立處理事務(wù)并使其處于不一致的狀態(tài)。

5個成員全部ONLINE

5人成員分裂為兩組
從失敗中恢復(fù)
以下場景是發(fā)生故障時可能遇到的一些最常見情況。我們解釋了如何識別它們以及如何在MySQL Shell中使用InnoDB Cluster API 來恢復(fù)它們。
服務(wù)器重新啟動
如果mysqld 由于任何原因(實例崩潰、預(yù)期重啟、重新配置等)重新啟動,那么當(dāng)它恢復(fù)時,它將不再位于該組/集群中。它需要重新加入它,這在某些情況下可能必須手動完成。為此,您可以使用cluster.rejoinInstance()命令將MySQL實例加入回組中。它用的參數(shù)是MySQL實例的URI。
示例:
cluster.rejoinInstance("root@192.168.1.50")
失去法定人數(shù)
如果副本集的大量成員變成UNREACHABLE,以至于它不再擁有多數(shù)成員,則它將不再擁有法定人數(shù),并且無法對任何更改做出決定。這包括用戶事務(wù),還包括組拓撲的更改。這意味著,即使成員從UNREACHABLE狀態(tài)恢復(fù)了, 該成員依然被阻止,無法重新加入該群組。
要從這種情況中恢復(fù),我們必須首先取消該組(unblock the group),方法是將其重新配置,僅考慮當(dāng)前ONLINE的成員并忽略所有其他成員。為此,用cluster.forceQuorumUsingPartitionOf()這個命令 傳入復(fù)制集中中一個ONLINE的成員的URL作為參數(shù)。所有可見的ONLINE成員都將添加到重新定義的組中。
請注意,這個命令是一個危險的命令。如上所述,如果您的組中碰巧有一個分區(qū),您可能會意外地出現(xiàn)裂腦,這將導(dǎo)致數(shù)據(jù)庫不一致。在使用此命令之前,請確保所有成員都是UNREACHABLE,并且狀態(tài)為OFFLINE。
例子:?cluster.forceQuorumUsingPartitionOf("root@192.168.1.30")
所有成員OFFLINE
cluster.forceQuorumUsingPartitionOf()命令要求至少有一個實例一直處于ONLINE并且屬于該組。如果不知何故,您的所有成員都是OFFLINE狀態(tài),則只有從單個種子成員中再次“引導(dǎo)”該組,您才能恢復(fù)該組。要執(zhí)行此操作,您需要在選中的種子實例上使用命令dba.restoreFromCompleteOutage(),然后在剩余成員上使用命令rejoinInstance(),直到集群完全恢復(fù)為止。
注意:此命令從 MySQL Shell 1.0.7 開始可用。
結(jié)論
MySQL InnoDB Cluster意在為擁有不同知識和經(jīng)驗水平的 MySQL 用戶提供高可用性。雖然cluster.status()命令可以讓您一目了然地監(jiān)控集群的狀態(tài),但如何了解原理非常重要,這樣您就知道何時需要該采取哪些措施來確保 MySQL 數(shù)據(jù)庫保持最佳運行狀態(tài)。
參考資料
1: https://dev.mysql.com/blog-archive/mysql-innodb-cluster-navigating-the-cluster/,文章來源:http://www.zghlxwxcb.cn/news/detail-746954.html
[2]pdf: https://dev.mysql.com/blog-archive/mysqlserverteam/wp-content/uploads/2016/12/AvailabilityStateMachine.pdf文章來源地址http://www.zghlxwxcb.cn/news/detail-746954.html
到了這里,關(guān)于翻譯:MySQL InnoDB Cluster - Navigating the Cluster的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!