一、MySQL主從復制原理
MySQL 主從復制是一種將數據從一個 MySQL 數據庫服務器(主服務器,Master)復制到一個或多個 MySQL 數據庫服務器(從服務器,Slave)的技術。以下簡述其原理,主要包含三個核心組件和三個主要步驟:
核心組件
-
二進制日志(Binary Log):位于主服務器上,主服務器會將所有對數據庫進行更改的操作(如 INSERT、UPDATE、DELETE 等)以二進制的形式記錄到二進制日志文件中。這些日志記錄了數據修改的具體內容和執行順序,是主從復制的基礎數據來源。
-
中繼日志(Relay Log):存在于從服務器上,從服務器通過 I/O 線程從主服務器的二進制日志中讀取更新事件,并將這些事件寫入到本地的中繼日志文件中。中繼日志起到了緩存和中轉的作用,確保從服務器能夠按順序處理主服務器的更新。
-
SQL 線程:從服務器上的 SQL 線程負責讀取中繼日志中的事件,并將這些事件在從服務器上重新執行一遍,從而實現主從數據的同步。
工作步驟
1. 主服務器記錄二進制日志
- 當主服務器上發生數據更改操作(如插入、更新、刪除數據)時,MySQL 會將這些更改操作記錄到二進制日志中。二進制日志以事件(Event)的形式存儲,每個事件對應一個具體的數據庫更改操作。例如,當執行一條 INSERT 語句向表中插入數據時,主服務器會將該 INSERT 操作作為一個事件記錄到二進制日志中。
2. 從服務器讀取主服務器二進制日志
- 從服務器上有一個 I/O 線程,它會與主服務器建立連接,并請求主服務器發送其二進制日志。主服務器接收到請求后,會將二進制日志中的更新事件發送給從服務器的 I/O 線程。從服務器的 I/O 線程將接收到的更新事件寫入到本地的中繼日志中。
3. 從服務器執行中繼日志中的事件
- 從服務器上的 SQL 線程會不斷地監控中繼日志,當發現中繼日志中有新的事件時,會按照事件的順序依次讀取并執行這些事件。例如,如果中繼日志中記錄了一個 INSERT 事件,SQL 線程會在從服務器的相應表中執行相同的 INSERT 操作,從而保證從服務器的數據與主服務器的數據一致。
二、MySQL主從復制步驟
注意:firewall-cmd和getenforce處于關閉狀態
1、基于binlog的主從同步
Master配置
[root@openEuler-1 ~]# yum install -y mysql-server#配置文件(主機克隆),注意://三臺主從庫的id必須不同
#查看命令 vim /var/lib/mysql/auto.cnf[root@openEuler-1 ~]# vim /etc/my.cnf.d/mysql-server.cnf
server_id=1
[root@openEuler-1 ~]# systemctl restart mysqld#授權用戶
mysql> create user rep@'192.168.159.%' identified with mysql_native_password by 'MySQL@123';
mysql> grant replication slave on *.* to rep@'192.168.159.%';
mysql> show master status; //查看主服務器狀態,日志用于從服務器同步,position是當前定位
Slave配置
#配置文件
[root@openEuler-2 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[root@openEuler-2 ~]# systemctl restart mysqld[root@openEuler-3 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[root@openEuler-3 ~]# systemctl restart mysqld
[root@openEuler-3 ~]##設置復制參數,兩個Slave一樣的配置
mysql> change master to-> master_host='192.168.159.133',-> master_user='rep',-> master_password='MySQL@123',-> master_log_file='binlog.000004',-> master_log_pos=1565;
Query OK, 0 rows affected, 9 warnings (0.03 sec)#啟動復制進程,兩個Slave都啟動
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)
?檢查從庫狀態
mysql> show slave status \G
?
2、 基于gtid的主從同步配置
準備工作,停止從庫的復制
stop slave
?Master配置
#修改配置文件
[root@Master ~]# vim /etc/my.cnf.d/mysql-server.cnf
#在最后添加
gtid_mode=ON
enforce-gtid-consistency=ON#重啟MySQL服務
[root@Master ~]# systemctl restart mysqld.service#重置二進制日志和GTID
mysql> reset master;#創建用戶授予權限
mysql> create user rep@'192.168.159.%' identified with mysql_native_password by 'MySQL@123';
mysql> grant replication slave on *.* to rep@'192.168.159.%';#重新加載授權表
mysql> flush privileges;
Slave配置
#修改配置文件
[root@Slave1 ~]# vim /etc/my.cnf.d/mysql-server.cnf
gtid_mode=ON
enforce-gtid-consistency=ON#重啟服務
[root@Slave1 ~]# systemctl restart mysqld.service#配置連接到主庫
mysql> change replication source to-> source_host='192.168.159.133',-> source_port=3306,-> source_user='rep',-> source_password='MySQL@123',-> source_auto_position=1;mysql> start replica;
??檢查從庫狀態
mysql> show slave status \G