您需要了解的一點是,該文章簡要提到,每個MariaDB的GTID實現都可能導致這種情況出現問題。由於每個節點都維護自己的GTID列表,並且加萊拉事務沒有自己的ID,所以相同的GTID可能不會指向每個服務器上的相同位置(請參閱this article)。
由於這個問題,我不會試圖在沒有MariaDB 10.1的情況下做什麼。 MariaDB 10.1.8剛剛發佈,是10.1版本的第一個GA版本。 10.1改變了GTID的實現,所以加萊拉事務使用它們自己的server_id
(通過配置變量設置)。然後,您可以在從屬上過濾複製以僅複製galera id。
要切換到不同的從服務器,您將需要獲取舊的從服務器上執行的最後一個GTID。 gtid_slave_pos
存儲在mysql.gtid_slave_pos
中,但不會複製mysql.*
表。我不完全確定,如果事務的原始GTID傳遞給其他從屬加萊拉節點(即,如果主集羣的galera server_id是1,並且從屬集羣的galera server_id是2並且MDBDR-01通過GTID 1-1-123獲取一個事件,MDBDR-02將其記錄爲1-1-123或1-2-456)。我猜測它並沒有,因爲新的GTID實現應該改變server_id,但你可能能夠驗證這一點。既然你可能無法從一個不同的奴隸加萊拉節點獲得最後一個執行的主GTID,你可能需要從舊的奴隸獲得GTID,除非你正常關閉舊的奴隸,否則這可能是不可能的。您可能需要從新的從站上的binlog中的上次執行的事務中找到GTID,並嘗試將其與主站的binlog中的事務相匹配。另外,如果您不使用sync_binlog = 1
,binlog不可靠,可能會稍微落後。
由於每個加萊拉節點可能不知道執行的GTID並且不能跳過以前的GTID事件,因此如果您發現的GTID落在後面,您可能還必須使用SQL_SLAVE_SKIP_COUNTER
才能玩到正確的位置。
當你得到GTID(或猜測它)時,你將在新的slave上設置複製,就像你在原來的slave上設置它一樣。下面的命令應該這樣做:
SET GLOBAL gtid_slave_pos = "{Last Executed GTID}";
CHANGE MASTER TO master_host="{Master Address}", master_port={Master Port}, master_user="{Replication User}", master_password={Replication Password}, master_use_gtid=slave_pos;
START SLAVE;
你應該對舊從屬重新啓動它,因此錯過了事件沒有得到複製前兩次也禁止複製。
直到執行的slave GTID通過galera複製,這可能永遠不會發生,像這樣的故障轉移將是一個混亂的過程。
MariaDB的GTID,而不是Oracle的? –
嗨瑞克,我們正在使用MariaDB Galera集羣而不是Oracle MySQL集羣。 –
「NDB集羣並不是我所問的,Oracle的5.6有一種GTID,Galera有另一種(但是,Galera也可以處理) –