gh-ost的cut-over過程

作者:魏新平雪隧,知數(shù)堂第5期MySQL實戰(zhàn)班學員漓糙,第10期MySQL優(yōu)化班學員卿闹,現(xiàn)任職助教捺宗。

Describing safe, blocking, atomic, pure-mysql cut-over phase

原文鏈接:https://github.com/github/gh-ost/issues/82

作者:shlomi-noach

我們提供的方式是基于兩個數(shù)據(jù)庫連接的对蒲。假如我們的連接是C10钩蚊,C20。應用的連接是C1..C9,C11..C19,C21..C29齐蔽。

  • C1..C9在 tbl 上進行正常的dml操作:INSERT, UPDATE, DELETE

  • C10: CREATE TABLE tbl_old (id int primary key) COMMENT='magic-be-here'

  • C10: LOCK TABLES tbl WRITE, tbl_old WRITE

  • C11..C19,新進來的對tbl的操作两疚,由于C10的鎖,會被阻塞

  • C20: RENAME TABLE tbl TO tbl_old, ghost TO tbl

  • 由于C10加的鎖含滴,也會被阻塞住诱渤。但是當鎖被釋放后,會比C1..C9,C11..C19先執(zhí)行谈况。

  • C21..C29勺美,新進來對tbl的dml操作還是會被阻塞住

  • C10: 檢測C20的rename操作是否存在(在show processlist當中尋找rename關鍵字)

  • C10: DROP TABLE tbl_old

  • 大家還是被鎖住,什么嚴重的事情都不會發(fā)生碑韵,除了刪除這個tbl_old表赡茸。

  • C10:UNLOCK TABLES

  • BAM(象聲詞,不知道怎么翻譯祝闻,尷尬占卧,只能意會不能言傳)!RENAME操作會先執(zhí)行联喘,ghost表會被重命名為tbl表华蜒,然后C1..C9,C11..C19,C21..C29會直接在新的tbl表上執(zhí)行豁遭。

一些解釋:

  • 創(chuàng)建tbl_old是為了阻止C20的RENAME操作

  • 當一個連接擁有對某個表的WRITE鎖的時候叭喜,可以執(zhí)行drop該表的操作。

  • 不管是誰先被阻塞蓖谢,當一個表的INSERT/UPDATE/DELETE操作和RENAME操作同時被阻塞的情況下捂蕴,RENAME操作總是會先執(zhí)行。

假如上面的過程當中C10或者C20失敗了闪幽,會發(fā)生什么呢

先說結論啥辨,就算失敗了,不會發(fā)生災難性的事情盯腌,也不需要回滾溉知。

  • 假如C10在CREATE tbl_old的時候發(fā)生錯誤,直接退出

  • 假如C10在LOCK tbl,tbl_old的語句發(fā)生錯誤,直接退出着倾,表不會被鎖住,app可以繼續(xù)對tbl進行dml操作

  • 假如C10在C20剛要執(zhí)行RENAME操作的時候連接直接掛了

  • WRITE鎖會被釋放掉燕少,C1..C9卡者,C11..C19可以繼續(xù)在原表執(zhí)行

  • C20會因為tbl_old表的存在而RENAME失敗

  • 整個操作失敗,但是沒什么嚴重的問題產(chǎn)生客们,只是一些語句被阻塞了很短的一段時間崇决。我們會重試整個cut-over流程。

  • 假如C10在C20被阻塞后掛了底挫,發(fā)生的事情和上面的流程差不多恒傻。鎖釋放,C20失斀ǖ恕(因為tbl_old的存在),其他所有的被阻塞的語句會正常在原來的表上執(zhí)行

  • 假如C20在C10 DROP表之前掛了盈厘,我們會捕捉到錯誤并按計劃執(zhí)行。刪除表并且釋放鎖官边。沒什么嚴重的事情發(fā)生沸手,頂多一些語句被阻塞一會。我們需要重新嘗試整個流程注簿。

  • 假如C20在C10 DROP后釋放鎖之前掛了契吉,和上面發(fā)生的事情一樣。

  • 假如C10和C20都掛了诡渴。鎖被釋放捐晶,RENAME失敗,C1..C9,C11..C19,C21..C29阻塞的語句會正常在tbl上執(zhí)行妄辩。

