zoukankan      html  css  js  c++  java
  • MySQL半同步主从.md

    MySQL Semisynchronous Replication

    复制架构衍生史

    1.普通的replication,异步同步。 搭建简单,使用非常广泛,从mysql诞生之初,就产生了这种架构,性能非常好,可谓非常成熟。 但是这种架构数据是异步的,所以有丢失数据库的风险。
    2.semi-sync replication,半同步。性能,功能都介于异步和全同步中间。从mysql5.5开始诞生,目的是为了折中上述两种架构的性能以及优缺点。
    3.sync replication,全同步。目前官方5.7基于Group replication的全同步技术处在labs版本,离正式集成已经不远。全同步技术带来了更多的数据一致性保障。相信是未来同步技术一个重要方向,值得期待。
    4.mysql cluster。 基于NDB引擎,搭建也简单,本身也比较稳定,是mysql里面对数据保护最靠谱的架构,也是目前唯一一个数据完全同步的架构,数据零丢失。不过对业务比较挑剔,限制也较多。

    半同步复制

    1.当Slave主机连接到Master时,能够查看其是否处于半同步复制的机制。
    2.当Master上开启半同步复制的功能时,至少应该有一个Slave开启其功能。此时,一个线程在Master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的Slave已收到此事务的所有事件,或等待超时。
    3.当一个事务的事件都已写入其relay-log中且已刷新到磁盘上,Slave才会告知已收到。在 Master 实例上,有一个专门的线程(ack_receiver)接收备库的响应消息,并以通知机制告知主库备库已经接收的日志,可以继续执行。
    4.如果等待超时,也就是Master没被告知已收到,此时Master会自动转换为异步复制的机制。当至少一个半同步的Slave赶上了,Master与其Slave自动转换为半同步复制的机制。
    5.半同步复制的功能要在Master,Slave都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。
    6.半同步特性的出现,就是为了保证在任何时刻主备数据一致的问题。相对于异步复制,半同步复制要求执行的每一个事务,都要求至少有一个备库成功接收后,才返回给用户。

    半同步带来的新问题:
    1.如果异常发生,会降级为普通的复制。 那么从机出现数据不一致的几率会减少,并不是完全消失。
    2.主机dumper线程承担的工作变多了,这样显然会降低整个数据库的性能。
    3.在MySQL 5.5和5.6使用after_commit的模式下, 即如果slave 没有收到事务,也就是还没有写入到relay log 之前,网络出现异常或者不稳定,此时刚好master挂了,系统切换到从机,两边的数据就会出现不一致。 在此情况下,slave会少一个事务的数据。

    随着MySQL 5.7版本的发布,半同步复制技术升级为全新的Loss-less Semi-Synchronous Replication架构,其成熟度、数据一致性与执行效率得到显著的提升。下面做实验是以5.6为基础进行操作,关于5.7带来的新特性请查看此文章

    半同步复制的实现

    注意:半同步模式是作为MySQL5.5的一个插件来实现的,主库和从库使用不同的插件。同时在配置半同步复制之前请先将异步复制给配置好,以下测试是在搭建异步复制之后操作的。
    环境介绍

    角色IP版本系统
    Master 192.168.100.203 mysql-5.6.31 CentOS 6.7
    Slave 192.168.100.202 mysql-5.6.31 CentOS 6.7

    查看MySQL是否支持动态增加插件

    mysql> show global variables like 'have_dynamic_loading';
    +----------------------+-------+
    | Variable_name        | Value |
    +----------------------+-------+
    | have_dynamic_loading | YES   |
    +----------------------+-------+
    1 row in set (0.00 sec)
    

    Master安装插件

    mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
    Query OK, 0 rows affected (0.53 sec)
    
    mysql> select * from mysql.plugin;
    +----------------------+--------------------+
    | name                 | dl                 |
    +----------------------+--------------------+
    | rpl_semi_sync_master | semisync_master.so |
    +----------------------+--------------------+
    1 row in set (0.00 sec)
    

    Slave安装插件

    mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
    Query OK, 0 rows affected (0.51 sec)
    
    mysql> select * from mysql.plugin;
    +---------------------+-------------------+
    | name                | dl                |
    +---------------------+-------------------+
    | rpl_semi_sync_slave | semisync_slave.so |
    +---------------------+-------------------+
    1 row in set (0.00 sec)
    

    主库打开半同步

    mysql> set global rpl_semi_sync_master_enabled=1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> set global rpl_semi_sync_master_timeout=30000;
    Query OK, 0 rows affected (0.00 sec)
    

    从库打开半同步

    mysql> set global rpl_semi_sync_slave_enabled=1;
    Query OK, 0 rows affected (0.00 sec)
    

    由于之前这两台主机是配置了异步复制,所以现在需要重启从库的I/O线程。(如果是全新配置的半同步复制则不需要):

    mysql> stop slave io_thread;start slave io_thread;
    Query OK, 0 rows affected (0.53 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    

    验证

    mysql> show status like '%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             | 0     |
    | Rpl_semi_sync_master_no_times              | 0     |
    | Rpl_semi_sync_master_no_tx                 | 0     |
    | Rpl_semi_sync_master_status                | ON    |
    | 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     |
    +--------------------------------------------+-------+
    14 rows in set (0.00 sec)
    

    测试

    mysql> insert into newdb values('xiaozels');
    Query OK, 1 row affected (0.57 sec)
    
    mysql> select * from hellodb.newdb;
    +----------+
    | Name     |
    +----------+
    | bols     |
    | longls   |
    | cangls   |
    | xiaozels |
    +----------+
    4 rows in set (0.00 sec)
    
    mysql> show status like '%semi_sync%';
    +--------------------------------------------+-------+
    | Variable_name                              | Value |
    +--------------------------------------------+-------+
    | Rpl_semi_sync_master_clients               | 1     |
    | Rpl_semi_sync_master_net_avg_wait_time     | 1199  |
    | Rpl_semi_sync_master_net_wait_time         | 1199  |
    | Rpl_semi_sync_master_net_waits             | 1     |
    | Rpl_semi_sync_master_no_times              | 0     |
    | Rpl_semi_sync_master_no_tx                 | 0     |
    | Rpl_semi_sync_master_status                | ON    |
    | Rpl_semi_sync_master_timefunc_failures     | 0     |
    | Rpl_semi_sync_master_tx_avg_wait_time      | 986   |
    | Rpl_semi_sync_master_tx_wait_time          | 986   |
    | 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     |
    +--------------------------------------------+-------+
    14 rows in set (0.00 sec)
    

    此时我们看到Rpl_semi_sync_master_yes_tx 为1,说明测试的insert语句通过半同步复制到从库上去了,从而Rpl_semi_sync_master_yes_tx 加一。下面在从库查看数据是否复制过去:

    mysql> select * from hellodb.newdb;
    +----------+
    | Name     |
    +----------+
    | bols     |
    | longls   |
    | cangls   |
    | xiaozels |
    +----------+
    4 rows in set (0.00 sec)
    

    参数说明

    • rpl_semi_sync_master_enabled是控制Master是否开启半同步,开启或不开启,将其设置为ON或OFF(1or0).
    • rpl_semi_sync_master_timeout是控制Master等待多长时间被告知Slave已收到,也就是所谓的超时时间。
    • rpl_semi_sync_slave_enabled是控制Slave是否开启半同步,开启或不开启,将其设置为ON或OFF(1or0)。
    • Rpl_semi_sync_master_clients:查看有多少个开启半同步复制的插件的Slave
    • Rpl_semi_sync_master_status:查看在Master上半同步复制是否正在运行,其值为ON时,说明Master已启用半同步且已被告知有Slave收到;其值为OFF时,说明Master没启用半同步或是没被告知,由于timeout等原因。
    • Rpl_semi_sync_master_no_tx:查看有多少事务没有用半同步复制的机制进行复制。
    • Rpl_semi_sync_master_yes_tx:查看有多少事务是通过半同步复制机制成功复制。
    • Rpl_semi_sync_slave_status:查看Slave上半同步复制是否正常运行,其值为ON时,说明Slave正通过半同步复制且Slave I/O正在运行;为OFF时,反之。

    ref:
    http://www.actionsky.com/docs/archives/129
    http://www.cnblogs.com/ivictor/p/5735580.html

  • 相关阅读:
    android实现简单计算器
    象牙塔尖
    Jquery 限制文本框输入字数【转】
    jquery 文字向上滚动+CSS伪类before和after的应用
    鼠标移入 移出div div会消失的处理
    ionic 项目分享【转】
    JS+CSS简单实现DIV遮罩层显示隐藏【转藏】
    封装鼠标滚轮事件,兼容方法。。。拿去用吧
    3、bootstrap3.0 栅格偏移 布局中的一个特产
    html input[type=file] css样式美化【转藏】
  • 原文地址:https://www.cnblogs.com/cuchadanfan/p/6523758.html
Copyright © 2011-2022 走看看