修改主从复制模式

主从同步有三种复制模式分别是:异步复制、全同步复制、半同步复制。复制模式关系到主从的数据一致性。

异步复制:(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
    
posted @ 2019-10-16 19:03  不愿透露姓名的先生  阅读(312)  评论(0编辑  收藏  举报