mysql 異步復制,半同步復制


Mysql復制

什么是Mysql復制?

復制是指將主數據庫的 DDLDML 操作通過二進制日志傳到復制服務器(也叫從庫),然后在從庫上對這些日志重新執行(也叫重做),從而使得從庫和主庫的數據保持同步。MysQL支持一台主庫同時向多台從庫進行復制,從庫同時也可以作為其他服務器的主庫,實現鏈狀的復制 。

注意:

由於MySQL實現的是並不是完全同步的復制,所以主從庫之間存在一定的差距,在從庫上進行的査詢操作需要考慮到這些數據的差異, 一般只有更新不頻繁的數據或者對實時性要求不高的數據可以通過從庫查詢, 實時性要求高的數據仍然需要從主數據庫獲得。

名稱解釋:

DMLdata manipulation language)數據操縱語言:

就是我們最經常用到的 SELECTUPDATEINSERTDELETE。 主要用來對數據庫的數據進行一些操作。

DDLdata definition language)數據庫定義語言:

其實就是我們在創建表的時候用到的一些sql,比如說:CREATEALTERDROP等。DDL主要是用在定義或改變表的結構,數據類型,表之間的鏈接和約束等初始化工作上

好處

  1. 如果主庫出現問題,可以快速切換到從庫提供服務。
  2. 可以在從庫上執行查詢操作, 降低主庫的訪問壓力。
  3. 某些數據庫維護工作,比如備份,可以在從庫上執行,以避免備份期間影響主庫的服務。

原理概述

( 1 )首先, MySQL主庫在事務提交時會把數據變更作為事件 Events 記錄在二進制日志文件Binlog; MySQL主庫上的 sync_binlog參數控制 Binlog日志刷新到磁盤。

( 2 )主庫推送二進制日志文件 Binlog中的事件到從庫的中繼日志 Relay Log, 之后從庫根據中繼日志 Relay Log重做數據變更操作,通過邏輯復制以此來達到主庫和從庫的數據一致。

MySQL通過3個線程來完成主從庫間的數據復制:其中 Binlog Dump線程跑在主庫上, I/0線程和 SQL線程跑在從庫上。當在從庫上啟動復制時,首先創建I/0程連接主庫,主庫隨后創建 Binlog Dump線程讀取數據庫事件並發送給 I/0線程, I0線程獲取到事件數據后更新到從庫的中繼日志 Relay Log中去,之后從庫上的 SQL線程讀取中繼日志RelayLog中更新的數據庫事件並應用。

可以通過 SHOW PROCESSLIST命令在主庫上査看 BinlogDump線程,BinlogDump 線程的狀態可以看到, Mysql的復制是主庫主動推送日志到從庫去的,是屬於“”日志的方式來做同步。同樣地,在從庫上通過 SHOW PROCESSLIST可以看到l/O線程和 SQL線程, l/O線程等待主庫上的 Binlog Dump線程.發送事件並更新到中繼日志 RelayLog, SQL線程讀取中繼日志並應用變更到數據庫。

復制中的各類文件解析

日志文件

復制過程中涉及了兩類非常重要的日志文件: 二進制日志文件( Binlog)和中繼日志文件( Relay Log)。二進制日志文件( Binlog)會把 MysQL中的所有數據修改操作以二進制的形式記錄到日志文件中,包括 CreateDropInsertUpdateDelete 操作等,但二進制日志文件(Binlog) 不會記錄 Select操作, 因為 Select操作並不修改數據。

可以通過 show variables査看 Binlog的格式, Binlog支持 StatementRowMixed三種格式,也對應了 MysQL3種復制技術。

中繼日志文件 Relay Log的文件格式、 內容和二進制日志文件 Binlog一樣, 唯一的區別在於從庫上的 SQL線程在執行完當前中繼日志文件 Relay Log中的事件之后, SQL線程會自動刪除當前中繼日志文件 Relay Log,避免從庫上的中繼日志文件 Relay Log占用過多的磁盤空間。為了保證從庫 Crash重啟之后,從庫的 I/0線程和 SQL線程仍然能夠知道從哪里開始復制, 從庫上默認還會創建兩個日志文件 master.inforelay_log.info用來保存復制的進度。這兩個文件在磁盤上以文件形式分別記錄了從庫的 l/0線程當前讀取主庫二進制日志 Binlog的進度和SQL線程應用中繼日志 RelayLog的進度。

可以通過 show slave status命令能夠看到當前從庫復制的狀態。

