解決mysql5.7的主從複製延遲解決方案

在MySQL下主從複製的延遲問題一直是在業界內比較大的困擾,主從的延遲會由於受到網絡磁盤等等相關的因素影響,但其中最主要的影響是就是在master太過繁忙的寫入致使slave沒法有效的從relay_log中讀取到最新的相關記錄,這樣對於數據實時性很高的業務來講slave的數據並非最新的有必定的延時,此時使用主從的讀寫分離就有點顯的雞肋了,不能作到slave上能查到最新的實時數據,大多在slave上都是作一些對實時數據要求並非很高的一些數據查詢。mysql

而到了MySQL的5.6版本開始引入多線程的主從複製的機制,衆所周知MySQL的工做方式是單進程多線程的方式,那麼線程的多寡則會極大的影響到MySQL的效率,而在早期MySQL的主從都是由單線程進行的,使得主從複製除了相關的客觀因素外還受到自身的影響。可是在MySQL 5.6下多線程主從複製並非作的至關完善的,由於在MySQL 5.6中主從複製的多線程是一個線程處理一個主從複製,而在絕大多數的生產環境中大多都是在一個數據庫中作大量的操做的,那麼這樣MySQL的多線程主從複製就又和之前的版本同樣都是單線程的主從複製,沒有太大的實際意義。爲此在MySQL的5.7版本中對多線程主從複製來進一步的改善,在MySQL 5.7中是按照邏輯時鐘(相似CPU的處理機制)來處理多線程,甚至在半同步複製semisync中仍是使用Performance Schema表來監控複製線程,因此在MySQL 5.7中主從複製直接由於MySQL自身致使的延時被極大的下降了,配置也很簡單,以下在salve中配置:web

mysql> show global variables like 'slave_parallel_workers';#默認是0,即單線程
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| slave_parallel_workers | 0     |
+------------------------+-------+
1 row in set (0.01 sec)
mysql> set global slave_parallel_workers = 4;#根據實際狀況決定開啓多少個線程用於主從複製
1 row in set (0.01 sec)
mysql> show global variables like '%slave_parallel_type%';#默認是多線程機制是一個線程處理一個庫
+---------------------+----------+
| Variable_name       | Value    |
+---------------------+----------+
| slave_parallel_type | DATABASE |
+---------------------+----------+
1 row in set (0.01 sec)
mysql> stop slave;#修改多線程機制工做類型須要中止slave
Query OK, 0 rows affected (0.21 sec)
mysql> set global slave_parallel_type='logical_clock';
1 row in set (0.01 sec)
mysql> start slave;    
Query OK, 0 rows affected (0.08 sec)

此時再根據實際狀況決定開啓多少個線程用於主從複製,此時在看下slave上的線程列表:sql

mysql> show full processlist;
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
| Id | User        | Host      | db   | Command | Time | State                                                  | Info                  |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
| 16 | root        | localhost | NULL | Query   |    0 | starting                                               | show full processlist |
| 29 | system user |           | NULL | Connect |    3 | Waiting for master to send event                       | NULL                  |
| 30 | system user |           | NULL | Connect |    3 | Slave has read all relay log; waiting for more updates | NULL                  |
| 31 | system user |           | NULL | Connect |    3 | Waiting for an event from Coordinator                  | NULL                  |
| 32 | system user |           | NULL | Connect |    3 | Waiting for an event from Coordinator                  | NULL                  |
| 33 | system user |           | NULL | Connect |    3 | Waiting for an event from Coordinator                  | NULL                  |
| 34 | system user |           | NULL | Connect |    3 | Waiting for an event from Coordinator                  | NULL                  |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
7 rows in set (0.00 sec)

這樣就成功的開啓MySQL的5.7版本多線程主從複製,在配置好後在slave的datadir目錄下會有根據slave_parallel_workers設置的線程數個數相同的線程文件數據庫

最後再把配置好的變量參數寫入my.cnf,使得下一次重啓生效:網絡

slave_parallel_workers = 4
slave_parallel_type= logical_clock