MySQL備份mydumper的原理【轉】

本文來自:http://baiyangtx.net/2016/09/04/mydumper-principle/mysql

相對於MySQL官方提供的邏輯備份工具 mysqldump , mydumper最大的特色就是能夠採用多線程並行備份,大大提升了數據導出的速度。這裏對mydumper的工做原理作個分析,看一下mydumper如何巧妙的利用Innodb引擎提供的MVCC版本控制的功能,實現多線程併發獲取一致性數據。sql

這裏一致性數據指的是在某個時間點,導出的數據與導出的Binlog文件信息相匹配,若是導出了多張表的數據,這些不一樣表之間的數據都是同一個時間點的數據。數據庫

在mydumper進行備份的時候,由一個主線程以及多個備份線程完成。其主線程的流程是:多線程

  1. 鏈接數據庫
  2. FLUSH TABLES WITH READ LOCK 將髒頁刷新到磁盤並得到只讀鎖
  3. START TRANSACTION /!40108 WITH CONSISTENT SNAPSHOT / 開啓事物並獲取一致性快照
  4. SHOW MASTER STATUS 得到binlog信息
  5. 建立子線程並鏈接數據庫
  6. 爲子線程分配任務並push到隊列中
  7. UNLOCK TABLES / FTWRL / 釋放鎖

子線程的主要流程是:併發

  1. 鏈接數據庫
  2. SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE
  3. START TRANSACTION /!40108 WITH CONSISTENT SNAPSHOT /
  4. 從隊列中pop任務並執行

上述兩個線程的流程的關係如圖異步

從圖中能夠看到,主線程釋放鎖是在子線程開啓事物以後。這裏是保證子線程得到的數據必定爲一致性數據的關鍵。
主線程在鏈接到數據庫後當即經過Flush tables with read lock(FTWRL) 操做將髒頁刷新到磁盤,並獲取一個全局的只讀鎖,這樣即可以保證在鎖釋放以前由主線程看到的數據是一致的。而後當即經過 Start Transaction with consistent snapshot 建立一個快照讀事物,並經過 show master status獲取binlog位置信息。
而後建立完成dump任務的子線程併爲其分配任務。工具

主線程在建立子線程後經過一個異步消息隊列 ready 等待子線程準備完畢。 子線程在建立後當即建立到MySQL數據庫的鏈接,而後設置當前事務隔離級別爲Repeatable Read。
設置完成以後開始快照讀事務。在完成這一系列操做以後,子線程纔會經過ready隊列告訴主線本身程準備完畢。主線程等待所有子線程準備完畢開啓一致性讀Snapshot事務後纔會釋放全局只讀鎖(Unlock Table)。spa

若是隻有Innodb表,那麼只有在建立任務階段會加鎖。可是若是存在MyIsam表或其餘不帶有MVCC功能的表,那麼在這些表的導出任務完成以前都必須對這些表進行加鎖。Mydumper自己維護了一個 non_innodb_table 列表,在建立任務階段會首先爲非Innodb表建立任務。同時還維護了一個全局的unlock_table隊列以及一個原子計數器 non_innodb_table_counter , 子線程每完成一個非Innodb表的任務便將 non_innodb_table_counter 減一,若是non_innodb_table_counter 值爲0 遍經過向 unlock_table 隊列push一個消息的方式通知主線程完成了非Innodb表的導出任務能夠執行 unlock table操做。.net

mydumper支持記錄級別的併發導出。在記錄級別的導出時,主線程在作任務分配的時候會對錶進行拆分,爲表的一部分記錄建立一個任務。這樣作一個好處就是當有某個表特別大的時候能夠儘量的利用多線程併發以避免某個線程在導出一個大表而其餘線程處於空閒狀態。在分割時,首先選取主鍵(PRIMARY KEY)做爲分隔依據,若是沒有主鍵則查找有無惟一索引(UNIQUE KEY)。在以上嘗試都失敗後,再選取一個區分度比較高的字段作爲記錄劃分的依據(經過 show index 結果集中的cardinality的值肯定)。線程

劃分的方式比較暴力,直接經過 select min(filed),max(filed) from table 得到劃分字段的取值範圍,經過 explain select filed from table 獲取字段記錄的行數,而後經過一個肯定的步長得到每個子任務的執行時的where條件。這種計算方式只支持數字類型的字段。

以上就是mydumper的併發獲取一致性數據的方式,其關鍵在於利用了Innodb表的MVCC功能,能夠經過快照讀所以只有在任務建立階段才須要加鎖。

相關文章
相關標籤/搜索