MySQL 主從複製
原理
主從複製是將主數據庫的 DDL 和 DML 操作過的二進制日誌傳到從庫服務器中,然後在從庫上對這些日誌重新執行(重做),從而使得從庫和主庫的數據保持同步。MySQL 支持一台主庫同時向多台從庫進行複製,從庫同時也可以作為其他服務器的主庫,實現鏈狀複製。 MySQL 複製的點主要包含以下三個方面:
- 主庫出現問題,可以切換到從庫提供服務
- 讀寫分離,降低主庫的訪問壓力
- 可以在從庫中執行備份,以避免備份期間影響主庫服務
複製分三步驟:
- Master 服務器的主庫在事務提交時,會把數據變更記錄在二進制日誌 binlog 中
- 從庫讀取主庫的二進制日誌 binlog,寫入從庫的中繼日誌 relay log
- slave 服務器的從庫重做中繼日誌的事件,將改變自己的數據
配置
- 準備兩台服務器(master/slave),皆安裝 MySQL
- 開放指定 3306 端口
- 關閉服務器的放火牆
#生產環境
firewall-cmd --zone=public --add-port=3306/tcp -permanent
firewall-cmd -reload
#測試
systemctl stop firewalld
systemctl disable firewalld
主庫配置
- 修改配置文件 /etc/my.cnf
- 重起 mysql,
systemctl restart mysqld
- 登入 mysql,創建遠程連接的帳號,並授予主從複製權限
#mysql服務ID,保證整個集群環境中的唯一,取值範圍 1 - 2^32-1,默認為1
server-id=1
#是否只讀,1 代表只讀,0 代表讀寫
read-only=0
#忽略的數據,指不需要同步的數據庫
#binlog-ignore-db=mysql
#指定同步的數據庫
#binlog-do-db=db01
#創建dotsu帳戶,並設置密碼,該用戶可在任意主機連接該 MySQL 服務
CREATE USER 'dotsu'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';
#為'dotsu'@'%'用戶分配主從複製權限
GRANT REPLICATION SLAVE ON *.* TO 'dotsu'@'%';
#登入 mysql,輸入命令查看二進制日誌座標
show master status;
從庫配置
- 修改配置文件 /etc/my.cnf
- 重啟 mysql,
systemctl restart mysqld
- 登入 mysql,設置主庫配置
- 開啟同步操作系統
#mysql服務ID,保證整個集群環境中的唯一,取值範圍 1 - 2^32-1,默認為1
server-id=2
#是否只讀,1 代表只讀,0 代表讀寫
read-only=1
#mysql version > 8.0.23
CHANGE REPLICATION SOURCE TO SOURCE_HOST='xxx.xxx.xxx.xxx', SOURCE_USER='xxx', SOURCE_PASSWORD='xxx',SOURCE_LOG_FILE='xxx', SOURCE_LOG_POS=xxx;
#mysql version <= 8.0.23,SOURCE_HOST 主庫IP地址,SOURCE_USER 連接主庫的用戶名稱,SOURCE_PASSWORD 連接主庫的用戶密碼,SOURCE_LOG_FILE binlog 日誌文件名稱,SOURCE_LOG_POS binlog 日誌文件位置
CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx', MASTER_USER='xxx', MASTER_PASSWORD='xxx',MASTER_LOG_FILE='xxx', MASTER_LOG_POS=xxx;
#8.0.22 以後,開啟同步操作
start replica;
#8.0.22 以前,開啟同步操作
start master;
#8.0.22 以後,查看主從同步狀態
start replica status;
#8.0.22 以前,查看主從同步狀態
start master status;