并行复制
主库一般有多个进程同时访问,就会有多个进程的操作被记录在二进制日志中,但是SLAVE端如果只有1个SQL线程执行回放操作的话,会很慢,时间延迟大,所以要开启多多线程,并由一个线程负责调度;
在server11(slave)上:
mysql> show processlist;
+----+-------------+---------------+------+---------+------+--------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+---------------+------+---------+------+--------------------------------------------------------+------------------+
| 1 | system user | | NULL | Connect | 1156 | Slave has read all relay log; waiting for more updates | NULL |
| 2 | system user | | NULL | Connect | 9313 | Waiting for master to send event | NULL |
| 8 | root | localhost | test | Query | 0 | starting | show processlist |
| 11 | proxy | server6:37401 | test | Sleep | 3856 | | NULL |
+----+-------------+---------------+------+---------+------+--------------------------------------------------------+------------------+
#此时只能看见一个进程
[root@server11 ~]# vim /etc/my.cnf
#添加:
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
[root@server11 ~]# /etc/init.d/mysqld restart
mysql> show processlist;
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| 1 | system user | | NULL | Connect | 3 | Slave has read all relay log; waiting for more updates | NULL |
| 2 | system user | | NULL | Connect | 5 | Waiting for master to send event | NULL |
| 4 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 5 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 6 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 7 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 8 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 9 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 10 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 11 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 12 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 13 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 14 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 15 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 16 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 19 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 20 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 21 | system user | | NULL | Connect | 5 | Waiting for an event from Coordinator | NULL |
| 22 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
此时有16个线程!
参数解释:
slave-parallel-type=LOGICAL_CLOCK #基于组的并行复制方式,默认基于库的并行复制方式
slave-parallel-workers=16 #指定开启的线程数
主:
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> show variables like '%rpl%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
| rpl_stop_slave_timeout | 31536000 |
+-------------------------------------------+------------+
- slave:
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> show plugins;
mysql> show variables like '%rpl%';
+---------------------------------+----------+
| Variable_name | Value |
+---------------------------------+----------+
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
| rpl_stop_slave_timeout | 31536000 |
+---------------------------------+----------+
- 测试:
slave上:mysql> stop io_thread;
mysql> show slave status\G;
master上:mysql> insert into userdb values ('user7','777');
Query OK, 1 row affected (10.51 sec) #等待了10秒才复制过去
mysql> show status like "Rpl_semi_sync%";
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 0 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 1 |
| Rpl_semi_sync_master_status | OFF |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
+--------------------------------------------+-------+
slave:mysql> start slave io_thread;
master:
mysql> insert into userdb values ('user8','888');
Query OK, 1 row affected (0.23 sec) #很快的复制过去了
mysql> show status like "Rpl_semi_sync%";
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 2 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 1 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 403 |
| Rpl_semi_sync_master_tx_wait_time | 403 |
| Rpl_semi_sync_master_tx_waits | 1 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 1 |
+--------------------------------------------+-------+