什么是主從復(fù)制?
主從復(fù)制是指將主數(shù)據(jù)庫的DDL和DML操作通過二進制日志傳到從數(shù)據(jù)庫上,然后在從數(shù)據(jù)庫上對這些日志進行重新執(zhí)行,從而使從數(shù)據(jù)庫和主數(shù)據(jù)庫的數(shù)據(jù)保持一致。
主從復(fù)制的原理
- MySql主庫在事務(wù)提交時會把數(shù)據(jù)變更作為事件記錄在二進制日志Binlog中;
- 主庫推送二進制日志文件Binlog中的事件到從庫的中繼日志RelayLog中,之后從庫根據(jù)中繼日志重做數(shù)據(jù)變更操作,通過邏輯復(fù)制來達到主庫和從庫的數(shù)據(jù)一致性;
- MySql通過三個線程來完成主從庫間的數(shù)據(jù)復(fù)制,其中Binlog Dump線程跑在主庫上,I/O線程和SQL線程跑在從庫上;
- 當(dāng)在從庫上啟動復(fù)制時,首先創(chuàng)建I/O線程連接主庫,主庫隨后創(chuàng)建BinlogDump線程讀取數(shù)據(jù)庫事件并發(fā)送給I/O線程,I/O線程獲取到事件數(shù)據(jù)后更新到從庫的中繼日志Relay Log中去,之后從庫上的SQL線程讀取中繼日志Relay Log中更新的數(shù)據(jù)庫事件并應(yīng)用,如下圖所示

image.png
主實例搭建
- 修改配置文件/etc/my.cnf,配置信息如下:
[mysqld]
## 設(shè)置server_id,同一局域網(wǎng)中需要唯一
server_id=101
## 指定不需要同步的數(shù)據(jù)庫名稱
binlog-ignore-db=mysql
## 開啟二進制日志功能
log-bin=mysql-bin
## 設(shè)置二進制日志使用內(nèi)存大?。ㄊ聞?wù))
binlog_cache_size=1M
## 設(shè)置使用的二進制日志格式(mixed,statement,row)
binlog_format=mixed
## 二進制日志過期清理時間。默認值為0,表示不自動清理。
expire_logs_days=7
## 跳過主從復(fù)制中遇到的所有錯誤或指定類型的錯誤,避免slave端復(fù)制中斷。
## 如:1062錯誤是指一些主鍵重復(fù),1032錯誤是因為主從數(shù)據(jù)庫數(shù)據(jù)不一致
slave_skip_errors=1062
- 重啟mysql-master
systemctl restart mysqld.service
- 創(chuàng)建數(shù)據(jù)同步用戶
mysql -uroot -p
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY 'slave123';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
從實例搭建
- 修改配置文件/etc/my.cnf,配置信息如下:
[mysqld]
## 設(shè)置server_id,同一局域網(wǎng)中需要唯一
server_id=102
## 指定不需要同步的數(shù)據(jù)庫名稱
binlog-ignore-db=mysql
## 開啟二進制日志功能
log-bin=mysql-bin
## 設(shè)置二進制日志使用內(nèi)存大?。ㄊ聞?wù))
binlog_cache_size=1M
## 設(shè)置使用的二進制日志格式(mixed,statement,row)
binlog_format=mixed
## 二進制日志過期清理時間。默認值為0,表示不自動清理。
expire_logs_days=7
## 跳過主從復(fù)制中遇到的所有錯誤或指定類型的錯誤,避免slave端復(fù)制中斷。
## 如:1062錯誤是指一些主鍵重復(fù),1032錯誤是因為主從數(shù)據(jù)庫數(shù)據(jù)不一致
slave_skip_errors=1062
- 重啟mysql-slave
systemctl restart mysqld.service
- 在從數(shù)據(jù)庫中配置主從復(fù)制
change master to master_host='192.168.0.177', master_user='slave', master_password='slave123', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=154, master_connect_retry=30;
-
查看從數(shù)據(jù)庫狀態(tài)發(fā)現(xiàn)已經(jīng)同步
image.png
主從復(fù)制測試
主從復(fù)制的測試方法有很多,可以在主實例中創(chuàng)建一個數(shù)據(jù)庫,看看從實例中是否有該數(shù)據(jù)庫,如果有,表示主從復(fù)制已經(jīng)搭建成功。
在主實例中創(chuàng)建一個數(shù)據(jù)庫test_db;
在從實例中查看數(shù)據(jù)庫,發(fā)現(xiàn)也有一個test_db數(shù)據(jù)庫,可以判斷主從復(fù)制已經(jīng)搭建成功。
主從復(fù)制重置
主實例
mysql> reset master;
mysql> show master status;
從實例
mysql> change master to master_host='192.168.0.177', master_user='slave', master_password='slave123', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=154, master_connect_retry=30;
start slave;
show slave status \G