主要參數:

Master Host: 主庫的 IP.

Master User 主庫上, 主從復制使用的用戶賬號,

Master Port:主庫 MySQL的端口號,

Master_Log_File:從庫的I/0線程當前正在讀取的主庫 Binlog的文件 。

Read_Master Log_Pos:從庫I/0線程當前讀取到的位置。

Relay_Log_File: 從庫 SQL線程正在讀取和應用的中繼日志 Relay Log的文件名 。

Relay_Log_Pos: 從庫 SQL線程當前讀取並應用的中繼日志 Relay Log的位置。

Relay_Master_Log_File:從庫 SQL線程正在讀取和應用的 Relay Log對應於主庫Binlog的文件名 。

Exec_Master_Log_Pos:中繼日志 RelayLogRelay_Log_Pos位置對應於主庫 Binlog 的位置。

三種復制技術

二進制日志文件 Binlog有三種格式:

Statement:基於 SQL語句級別的 Binlog,每條修改數據的 SQL都會保存到 Binlog里。

Row:基於行級別,記錄每一行數據的變化,也就是將每行數據的變化都記錄到 Binlog 里面, 記錄得非常詳細, 但是並不記錄原始 SQL; 在復制的時候, 並不會因為存儲過程或觸發器造成主從庫數據不一致的問通, 但是記錄的日志量較 Statement格式要大得多 。

Mixed:混合StatementRow模式,默認情況下采用 Statement模式記錄,某些情況下會切換到 Row模式

同時也對應了 MysQL復制的3種技術。

binlog_format設置為 Row格式時, MySQL實際上在 Binlog中逐行記錄數據的變更, Row格式比 Statement格式更能保證從庫數據的一致性(復制的是記錄,而不是單純操作 SQL)。當然, Row格式下的 Binlog的日志量很可能會增大非常多,在設置時需要考慮到磁盤空間間題。

參數 binlog_format可以在全局設置或者在當前 session動態設置: 在全局設置會影響所有session,而在當前 session設置則僅僅影響當前 Session。可以通過 SET命令來實時修改二進日志文件(Binlog)的格式。

相關命令

查看當前復制方式

show variables like '%binlog%format%';

更改復制方式

set global binlog_format = 'ROW';

set global binlog_format = 'STATEMENT';

常用的復制架構

復制的3種常見架構有一主多從復制架構、多級復制架構和雙主復制/DrualMaster架構

一主多從

在主庫讀取請求壓力非常大的場景下, 可以通過配置一主多從復制架構實現讀寫分離, 把大量對實時性要求不是特別高的讀請求通過負載均衡分布到多個從庫上, 降低主庫的讀取壓力,在主庫出現異常宕機的情況下, 可以把一個從庫切換為主庫繼續提供服務 。

多級復制

一主多從的架構能夠解決大部分讀請求壓力特別大的場景的需求, 考慮到 MysQL的復制是主庫“推送” Binlog日志到從庫,主庫的 I/0壓力和網絡壓力會隨着從庫的增加而增長(每個從庫都會在主庫上有一個獨立的 Binlog Dump線程來發送事件), 而多級復制架構解決了一主多從場景下,主庫額外的 I/0和網絡壓力。

雙主復制/Dual Master

其實就是主庫 MasterMaster2互為主從, client客戶端的寫請求都訪問主庫 Master,而讀請求可以選擇訪問主庫 MasterMaster2

雙主多級復制架構

當然雙主復制還能和主從復制聯合起來使用:Master2庫下配置從庫 SlaveSlave2,這樣即可通過從庫 Slave等來分擔讀取壓力,MyQL的雙主多級復制架構如圖所示

復制過程搭建

異步復制

主庫執行完Commit后,在主庫寫入Binlog日志后即可成功返回客戶端,無需等Binlog日志傳送給從庫

步驟:

1、確保主從庫安裝了相同版本的數據庫。

2、在主庫上,設置一個復制使用的賬戶,並授予 REPLICATION SLAVE權限。這里創建一個復制用戶repl,可以從IP192.169.56.103的主機進行連接:

 

命令文本:GRANT REPLICATION SLAVE ON *.* To 'rep1'@'192.168.56.103' IDENTIFIED BY '1234test';

3、修改主數據庫服務器的配置文件 my.cnf,開啟 BINLOG,並設置 server-id的值。這兩個參數的修改需要重新啟動數據庫服務才可以生效

my cnf中修改如下:

 

 

 

