与传统的异步复制相比,半同步复制在多个Slave节点中会选取一个节点进行半同步复制。也就是说,当Master提交一个事务的时候,在这个半同步复制的Slave端返回一个同步完成的Ack包之后,服务器才会向用户返回事务提交成功,而其他的节点则是采用传统的异步复制方式进行同步。
半同步是复制是基于异步复制之上进行的,也就是说配置半同步复制之前需要先配置到异步复制。
半同步复制可以保证在主节点发生故障的时候,总有一个节点的数据与主节点一样。这样在进行切换的时候,可以更加快速地把这个Slave节点设置成主节点来使用。
Master节点:Node1
由于上面已经进行了异步复制的配置,下面仅进行半同步复制的操作。
(1)Master安装插件并修改变量:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
插件的文件名字和路径一般在rpm -ql mariadb-server那里查看。
这个插件的库文件是安装好之后就直接有的,只是没有默认安装。
(2)启用选项
mysql> SET GLOBAL VARIABLES rpl_semi_sync_master_enabled=1;
(1)slave安装插件并修改变量:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; mysql> SET GLOBAL VARIABLES rpl_semi_sync_slave_enabled=1;这里需要注意的是,node1作为主节点使用的是master模块。node2,node3作为从节点使用slave模块
(2)查看半同步复制的全局变量
mysql> SHOW GLOBAL VARIABLES LIKE '%semi%'; +------------------------------------+-------+ | Variable_name | Value | +------------------------------------+-------+ | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 10000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_no_slave | ON | +------------------------------------+-------+设置rpl_semi_sync_master_enabled=1的效果
第一行是ON则表示半同步复制已经开启。
(3)查看半同步复制的全局变量
mysql> SHOW GLOBAL STATUS LIKE '%semi%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 1 | | Rpl_semi_sync_master_net_avg_wait_time | 645 | | Rpl_semi_sync_master_net_wait_time | 645 | | Rpl_semi_sync_master_net_waits | 1 | | Rpl_semi_sync_master_no_times | 1 | | Rpl_semi_sync_master_no_tx | 5 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 783 | | Rpl_semi_sync_master_tx_wait_time | 783 | | 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 | +--------------------------------------------+-------+第一行Rpl_semi_sync_master_clients显示1,表示有一台主机是半同步复制的状态。
最后需要说明的是,semi复制的MySQL5.7中性能有明显的改善。
假如真的需要使用半同步复制,建议使用5.7的版本。