zoukankan      html  css  js  c++  java
  • MySQL5.7 半同步复制

    一、概述

    5.5与5.7的半同步复制可能存在差异,从MySQL5.5开始,MySQL以插件的形式支持半同步复制

    异步:默认情况下,MySQL复制是异步的。主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理。此时若是主若是崩溃了,那提交完成的事务可能并没有传到从上,从而导致数据不一致。

    全同步:当主库执行完接受到的事务,会等待所有从机执行此事务的返回值,当收到所有从机的返回值时才会返回给客户端。所以对性能的影响严重。

    半同步:介于以上两者之间,主库在执行完客户端的事务后,会等待至少一个从机接收到并写入relay log中才会返回给客户端。它提高了数据的安全性, 也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

    relay log中继日志:在salve中IO线程会拉去master的二进制到relay log中,然后SQL线程会读取relay-log日志的内容并应用到从服务器。

    两个插件实现半同步功能。主端有一个插件,从端有一个插件。
    半同步复制必须在主和从都有启用,否则使用异步复制。
    只有事件写入中继日志并且刷新到磁盘后,从设备才会确认收到事务的事件。
    如果无任何从服务器确认事务的情况下发生超时,主服务器将恢复异步复制。当至少一个半同步丛机赶上,主机将返回到半同步复制。

    After_commit(5.6缺省值)
    Master将事务写进binlog日志中,传递到slave刷新到relay_log,同时master提交事务。Master等待slave反馈写入了relay log,只有收到sck包后master才会将commit ok结果反馈给客户端

    After_sync(5.7缺省值)
    master将事务写进binlog中,传到slave刷新到磁盘relay log。Master等待slave收到ack包之后,再提交事务并且返回commit ok结果给客户端,这样即使主库宕机了,也可以保证所有主库上的书屋都已经同步到了slave的relay log上去。

    二、半同步复制配置

    1.)安装相关插件

    master: --安装 semisync_master.so插件
    mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';

    slave:  --安装 semisync_slave.so插件
    mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

    查看是否安装插件:
    mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
    +------------------------------+-------------------------+
    | PLUGIN_NAME           | PLUGIN_STATUS |
    +------------------------------+-------------------------+
    | rpl_semi_sync_master | ACTIVE         |
    +------------------------------+------------------------ +

    2.默认情况下它是禁用的。主端和从端都必须启用插件才能启用半同步复制

    开启方式:

    1.)更改变量:
    master:
    SET GLOBAL rpl_semi_sync_master_enabled = {0|1}; #1来启用半同步复制,0来禁用它
    SET GLOBAL rpl_semi_sync_master_timeout = N; #该值N以毫秒为单位给出。默认值是10000(10秒)
    slave:
    SET GLOBAL rpl_semi_sync_slave_enabled = {0|1};

    2.)修改配置文件:
    [mysqld]
    rpl_semi_sync_master_enabled = 1
    ...
    ......
    如果是在运行的的从站上启用半同步复制,则需要重启I/O线程,使从站重新连接主并注册为半同步丛站。
    STOP SLAVE IO_THREAD;
    START SLAVE IO_THREAD;

    3.监控半同步复制
    mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';

    +-------------------------------------------+------------+
    | Variable_name                             | Value      |
    +-------------------------------------------+------------+
    | rpl_semi_sync_master_enabled              | ON         |
    | rpl_semi_sync_master_timeout              | 1000       |
    | 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 |
    +-------------------------------------------+------------+
    6 rows in set (0.00 sec)

    mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

    +--------------------------------------------+-------+
    | Variable_name                              | Value |
    +--------------------------------------------+-------+
    | Rpl_semi_sync_master_clients               | 1     | 有多少个Semi-sync的备库
    | Rpl_semi_sync_master_net_avg_wait_time     | 0     | 事务提交后,等待备库响应的平均时间
    | Rpl_semi_sync_master_net_wait_time         | 0     | 等待网络响应的总次数
    | Rpl_semi_sync_master_net_waits             | 7     | 总的网络等待时间
    | Rpl_semi_sync_master_no_times              | 0     | 一共有几次从Semi-sync跌回普通状态
    | Rpl_semi_sync_master_no_tx                 | 0     | 库未及时响应的事务数,如果这个值很大就有问题
    | Rpl_semi_sync_master_status                | ON    | 主库上Semi-sync是否正常开启
    | Rpl_semi_sync_master_timefunc_failures     | 0     | 时间函数未正常工作的次数
    | Rpl_semi_sync_master_tx_avg_wait_time      | 410   | 开启Semi-sync,事务返回需要等待的平均时间
    | Rpl_semi_sync_master_tx_wait_time          | 2876  | 事务等待备库响应的总时间
    | Rpl_semi_sync_master_tx_waits              | 7     | 事务等待备库响应的总次数
    | Rpl_semi_sync_master_wait_pos_backtraverse | 0     | 改变当前等待最小二进制日志的次数
    | Rpl_semi_sync_master_wait_sessions         | 0     | 当前有几个线程在等备库响应
    | Rpl_semi_sync_master_yes_tx                | 7     | Semi-sync模式下,成功的事务数
    +--------------------------------------------+-------+
    15 rows in set (0.00 sec)
  • 相关阅读:
    leetcode Maximum Product Subarray
    JAVA中的泛型类型不可以直接初始化
    android里getView,inflate,listview问题
    二元查找树转换成一个排序的双向链表
    c语言函数指针
    C++初始化小问题
    ODPS中的TaskContext类里面的write函数
    Eclipse里面新建servlet 是否需要配置web.xml
    检测鼠标是否在标签上
    继承
  • 原文地址:https://www.cnblogs.com/Confession/p/8108786.html
Copyright © 2011-2022 走看看