[mysqld]

log-bin=/home/ mysql/log/mysql-bin. log

server-id= 1

注意:如果mysql目錄下無log目錄,請先創建log目錄

啟動

./bin/mysqld_safe  --defaults-file=/home/mysql/mysql3306/my.cnf &

4、然后得到主庫上當前的二進制日志名和偏移量值。這個操作的目的是為了在從數據庫啟動以后,從這個點開始進行數據的恢復。

執行show master status:

 

 

 

5、修改從數據庫的配置文件 my.cnf,增加 server-id參數。注意 server-id的值必須是唯一的,不能和主數據庫的配置相同,如果有多個從數據庫服務器,每個從數據庫服務器必須有自己唯一的 server-id值。

 

 

 

mycnf中修改如下:

[mysqld]

server-id=2

6、在從庫上,使用 - -skip-slave- start選項啟動從數據庫,這樣不會立即啟動從數據庫服務上的復制進程,方便我們對從數據庫的服務進行進一步的配置:

 

 

 

操作命令:./bin/mysqld_safe  --defaults-file=/home/mysql/mysql3307/my.cnf --skip-slave-start 

7、對從數據庫服務器做相應設置,指定復制使用的用戶,主數據庫服務器的IP、端口

以及開始執行復制的日志文件和位置等,參考代碼如下:

mysql> CHANGE MASTER TO

->MASTER_HOST=master host name

->MASTER_USER=replication_user_name

-> MASTER PASSWORD=replication_password

->MASTER_LOG_FILE='recorded_log_file_name

->MASTER_LOG_POS=recorded _log_position

 

相關參數可以查看主庫:

命令 show master status;

舉例說明如下:

CHANGE MASTER TO MASTER_HOST='192.168.56.103',MASTER_PORT=3306,MASTER_USER='rep1',MASTER_PASSWORD='1234test' ,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=428;

 

 

 

8、在從庫上,啟動 slave線程:

      start slave;

 

 

 

9、這時slave上執行 show processlist命令將顯示類似如下的進程:

 

 

 

執行show slave status;將顯示

 

 

 

11、在master上執行 show processlist命令將顯示類似如下的進程:

 

 

 

12、測試一下:

在主庫上新建數據庫和表,並插入數據,看看從庫中是否會自動創建相關的數據庫和表、插入數據。

新建數據庫和表之前:

 

 

 

 

 

主庫中創建數據庫orders和表order_exp,並插入數據

 

 

 

檢查從庫

 

 

 

半同步復制

MySQL5.5之前, MySQL的復制是異步操作,主庫和從庫的數據之間存在一定的延遲,這樣存在一個隱患:當在主庫上寫人一個事務並提交成功,而從庫尚未得到主庫推送的 Binlog日志時,主庫宕機了,例如主庫可能因磁盤損壞、內存故障等造成主庫上該事務 Binlog丟失,此時從庫就可能損失這個事務,從而造成主從不一致。

而半同步復制,是等待其中一個從庫也接收到Binlog事務並成功寫入Relay Log之后,才返回Commit操作成功給客戶端;如此半同步就保證了事務成功提交后至少有兩份日志記錄,一份在主庫Binlog上,另一份在從庫的Relay Log上,從而進一步保證數據完整性;半同步復制很大程度取決於主從網絡RTT(往返時延),以插件 semisync_master/semisync_slave 形式存在。

安裝比較簡單,在上一小節異步復制的環境上,安裝半同步復制插件即可。

(1)首先,判斷 MySQL服務器是否支持動態增加插件:

mysql> select @@have_dynamic_loading;

 

 

 

2)確認支持動態增加插件后,檢查 MySQL的安裝目錄下是否存在插件:

 

 

 

安裝插件:

在主庫上安裝插件semisync_master.so:

mysql> install plugin rpl_semi_sync_master SONAME 'semisync_master.so'

從庫上則安裝 semisync_slave.so插件:

mysql> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';

安裝完成后,plugin表中能夠看到剛才安裝的插件

mysql> select * from mysql.plugin;

3) 需要分別在主庫和從庫上配置參數打開半同步semi-sync,默認半同步設置是不打開的,主庫上配置全局參數:

     主庫設置參數

mysql> set global rpl_semi_sync_master_enabled=1;

mysql> set global rpl_semi_sync_master_timeout=30000;

從庫上一樣配置全局參數:

mysql> set global rpl_semi_sync_slave_enabled=1;

4)其他步驟同異步復制


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM