1. 程式人生 > >Mysql主從複製-基於日誌點的複製

Mysql主從複製-基於日誌點的複製

前言

mysql的複製能減輕資料庫的讀負載壓力。mysql的複製功能(非同步,可能會導致同一時間點上資料不一致問題)是基於二進位制日誌增量進行的。同時建議在同一個IDC機房中進行復制,以減少網路問題帶來的問題。

mysql的複製方式主要有兩種,SBR(基於SQL語句複製)和RBR(基於行復制),實際生產中一般建議採用基於行的複製方式,該種方式能較好的解決線上主從伺服器複製不一致的問題,主從複製效能也相對基於SBR複製方式效能好。

MySQL複製工作流程大致如下:主伺服器將資料庫變更寫入二進位制日誌—>從伺服器讀取二進位制檔案並寫入到relay_log中—>在從伺服器上重放relay_log中的日誌。

主從複製實現簡圖(圖片來源於網路)

尤其要注意的是,安裝mysql後務必開啟mysql的二進位制日誌,有些mysql版本中預設是關閉二進位制日誌功能的,防止日後已經在執行中的mysql才開啟是需要重啟機器的,比較麻煩。同時無論採用哪種複製拓撲,主從的伺服器mysql版本務必保持一致,避免由版本不一致帶來的問題。

Mysql主從複製-基於日誌點的複製

日誌點的複製是mysql5.6以前常用的主從複製模式,mysql5.6開始推出了基於GTID的複製,文末有基於GTID複製的文章講解。

我這裡還是以一主一從的複製拓撲來搭建mysql基於日誌點的複製功能(Master:10.200.121.167  Slave:10.200.121.29)。

1、在主DB伺服器上建立複製賬號並授權複製許可權

CREATE USER 'simons'@'10.200.121.%' IDENTIFIED by '123456';

GRANT replication SLAVE ON *.* TO 'simons'@'10.200.121.%';

2、配置Master主資料庫伺服器中的mysql配置檔案 :vim /etc/my.cnf,新增

log_bin=mysql-bin
server_id=100        #動態引數,但在叢集中是唯一的

log_bin是二進位制日誌的檔名,預設路徑在 ${mysql安裝路徑}/data下,以mysql-bin.00000x的形式存在

3、配置Slave從資料庫伺服器中的mysql配置檔案:vim /etc/my.cnf,新增

log_bin=mysql-bin
server_id=102
relay_log=/var/lib/mysql-relay-bin     
log_slave_updates=1 
read_only=1  

relay_log是中繼日誌的存放目錄;log_slave_updates為1表示開啟鏈式複製,比如A->B->C;read_only=1表示從伺服器mysql只讀模式,建議開啟

4、初始化Slave從伺服器資料,將Master伺服器上的mysql資料初始化到Slave中的mysql機器上

mysqldump --single-transaction --master-data=2 --all-databases -uroot -p > all.sql

我這裡使用mysqldump工具,匯出Master上的mysql資料,接下來發送到slave機器上

scp all.sql [email protected]:/

然後在Slave從服務上執行匯入all.sql(初始化)

[[email protected] /]# mysql -u root -p < all.sql

5、Slave機器上切換master並啟動複製鏈路

CHANGE MASTER TO MASTER_HOST = '10.200.121.167',       #Master伺服器ip                 
                 MASTER_USER = 'simons',               #步驟一建立的使用者       
                 MASTER_PASSWORD = '123456',           #步驟一建立的密碼
                 MASTER_LOG_FILE = 'mysql-bin.000001', #主庫上的二進位制檔名稱
                 MASTER_LOG_POS = 154;                 #日誌偏移量 

MASTER_LOG_FILE 和 MASTER_LOG_POS在剛才的all.sql中查詢

all.sql部分資料截圖

如果正常的話,mysql主從複製就可以了。不正常的話,就根據具體的錯誤資訊調整

注意:

1、執行change master to ……命令時候可能會報錯:ERROR 1776 (HY000): Parameters MASTER_LOG_FILE, MASTER_LOG_POS, RELAY_LOG_FILE and RELAY_LOG_POS cannot be set when MASTER_AUTO_POSITION is active.

這個時候需要執行:change master to master_auto_position=0;命令即可。我這裡也報了這個錯,是因為之前這兩臺機器是通過GITD的複製的,現在調整為基於日誌點複製;

接著在Slave從伺服器上啟動

#啟動複製鏈路
mysql> start slave;

#檢視slave狀態
mysql> show slave status;

注意:

上述步驟執行start slave命令時候可能會報錯:Slave SQL for channel '': Slave failed to initialize relay log info structure from the repository, Error_code: 1872,我的也報了這個錯,因為我Slave從伺服器上的配置檔案my.cnf中繼日誌relay_log=/var/lib/mysql-relay-bin,這裡沒有執行許可權導致的,於是執行了 

[[email protected] /]# chmod 777 /var/lib/mysql-relay-bin

mysql> reset slave;

mysql> start slave;

檢驗主從複製功能:如上便實現了基於日誌點的複製功能,在Master上執行新的SQL,資料均會同步到了Slave機器上,校驗結果就不貼圖了。

 

基於日誌點複製的優點

1、是比較早的複製方式,bug相對較少;

2、對SQL查詢沒有什麼限制;

3、故障處理時比較容易;

基於日誌點複製的缺點

故障轉移時獲取主伺服器的節點資訊比較難,比如日誌偏移量。Mysql官方也考慮到這個問題,在mysql5.6以後推出了基於GTID的複製來實現Mysql的複製。

引申文章:

Mysql主從複製-基於GTID複製(https://blog.csdn.net/fanrenxiang/article/details/70197004)

Mysql二進位制日誌詳解(https://blog.csdn.net/fanrenxiang/article/details/70193636)