MySQL主從可以實現MySQL的讀寫分離,簡言之,master上進行寫操作,同步數據庫,slave上進行讀操作,可以極大的提升性能,降低服務器負載。術語:主從複製——master slave replication(M-S模式)。
用途
- 備份
- 讀寫分離
- 高可用和故障切換(需要做HA)
- MySQL升級測試
原理
實際上,它的原理思路很簡單。MySQL 中有一種日誌叫做 bin 日誌(二進制日誌),這個日誌會記錄下所有修改了數據庫的SQL語句。主從複製的原理其實就是"從"服務器向"主"服務器請求這個日誌文件,"主"服務器會把這個 bin 日誌複製到"從"服務器上執行一遍,這樣"從"服務器上的數據就和"主"服務器上的數據相同了。
流程圖:
圖解:
- 主服務器必須啓用二進制日誌(log-bin),記錄任何修改了數據庫數據的事件;
- 從服務器開啓一個線程(I/O Thread)把自己扮演成 MySQL 的客戶端,通過 MySQL 協議,請求主服務器的二進制日誌文件中的事件;
- 主服務器啓動一個線程(Dump Thread),檢查自己二進制日誌中的事件,跟對方請求的位置對比,如果不帶請求位置參數,則主服務器就會從第一個日誌文件中的第一個事件一個一個發送給從服務器;
- 從服務器接收到主服務器發送過來的數據把它放置到中繼日誌(relay log)文件中。並記錄該次請求到主服務器的具體哪一個二進制日誌文件內部的哪一個位置(主服務器中的二進制文件會有多個,其名結尾以6位數遞增);
- 從服務器啓動另外一個線程(SQL Thread ),把 relay log 中的事件讀取出來,並在本地再執行一次。
配置過程
主服務器(Master)
- 啓用二進制日誌 log-bin;
- 設置一個全局唯一的 server_id;
- 提前準備好一個有複製權限(replication slave,replication client)的用戶。
從服務器(Slave)
- 啓動中繼日誌 relay-log;
- 設置一個全局唯一的 server_id;
- 使用主服務器提供的有複製權限的用戶連接至 Master;
- 啓動複製線程。
配置演示
測試環境
主服務器:192.168.1.101
從服務器:192.168.1.102
mysql版本:mysql-5.6
系統:主 Centos7,從 Windows10
主服務器配置
1.配置 /etc/my.cnf
[mysqld]
server-id = 1 #必須唯一
log-bin = mysql-bin # 開啓mysql binlog功能
expire_logs_days = 10 #日誌的緩存時間
max_binlog_size = 200M #日誌的最大大小
binlog-do-db=qp_game_database # 指定需要複製的數據庫名爲
binlog-ignore-db=mysql #忽略同步的數據庫
2.重啓數據庫
3.創建用於同步的用戶賬號
#創建用戶
mysql> CREATE USER 'rootCopy'@'192.168.1.102' IDENTIFIED BY 'rootCopy';
Query OK, 0 rows affected (0.00 sec)
#分配權限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'rootCopy'@'192.168.1.102';
Query OK, 0 rows affected (0.00 sec)
#刷新權限
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
4.查看master狀態
mysql> show master status;
+------------------+----------+------------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+------------------+------------------+-------------------+
| mysql-bin.000002 | 120 | qp_game_database | mysql | |
+------------------+----------+------------------+------------------+-------------------+
1 row in set (0.00 sec)
從服務器配置
1.配置 C:\Program Files\MySQL\MySQL Server 5.7/my-default.ini
[mysqld]
server-id=2 #必須唯一
# 開啓mysql binlog功能
log-bin=mysql-bin
expire_logs_days = 10 #日誌的緩存時間
max_binlog_size = 200M #日誌的最大大小
replicate_do_db = qp_game_database #同步的數據庫名稱
replicate_ignore_db = mysql #忽略同步的數據庫
2.重啓數據庫
3.用主服務器提供的複製用戶連接主服務器
change master to master_host='192.168.1.101',master_user='rootCopy',master_password='rootCopy', master_log_file='mysql-bin.000002',master_log_pos=120;
4.啓動複製線程(關閉複製線程stop slave)
start slave;
5.查看slave狀態:
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.101
Master_User: rootCopy
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 2866
Relay_Log_File: mysqld-relay-bin.000022
Relay_Log_Pos: 616
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: Replicate_Ignore_DB:
當Slave_IO_Running和Slave_SQL_Running都爲YES的時候就表示主從同步設置成功了。接下來就可以進行一些驗證了,