用戶命令:通過網(wǎng)絡連上gh-ost,通過命令讓它暫停。
動態(tài)可控
如果別的工具在修改過程中產(chǎn)生了比較高的負載,DBA只好把它停掉再修改配置,比如把一次拷貝的數(shù)據(jù)量改小些,然后再從頭開始修改過程。這樣的反復操作代價非常大。
gh-ost通過監(jiān)聽TCP或者unix socket文件來獲取命令。即使有正在進行中的修改工作,用戶也可以向gh-ost發(fā)出命令修改配置,比如可以這樣做:
echo throttle | socat - /tmp/gh-ost.sock:這是暫停命令。也可以輸入no-throttle
修改運行參數(shù),gh-ost可以接受這樣的修改方式來改變它的行為:chunk-size=1500, max-lag-millis=2000, max-load=Thread_running=30
可審計
用上面所說的相同接口也可以查看gh-ost的狀態(tài),查看當前任務進度、主要配置參數(shù)、相關(guān)MySQL實例的情況等。這些信息通過網(wǎng)絡發(fā)送命令就可以得到,因此就給了運維人員極大的靈活性,如果是使用別的工具的話一般只能是通過共享屏幕或者不斷跟蹤日志文件最新內(nèi)容。
可測試
讀取二進制文件內(nèi)容的操作完全不會增加主庫的負載,在從庫上做修改表結(jié)構(gòu)的操作也和在主庫上做是非常相象的(當然并不完全一樣,但主要來說還是差不多的)。
gh-ost自帶了--test-on-replica選項來支持測試功能,它允許你在從庫上運行起修改表結(jié)構(gòu)操作,在操作結(jié)束時會暫停主從復制,讓兩張表都處于同步、就緒狀態(tài),然后切換表、再切換回來。這樣就可以讓用戶從容不迫地對兩張表進行檢查和對比。
在GitHub是這樣在生產(chǎn)環(huán)境測試gh-ost的:有許多個指定的生產(chǎn)從庫,在上面不提供服務,只是周而復始地不斷地把所有表定義都改來改去。對于生產(chǎn)環(huán)境地每一張表,小到空表,大到幾百GB,都會通過修改存儲引擎的方式來進行修改(engine=innodb),這樣并不會真正修改表結(jié)構(gòu)。在每一次這樣的修改操作最后都會停掉主從復制,再把原始表和臨時表的全量數(shù)據(jù)都各做一次校驗和,然后比較兩個校驗和,要求它們是一致的。然后恢復主從復制,再繼續(xù)測試下一張表。Github生產(chǎn)環(huán)境的每一張表都這樣用gh-ost在從庫上做過好多次修改測試。
可靠性高
所有上述講到的和沒講到的內(nèi)容,都是為了讓你對gh-ost的能力建立信任。畢竟,大家在做這件事的時候已經(jīng)使用類似工具做了好多年,而gh-ost只是一個新工具。
Github在從庫上對gh-ost進行測試,在去主庫上做第一次真正改動之前在從庫上成功地試了幾千次。所以,請你也在從庫上開始測試,驗證數(shù)據(jù)是完好無損的,然后再把它用到生產(chǎn)環(huán)境。希望你可以放手去試。
當你執(zhí)行了gh-ost之后,也許你會看見主庫的負載變高了,那你可以發(fā)出暫停命令。用echo throttle命令生成一個文件,看看主庫的負載會不會又變得正常。試一下這些命令,你就可以知道你可以怎樣控制它的行為,你的心里就會安定許多。
你發(fā)起了一次修改操作,然后估計完成時間是凌晨2點鐘,可是你又非常關(guān)心最后的切換操作,非常想看著它切換,這可怎么辦?只需要一個標志位文件就可以告訴gh-ost推遲切換了,這樣gh-ost會只做完拷貝數(shù)據(jù)的操作,但不會切換表。它還會仍然繼續(xù)同步數(shù)據(jù),保持臨時表的數(shù)據(jù)處于同步狀態(tài)。等第二天早上你回到辦公室之后,刪除標志位文件或者向gh-ost發(fā)送命令echo unpostpone,它就會做切換了。沒有人希望軟件強迫自己看著它做事情,它應該把大家解放出來,讓人去做人該做的事。
談到估計完成時間,--exact-rowcount選項非常有用。在最開始時要在目標表上做個代價比較大的SELECT COUNT(*)操作查出具體要拷多少行數(shù)據(jù),gh-ost就會對它要做多少工作有了一個比較準確的估計。接下來在拷貝的過程中,它會不斷地嘗試更新這個估計值。因為預計完成的時間點總是會不斷變化,所以已經(jīng)完成的百分比就反而比較精確。如果你也曾經(jīng)有過非常痛苦的經(jīng)歷,看著已經(jīng)完成99%了可是剩下的一點操作卻繼續(xù)了一個小時也沒完,你就會非常喜歡gh-ost提供的這個功能。
gh-ost工作模式
gh-ost工作時可以連上多個MySQL實例,同時也把自己以從庫的方式連上其中一個實例來獲取二進制日志事件。根據(jù)你的配置、數(shù)據(jù)庫集群架構(gòu)和你想在哪里執(zhí)行修改操作,可以有許多種不同的工作模式。