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中查詢
如果正常的話,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)