不管發(fā)生什么事情惑灵,在操作的最后我們都會檢查ghost表是否還存在。假如不在了恩袱,那就說明操作成功了泣棋。整個流程可以被看成是原子性的。

順便說一下畔塔,如果操作失敗了潭辈,可能會存在table_old表需要我們手動刪除澈吨。其實刪不刪除都無所謂把敢。如果你看不慣可以刪除掉,不刪除掉的話谅辣,也沒關系修赞,下一次操作就不用重建了。

對應用的影響

在流程開始之后到流程結束的時間里,不管是成功還是失敗柏副,應用的連接都會被阻塞住勾邦。成功的話,阻塞的語句會被執(zhí)行到新表割择,失敗的話眷篇,阻塞的語句會執(zhí)行到舊表。

對復制的影響

復制只會看到RENAME操作荔泳,binlog是不會記錄lock語句的蕉饼。所以復制看到的是原子性的兩表交換,不會有表不存在的情況玛歌。

針對網(wǎng)友的一些提問

為啥要用兩個連接進行這么麻煩的流程昧港?

因為一個連接在獲取tbl的鎖的情況下,無法進行rename操作(至少現(xiàn)在不能)支子。但是作者說他會說服工程師在MYSQL的下個版本當中實現(xiàn)创肥,就不需要這么麻煩的操作了。(下面代碼測試是我測試的译荞,不是作者的)

admin@localhost [test]  11:39:32>lock table t write;
Query OK,  0 rows affected (0.00 sec)
    
admin@localhost [test]  11:39:36>rename table t to t10;
ERROR 1192  (HY000):  Can't execute the given command because you have active locked tables or an active transaction
admin@localhost [test] 11:39:48>select @@version;
+---------------+
| @@version     |
+---------------+
| 5.7.22-22-log |
+---------------+
1 row in set (0.00 sec)
為啥要鎖原來的表和創(chuàng)建的tbl_old表瓤的?

由于異步的應用binlog的日志,如果不鎖住原表的話吞歼,可能會存在一些語句未被應用圈膏。為啥要鎖住tbl_old表呢,作者自己也不太記得了篙骡,因為時間的原因稽坤,畢竟是回憶三年前的事情了,不過肯定是有原因的糯俗。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末尿褪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子得湘,更是在濱河造成了極大的恐慌杖玲,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淘正,死亡現(xiàn)場離奇詭異摆马,居然都是意外死亡,警方通過查閱死者的電腦和手機鸿吆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門囤采,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惩淳,你說我怎么就攤上這事蕉毯。” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵代虾,是天一觀的道長进肯。 經(jīng)常有香客問我,道長棉磨,這世上最難降的妖魔是什么坷澡? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮含蓉,結果婚禮上,老公的妹妹穿的比我還像新娘项郊。我一直安慰自己馅扣,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布着降。 她就那樣靜靜地躺著差油,像睡著了一般。 火紅的嫁衣襯著肌膚如雪任洞。 梳的紋絲不亂的頭發(fā)上蓄喇,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音交掏,去河邊找鬼妆偏。 笑死,一個胖子當著我的面吹牛盅弛,可吹牛的內容都是我干的钱骂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼挪鹏,長吁一口氣:“原來是場噩夢啊……” “哼见秽!你這毒婦竟也來了?” 一聲冷哼從身側響起讨盒,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤解取,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后返顺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禀苦,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年创南,在試婚紗的時候發(fā)現(xiàn)自己被綠了伦忠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡稿辙,死狀恐怖昆码,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤赋咽,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布旧噪,位于F島的核電站,受9級特大地震影響脓匿,放射性物質發(fā)生泄漏淘钟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一陪毡、第九天 我趴在偏房一處隱蔽的房頂上張望米母。 院中可真熱鬧,春花似錦毡琉、人聲如沸铁瞒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慧耍。三九已至,卻和暖如春丐谋,著一層夾襖步出監(jiān)牢的瞬間芍碧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工号俐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泌豆,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓吏饿,卻偏偏與公主長得像践美,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子找岖,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容