1、MySQL主從復制簡介
MySQL主從復制(也稱A/B復制、Replication),簡單講就是A和B兩台機器做主從后,在A上寫數據,另外一台B也會跟着寫數據,兩者數據實時同步。
MySQL主從是基於binlog的,主上須開啟binlog才能進行主從。
主從過程大致分為三個步驟:
1)主將更改操作記錄到binlog里;
2)從將主的binlog事件(SQL語句)同步到從本機上,並記錄在relaylog里;
3)從根據relaylog里面的SQL語句按順序執行;
主上有一個log dump線程,用來和從的I/O線程傳遞binlog
從上有兩個線程,其中I/O線程,用來同步主的binlog並生成relaylog,另外一個SQL線程用來把relaylog里面的SQL語句落地。
主從配置需要注意的點
(1)主從服務器操作系統版本和位數一致;
(2) Master和Slave數據庫的版本要一致;
(3) Master和Slave數據庫中的數據要一致;
(4) Master開啟二進制日志,Master和Slave的server_id在局域網內必須唯一;
2、准備工作
2.1 系統及軟件准備
操作系統: CentOS7.8
MySQL版本:5.7.30
Master服務器:192.168.10.243
Slave服務器:192.168.10.143
2.2、MySQL服務器操作系統配置
# 關閉主、從服務器防火牆 systemctl stop firewalld && systemctl disable firewalld # 關閉主備服務器SELinux # 關閉SELinux # 查看SELinux狀態 sestatus –v getenforce # 臨時關閉SELinux setenforce 0 # 永久關閉SELinux(需要重啟操作系統) sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 優化文件句柄 # 打開文件的限制 vim /etc/security/limits.conf * soft nofile 65536 * hard nofile 131072 * - nproc unlimited * soft memlock unlimited * hard memlock unlimited # 優化內核參數 修改/etc/sysctl.conf文件 # 增加tcp支持的隊列數 # 減少斷開連接時 ,資源回收 net.ipv4.tcp_max_tw_buckets = 8000 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 10 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.tcp_max_syn_backlog = 1024000
2.3、安裝 MySQL-5.7.30
Master、Slave節點安裝MySQL
# MySQL軟件下載 wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-community-client-5.7.30-1.el7.x86_64.rpm wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-community-common-5.7.30-1.el7.x86_64.rpm wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-community-devel-5.7.30-1.el7.x86_64.rpm wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-community-libs-5.7.30-1.el7.x86_64.rpm wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-community-libs-compat-5.7.30-1.el7.x86_64.rpm wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-community-server-5.7.30-1.el7.x86_64.rpm # 安裝MySQL: yum -y localinstall *.rpm
或者配置yum源,直接使用yum命令安裝MySQL
vim /etc/yum.repo.d/mysql.repo [mysql57-community] name=MySQL 5.7 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ enabled=1 gpgcheck=0 # 保存退出,執行 yum clean all yum makecache # 安裝 mysql-community-server yum -y install mysql-community-server
2.4、啟動MySQL服務,並將服務加入開機啟動
systemctl enable mysqld systemctl start mysqld systemctl status mysqld
2.5、登錄mysql並初始化root密碼
# 登錄mysql 說明:mysql在安裝完成,啟動mysqld服務后,MySQL會自動生成一個隨機的root用戶密碼,可以到日志里面查看。 vim /var/log/mysqld.log # 可以看到類似如下信息: 2020-03-03T06:24:40.573789Z 1 [Note] A temporary password is generated for root@localhost: p5+yU>E*q8hh # 說明:用該臨時密碼登錄mysql后,必須要先修改密碼,如下: [root@aliy-prod-pubser-server001 opt]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 5.7.26 Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. mysql> set password = PASSWORD('6ps?3n2vPcXjhUfz');
# 如果從服務器是克隆的主服務器,則修改 auto.cnf(vi /var/lib/mysql/auto.cnf) 文件中 server-uuid 值
否則主從復制會報 1593 錯誤,修改完記得重啟MySQL
3、MySQL主從復制配置
3.1、master服務器配置
1)用戶添加及授權
在master 服務器授權一個賬戶,擁有slave權限
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.10.143' IDENTIFIED BY 'GrantT^Slave143'; mysql> FLUSH PRIVILEGES;
說明: 192.168.10.143為備庫IP,GrantT^Slave143為賬號repl的密碼,配置時修改成實際環境的信息。
3.2. my.cnf配置修改
修改mysql配置文件,my.ini (windows)或 my.cnf(Linux)找到[mysqld] 標記,下方添加
server-id=1 log-bin=master-bin binlog-format=ROW # 以下兩個為可選選項,如果要保證數據不丟失最好在清理binlog之前把要清理的日志備份,日志文件的大小根據磁盤的性能做適當的調整 expire_logs_days = 7 // binlog過期清理時間 max_binlog_size = 1G // binlog每個日志文件大小 max_connections = 1000 character-set-server = utf8mb4 // 配置字符集 collation-server = utf8mb4_unicode_ci // 配置字符集 // 配置不同步的庫 binlog-ignore-db = mysql binlog-ignore-db = sys binlog-ignore-db = information_schema binlog-ignore-db = performance_schema
3.3 重啟master 的mysql服務
systemctl restart mysqld
4、備庫配置
在另一個mysql上配置從服務器
4.1 備庫my.cnf修改
找到my.ini (windows) 或 my.cnf (linux),找到[mysqld]標記,更改如下配置
[mysqld] max_connections = 1000 log_bin = slave-bin server_id = 2 relay_log = slave-relay-bin log_slave_updates = 1 read_only = 1 #以下兩個為可選選項,如果要保證數據不丟失最好在清理binlog之前把要清理的日志備份,日志文件的大小根據磁盤的性能做適當的調整 expire_logs_days = 7 //binlog過期清理時間 max_binlog_size = 100m //binlog每個日志文件大小 replicate_ignore_db=information_schema replicate_ignore_db=performance_schema replicate_ignore_db=mysql replicate_ignore_db=sys
重啟mysql使配置生效
systemctl restart mysqld
5、開啟復制
5.1、查看主庫binlog信息
登陸主庫執行
mysql> show master status; +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | master-bin.000001 | 154 | | | | +-------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
執行之后可以獲取目前主庫binlog使用的文件及pos點
5.2、在從庫上設置復制信息
根據上一步獲取到的信息(Position, File)配置從庫的復制信息,在從庫上執行如下命令
CHANGE MASTER TO MASTER_HOST='192.168.10.243',MASTER_USER='repl',MASTER_PASSWORD='GrantT^Slave143',MASTER_LOG_FILE='master-bin.000001',MASTER_LOG_POS=154;
注意:執行從庫配置, 每次重啟mysql均需要執行(如果沒有開啟自動啟動主從)
參數解釋:
解釋:
// master的ip地址
mysql> change master to master_host='192.168.10.243',
// master授權的用戶
master_user='repl',
// master的授權用戶密碼
master_password='GrantT^Slave143',
// master的binlog日志名稱,這里使用上述命令搜索出來的為准
master_log_file='edu-mysql-bin.00000x',
// master的日志位置 這里使用上述“1.3”命令搜索出來的為准,不能帶引號,必須是整型,否則會報錯
master_log_pos=xx,
// 重試時間、單位秒,默認重試時間為 60s
master_connect_retry=30;
5.3、在從庫上開啟復制
從庫復制信息配置完成后執行命令開啟復制:
mysql> start slave;
5.4、查看復制狀態
啟動之后如果不報錯即可執行如下命令查看復制的狀態:
show slave status \G;
主要查看下面兩個參數狀態,只要都是yes,表示主從通信正常。
Slave_IO_Running=Yes
Slave_SQL_Running=Yes
如果均為yes則正常,否則需根據last_error信息進行調試
6、主從復制測試
# 創建數據庫
create database mydb;
# 創建表
use mydb;
create table mytab1(id int(10),name varchar(50),depid int(11));
# 插入數據
insert into mytab1 (id, name, depid) values (1,'mcb', 2),(2,'zhangsan',3);
查看主庫數據庫,表,數據
查看從庫數據庫,表,數據
7、主從同步可能遇到的問題
基於局域網的Master/Slave機制在通常情況下已經可以滿足“實時”備份的要求了。如果延遲比較大,可以從以下幾個因素進行排查:
(1) 網絡延遲;
(2) Master負載過高;
(3) Slave負載過高;
如果出現同步失敗,可以根據提示處理錯誤,處理完成后,需要刷新同步配置:
先停止同步
mysql> stop slave;
清理掉之前的配置,防止同步已經同步了的數據
mysql> reset slave all;
然后重新連接主庫,進行同步。