Mysql 采用多線程進行復制是從 Mysql 5.6 開始支持的內容,但是 5.6 版本下有缺陷,雖然支持多線程,但是每個數據庫只能一個線程,也就是說如果我們只有一個數據庫,則主從復制時也只有一個線程在工作。相當於還是以前的單線程。 從 Mysql 5.7 開始支持同一數據庫下並行主從復制。不過默認情況下,還是單數據庫單個線程,如果需要使用多線程,需要在從節點進行配置。
Mysql 5.7 對主從復制增加了一種類型,共有兩種類型,如下:
DATABASE
基於庫的並行復制 , 每個數據庫對應一個復制線程LOGICAL_CLOCK
基於組提交的並行復制方式,同一個數據庫下可以有多個線程
查看當前配置
在開始配置之前,我們先看一下當前配置下的主從復制的進程數。
1 |
mysql> show processlist; |
從上面看出只有一個主進程在等待同步。
下面查看復制類型和並行數量配置
1 |
mysql> show variables like 'slave_parallel_type'; |
當前的復制類型是 DATABASE,也就是統一數據庫下只有一個線程進行復制,不能並行復制。
1 |
mysql> show variables like 'slave_parallel_workers'; |
當前並行工作的進程數是 0
配置多線程
1、停止從節點復制
1 |
mysql> stop slave; |
2、設置復制類型為 LOGICAL_CLOCK
1 |
mysql> set global slave_parallel_type='logical_clock'; |
3、設置並行數量為 4
1 |
mysql> set global slave_parallel_workers=4; |
4、啟動從節點復制
1 |
mysql> start slave; |
5、查看一下當前工作的線程數
1 |
mysql> show processlist; |
最后說一下為什么需要多線程復制?因為主從之間的同步會有延時,多線程的目的是為了盡量減少這個延時時間。雖然如何優化主從是一個系統的功能,不同的場景需要不同的解決方案,但是多線程至少從基礎上能減少延遲時間。另外根據數據庫的實際情況,能否真正減少延時,以及配置多少線程,則需要反復的測試得出適合自己的數據。
實例配置:
cat backup-my.cnf # This MySQL options file was generated by innobackupex. # The MySQL server [mysqld] port = 3310 #innodb_checksum_algorithm=innodb #innodb_log_checksum_algorithm=innodb innodb_data_file_path=ibdata1:200M:autoextend innodb_log_files_in_group=2 innodb_log_file_size=1572864000 #innodb_fast_checksum=false #innodb_page_size=16384 #innodb_log_block_size=512 innodb_undo_directory=. innodb_undo_tablespaces=0 server-id = 1234 binlog-format = ROW gtid-mode = ON enforce-gtid-consistency = true relay_log_recovery = 1 sync-binlog = 0 skip_slave_start = 1 slave-parallel-type=LOGICAL_CLOCK slave-parallel-workers=32 master_info_repository=TABLE relay_log_info_repository=TABLE relay_log_recovery=ON #rds_encrypt_data=false #innodb_encrypt_algorithm=aes_128_ecb
mysql> show processlist; +----+-------------+-----------+------+---------+-------+----------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------------+-----------+------+---------+-------+----------------------------------------+------------------+ | 2 | root | localhost | NULL | Query | 0 | starting | show processlist | | 3 | system user | | NULL | Connect | 13 | Queueing master event to the relay log | NULL | | 4 | system user | | NULL | Connect | 0 | System lock | NULL | | 5 | system user | | NULL | Connect | 49775 | Waiting for an event from Coordinator | NULL | | 6 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 7 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 8 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 9 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 10 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 11 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 12 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 13 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 14 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 15 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 16 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 17 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 18 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 19 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 20 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 21 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 22 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 23 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 24 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 25 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 26 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 27 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 28 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 29 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 30 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 31 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 32 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 33 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 34 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 35 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | | 36 | system user | | NULL | Connect | 13 | Waiting for an event from Coordinator | NULL | +----+-------------+-----------+------+---------+-------+----------------------------------------+------------------+ 35 rows in set (0.00 sec) mysql> show global variables like 'slave_parallel_workers'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | slave_parallel_workers | 32 | +------------------------+-------+ 1 row in set (0.00 sec) mysql> show global variables like '%slave_parallel_type%'; +---------------------+---------------+ | Variable_name | Value | +---------------------+---------------+ | slave_parallel_type | LOGICAL_CLOCK | +---------------------+---------------+ 1 row in set (0.00 sec)