修改主从复制模式
主从同步有三种复制模式分别是:异步复制、全同步复制、半同步复制。复制模式关系到主从的数据一致性。
异步复制:(Asynchronous replication)主库执行完一次事务后,立即将结果返回给客户端,并不关心从库是否已经接受并处理。
全同步复制:(Fully synchronous replication) 当主库执行完一次事务,而且必须要从库执行了该事务后才将结果返回给客户端。
半同步复制(Semisynchronous replication)介于异步复制和全同步复制之间,当主库执行完一次事务后,等待至少一个从库接收并写入到relay log中财将结果返回给客户端。
综合下来列一张表格进行整理其优点和缺点:
复制模式 | 优点 | 缺点 |
---|---|---|
异步复制(Asynchronous replication)(默认) | 返回给客户端速度极快。 | 可靠性低 |
全同步复制(Fully synchronous replication) | 返回给客户端速度较慢 | 可靠性极高 |
半同步复制(Semisynchronous replication) | 返回给客户端速度快 | 可靠性高 |
综合情况来看,建议使用半同步复制模式,既可以保证我们数据的一致性的情况下,也能够保证其速度。
默认是使用的异步复制模式,接下来就进行修改复制模式。
-
第一步:检查是否允许动态加载模块。
mysql> show virables like "%have_dynamic_loading%"; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | have_dynamic_loading | YES | +----------------------+-------+ 1 row in set (0.00 sec)
YES :则为允许动态加载模块,如果是NO则不允许,需要修改配置文件指定其为YES即可。
-
第二步: 安装该插件并设置启用插件(在数据库以命令行设置为临时启用,写入到数据库配置文件则为永久启用)。
注意需要以root用户进行启用模块,模块共有两个模块,分别是“rpl_semi_sync_master” master模块用于修改主服务器的复制模式,“rpl_semi_sync_slave” 模块用于修改从服务器的复制模式。
如果主从结构是链式复制(主从从结构)、或者互为主从(主主结构)情况下既为主又为从的服务器需要设置master模块和slave模块。
在master上安装插件并启用,然后验证是否开启。
mysql> install rpl_semi_sync_master soname "semisync_master.so"; mysql> set global rpl_semi_sync_master_enabled=1; mysql> show variables like "rpl_semi_sync_master_enabled"; +------------------------------+-------+ | Variable_name | Value | +------------------------------+-------+ | rpl_semi_sync_master_enabled | ON | +------------------------------+-------+ 1 row in set (0.00 sec)
slave 从节点上安装插件并启用。(这里我这边是主主结构所以这边我需要安装启用master和slave。)
mysql> install rpl_semi_sync_slave soname "semisync_slave.so"; mysql> set global rpl_semi_sync_slave_enabled=1; mysql> show variables like "rpl_semi_sync_slave_enabled"; +-----------------------------+-------+ | Variable_name | Value | +-----------------------------+-------+ | rpl_semi_sync_slave_enabled | ON | +-----------------------------+-------+ 1 row in set (0.00 sec)
虽然在命令行中设定了启用但是还是临时的,需要在主配置文件中设置为永久启用,并重新启动mysqld服务。
sed -i '4a plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"' /etc/my.cnf sed -i '5a rpl-semi-sync-master-enabled = 1' /etc/my.cnf sed -i '6a rpl-semi-sync-slave-enabled = 1' /etc/my.cnf systemctl restart mysqld
如果是单独的master则只需要启用master。
sed -i '4a plugin-load="rpl_semi_sync_master=semisync_master.so;' /etc/my.cnf sed -i '5a rpl-semi-sync-master-enabled = 1' /etc/my.cnf
如果是单独的slave则只需要单独启用slave
sed -i '4a plugin-load="rpl_semi_sync_master=semisync_slave.so;' /etc/my.cnf sed -i '5a rpl-semi-sync-slave-enabled = 1' /etc/my.cnf