MySQL Replication 是 MySQL 非常有特色的一個功能,他能夠將一個 MySQL Server 的 Instance 中的數據完整的復制到另外一個 MySQL Server 的 Instance 中。雖然復制過程並不是實時而是異步進行的,但是由於其高效的性能設計,延時非常之少。
Mysql 的 Replication 是一個異步的復制過程,從一個 Mysql instace(我們稱之為 Master)復制到另一個 Mysql instance(我們稱之 Slave)。在 Master 與 Slave 之間的 實現整個復制過程主要由三個線程來完成,其中兩個線程(Sql線程和IO線程)在 Slave 端 , 另外一個線程(IO 線程)在Master 端。
必須打開 Master 端的 Binary Log(mysqlbin.xxxxxx)功能,打開方式有兩種,分別是:
1.通過在啟動 MySQL Server 的過程中使用“—log-bin” 參數選項;
2.在 my.cnf 配置文件中的 mysqld 參數組([mysqld]標識後的參數部分)增加 “log-bin” 參數;
MySQL 復制的基本過程如下:
1. Slave 上面的 IO 線程連接上 Master,並請求從指定日志文件的指定位置(或者從 最開始的日志)之後的日志內容;
2. Master 接收到來自 Slave 的 IO 線程的請求後,通過負責復制的 IO 線程根據請 求信息讀取指定日志指定位置之後的日志信息,返回給 Slave 端的 IO 線程。返回信 息中除
了日志所包含的信息之外,還包括本次返回的信息在 Master 端的 Binary Log 文件的名稱以及在 Binary Log 中的位置;
3. Slave 的 IO 線程接收到信息後,將接收到的日志內容依次寫入到 Slave 端的 Relay Log 文件(mysql-relay-bin.xxxxxx)的最末端,並將讀取到的 Master 端的 binlog 的文
件名和位置記錄到 master-info 文件中,以便在下一次讀取的時候能夠清楚的 高速 Master“我需要從某個 bin-log 的哪個位置開始往後的日志內容,請發給我”
4. Slave 的 SQL 線程檢測到 Relay Log 中新增加了內容後,會馬上解析該 Log 文 件中的內容成為在 Master 端真實執行時候的那些可執行的 Query 語句,並在自身執 行這些
Query。這樣,實際上就是在 Master 端和 Slave 端執行了同樣的 Query,所 以兩端的數據是完全一樣的。
復制實現級別:
MySQL 的復制可以是基於一條語句(Statement Level),也可以是基於一條記錄(Row level),可以在 MySQL 的配置參數中設定這個復制級別,不同復制級別的設置會影響到 Master 端的 Binary Log 記錄成不同的形式。
1. Row Level:Binary Log 中會記錄成每一行數據被修改的形式,然後在 Slave 端 再對相同的數據進行修改。
2. Statement Level:每一條會修改數據的 Query 都會記錄到 Master 的 Binary Log 中。Slave 在復制的時候 SQL 線程會解析成和原來 Master 端執行過的相同的 Query 來再次執行。
3.Mixed Level,實際上就是前兩種模式的結合。在 Mixed 模式下,MySQL 會根據執行的每一條具體的 Query 語句來區分對待記錄的日志形式,也就是在 Statement 和 Row 之間選擇一種。
Replication 常用架構:
1.Master - Slaves
2. Master - Master
3.級聯復制
4. Dual Master 與級聯復制結合架構