MySQL半同步复制如何配置

MySQL半同步复制如何配置

前言:

MySQL默认的主从复制采用的是异步模式,主库提交事务不需要确认是否已经传送到从库端,在主库发生宕机主备切换时,可能导致主库已经提交的事务在从库丢失的情况。

在MySQL 5.7通过插件支持了半同步复制模式,半同步模式下,主库事务至少要确保一个从库接收到日志才能完成提交,因此,可以保证在主库发生宕机时,已经提交的事务已经传送到从库,确保数据的不丢失。

半同步:

半同步复制相比于异步复制的性能影响,主要是数据完整性的权衡,增加了发送提交到从库并确认接收的 TCP/IP 往返时间,所以,半同步复制需要有高传输的网络以及主从两地距离相近,如果网络传输缓慢或者主从两地距离跨度太远,可能会导致主库的性能下降以及半同步复制超时。

半同步复制的主库和从库会进行以下操作:

当连接到主库时,复制进制会检查主库是否开启了半同步复制;

如果主库和从库都开启了半同步复制,线程在执行事务提交时,需要等待至少一个半同步从库确认接收到事务或者直到等待超时;

从库只要在事务已经完成写入relay log并flushed磁盘(不需要执行完成这个事务),就可以向主库发送确认事务已经接收完成;

如果没有一个从库在规定的时间内发送确认信息给主库,则主库半同步复制会出现超时,并且降级为异步复制,当至少一个半同步从库能够发送确认信息给主库时,主库会自动升级为半同步模式;

半同步复制需要在主库和从库同时开启,如果存在主库没有开启半同步模式或者主库开启半同步模式但没有一个从库开启半同步模式,则主从复制依然是采用异步模式;

当主库事务提交由于等待从库确认而被堵塞,提交事务的会话将不会返回,直到堵塞结束,才返回会话,主库事务的提交,需要等待至少一个从库确认接受。

rpl_semi_sync_master_wait_for_slave_count 参数可以用于控制在主库需要从库确认的数量,默认为1。

堵塞也会发生在非事务表的rollback,因为非事务表是没有回滚的,所以对于非事务表的rollback依然要写入日志同步到从库。

rpl_semi_sync_master_wait_point 参数用于半同步模式下控制主库事务提交等待从库确认事务接受的时间点,有两种方式:

after_sync(默认):主库写入事务到binlog以及同步从库并且sync binlog to disk,主库同步后等待从库接受到事务的确认,在等到从库的确认之后,主库提交事务到存储引擎并且返回客户端。

after_commit:主库写入事务到binlog以及同步从库,sync binlog,并且提交事务到存储引擎,在提交之后主库等待从库接受到事务的确认,在接受到确认之后,源端返回提交完成到客户端。

两种同步时间点主要存在以下的不同

在after_sync下,全部客户端同一时间看到已经提交的事务,因为是在确认从库已经接收到事务之后再提交存储引擎的,所以全部客户端是同一时间看到已经提交事务的数据;此外,在发生故障切换时,主库全部已经提交的事务已经同步到从库的relay log,从库的数据是无损的。

client–>MySQLSQL Parse–>Storage Involve–>write binary log–>wait ACK–>storagecommit–>client(OK)

在after_commit下,提交事务的客户端需要等待确认从库已经接收到事务才能返回,但由于提交到存储引擎是在确认从库之前完成,所以,其他客户端将比提交事务的客户端更早的看到提交事务的数据,在发生故障切换时,在对于已经提交存储引擎但还没有确认从库已经提交的事务,其他客户端可能会出现与他们在源上看到的数据相关的数据丢失。

client–>MySQLSQL Parse–>Storage Involve–>write binary log–>storagecommit–>wait ACK–>client(OK)

综上所述,建议使用默认的after_sync。

半同步安装步骤:

环境信息:

MySQL版本:5.7.32

架构:一主(192.168.1.110:3306)二从(192.168.1.111:3306,192.168.1.111:3307)

binlog:on

binlog_row_image:full

binlog_format:row

gtid:on

准备条件:

半同步复制是建立在异步复制的基础上,所以要提前配置好主从异步复制(此处步骤省略)。

半同步复制不支持多源复制(多个channel),半同步只能使用default channel。

配置管理使用命令 INSTALLPLUGIN, SET GLOBAL, STOP SLAVE, START SLAVE 以及超级权限 SUPER privilege。

安装插件需要MySQLserver支持动态加载,需要确认have_dynamic_loading 为YES

show global variables like'%have_dynamic_loading%';

确认插件路径配置正确,默认是在install_home/lib/plugin。

show global variables like '%plugin_dir%';

确认插件路径plugin_dir下存在半同步复制插件semisync_master 和 semisync_slave,文件名后缀因平台而异(例如,.so 用于 Unix 和类 Unix 系统,.dll 用于 Windows)。

配置半同步:

主从两个都安装,防止主从切换。

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

注:如果安装出现以下失败,则需要先安装libimf。

mysql> INSTALLPLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';ERROR 1126(HY000): Can't open shared library'/usr/local/mysql/lib/plugin/semisync_master.so'(errno: 22libimf.so: cannot open shared object file:No such fileor directory)

查看组件是否加载。

show plugins;+----------------------------+----------+--------------------+--------------------+---------+| Name                       | Status   | Type               | Library            | License |+----------------------------+----------+--------------------+--------------------+---------+| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL               | GPL     || sha256_password            | ACTIVE   | AUTHENTICATION     | NULL               | GPL     || CSV                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || MEMORY                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || InnoDB                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || INNODB_TRX                 | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_LOCKS               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_LOCK_WAITS          | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_CMP                 | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_CMP_RESET           | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_CMPMEM              | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_CMPMEM_RESET        | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_CMP_PER_INDEX       | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_CMP_PER_INDEX_RESET | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_BUFFER_PAGE         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_BUFFER_PAGE_LRU     | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_BUFFER_POOL_STATS   | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_TEMP_TABLE_INFO     | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_METRICS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_FT_DEFAULT_STOPWORD | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_FT_DELETED          | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_FT_BEING_DELETED    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_FT_CONFIG           | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_FT_INDEX_CACHE      | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_FT_INDEX_TABLE      | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_TABLES          | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_TABLESTATS      | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_INDEXES         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_COLUMNS         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_FIELDS          | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_FOREIGN         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_FOREIGN_COLS    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_TABLESPACES     | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_DATAFILES       | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_VIRTUAL         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || MyISAM                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || MRG_MYISAM                 | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || PERFORMANCE_SCHEMA         | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || ARCHIVE                    | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || BLACKHOLE                  | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || FEDERATED                  | DISABLED | STORAGE ENGINE     | NULL               | GPL     || partition                  | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || ngram                      | ACTIVE   | FTPARSER           | NULL               | GPL     || rpl_semi_sync_master       | ACTIVE   | REPLICATION        | semisync_master.so | GPL     || rpl_semi_sync_slave        | ACTIVE   | REPLICATION        | semisync_slave.so  | GPL     |+----------------------------+----------+--------------------+--------------------+---------+SELECT PLUGIN_NAME, PLUGIN_STATUS    ->        FROM INFORMATION_SCHEMA.PLUGINS    ->        WHERE PLUGIN_NAME LIKE '%semi%';+----------------------+---------------+| PLUGIN_NAME          | PLUGIN_STATUS |+----------------------+---------------+| rpl_semi_sync_master | ACTIVE        || rpl_semi_sync_slave  | ACTIVE        |+----------------------+---------------+

安装插件之后,可以查看半同步相关的参数。

show global variables like 'rpl_semi%';+-------------------------------------------+------------+| Variable_name                             | Value      |+-------------------------------------------+------------+| rpl_semi_sync_master_enabled              | OFF        || rpl_semi_sync_master_timeout              | 10000      || 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 || rpl_semi_sync_slave_enabled               | OFF        || rpl_semi_sync_slave_trace_level           | 32         |+-------------------------------------------+------------+

参数详解:

rpl_semi_sync_master_enabled:主库是否开启半同步。

rpl_semi_sync_master_wait_point:同步时间点after_commit,after_sync。

rpl_semi_sync_master_wait_for_slave_count:主库事务提交后需要从库的确认数量。

rpl_semi_sync_master_timeout:主库等待从库的确认超时时间(ms),默认10000ms,等待超过则半同步降级为异步模式。

rpl_semi_sync_master_wait_no_slave:

为OFF时,只要主库发现(Rpl_semi_sync_master_clients)小于(rpl_semi_sync_master_wait_for_slave_count),则半同步立即转为异步模式;

为ON时,在无事务提交的空闲时间里,即使主库发现(Rpl_semi_sync_master_clients)小于(rpl_semi_sync_master_wait_for_slave_count),也不会做任何调整;

只要保证在事务超时之前,主库收到大于等于(rpl_semi_sync_master_wait_for_slave_count)值的ACK应答数量,主库就一直保持在半同步模式,如果在事务提交阶段(主库等待ACK)超时,半同步才会转为异步模式;

无论(rpl_semi_sync_master_wait_no_slave)为ON还是OFF,当slave上线到(rpl_semi_sync_master_wait_for_slave_count)值时,master都会自动由异步模式转为半同步模式。

主库开启半同步功能

SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_master_timeout=10000;

从库开启半同步功能

SET GLOBAL rpl_semi_sync_slave_enabled = 1;

从库对于正在进行的异步复制,需要重启sql_io_thread 线程,才能生效半同步复制

STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;

主库添加参数到/etc/my.cnf文件

[mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10000

从库添加参数到/etc/my.cnf文件

[mysqld] rpl_semi_sync_slave_enabled=1

查看主从是否启用了半同步复制:

主库查询半同步状态Rpl_semi_sync_master_status为on表示主库开启了半同步复制,Rpl_semi_sync_master_clients表示目前有2个半同步的从库。

show global status like 'rpl%';+--------------------------------------------+-------+| Variable_name                              | Value |+--------------------------------------------+-------+| Rpl_semi_sync_master_clients               | 2     || 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     || Rpl_semi_sync_slave_status                 | OFF   |+--------------------------------------------+-------+

从库查询半同步状态Rpl_semi_sync_slave_status 为on表示从库开启了半同步复制。

show global status like 'rpl%';+--------------------------------------------+-------+| Variable_name                              | Value |+--------------------------------------------+-------+| Rpl_semi_sync_master_clients               | 0     || 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                | OFF   || 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     || Rpl_semi_sync_slave_status                 | ON    |+--------------------------------------------+-------+

半同步状态检查:

show global status like 'rpl%';+--------------------------------------------+---------+| Variable_name                              | Value   |+--------------------------------------------+---------+| Rpl_semi_sync_master_clients               | 2       || Rpl_semi_sync_master_net_avg_wait_time     | 0       || Rpl_semi_sync_master_net_wait_time         | 0       || Rpl_semi_sync_master_net_waits             | 12463   || Rpl_semi_sync_master_no_times              | 1       || Rpl_semi_sync_master_no_tx                 | 2739    || Rpl_semi_sync_master_status                | ON      || Rpl_semi_sync_master_timefunc_failures     | 0       || Rpl_semi_sync_master_tx_avg_wait_time      | 1030    || Rpl_semi_sync_master_tx_wait_time          | 5075616 || Rpl_semi_sync_master_tx_waits              | 4926    || Rpl_semi_sync_master_wait_pos_backtraverse | 0       || Rpl_semi_sync_master_wait_sessions         | 0       || Rpl_semi_sync_master_yes_tx                | 5595    || Rpl_semi_sync_slave_status                 | OFF     |+--------------------------------------------+---------+

Rpl_semi_sync_master_net_avg_wait_time:变量已经废弃,总是等于0。

Rpl_semi_sync_master_net_wait_time:变量已经废弃,总是等于0。

Rpl_semi_sync_master_net_waits:主库等待从库的总次数。

Rpl_semi_sync_master_no_times:主库关闭半同步的总次数,可以用来分析半同步降级为异步的频率次数。

Rpl_semi_sync_master_no_tx:表示半同步事务提交没有接受到从库确认接受的总次数,可以用来分析半同步事务的提交是否存在超时的情况。

Rpl_semi_sync_master_yes_tx: 表示半同步事务提交接受到从库确认接受的总次数。

Rpl_semi_sync_master_timefunc_failures::调用 gettimeofday() 等时间函数失败的次数。

Rpl_semi_sync_master_tx_avg_wait_time:每个事务提交平均等待时间(单位: microseconds ),可以用来分析事务提交性能。

Rpl_semi_sync_master_tx_wait_time:事务总的提交等待时间(单位: microseconds ),可以用来分析事务提交性能。

Rpl_semi_sync_master_tx_waits:事务总的提交等待次数,可以用来分析事务提交性能。

Rpl_semi_sync_master_wait_pos_backtraverse:主库event binary位置低于之前等待event的总次数,当事务开始等待回复的顺序与其二进制日志事件的写入顺序不同时,就会发生这种情况。

Rpl_semi_sync_master_wait_sessions:当前会话等待从库确认接受的个数,可以用来确认分析会话是否存在由于等待从库确认而堵塞的情况。

到此,相信大家对“MySQL半同步复制如何配置”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

文章标题:MySQL半同步复制如何配置,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/26149

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云
上一篇 2022年9月16日 下午10:34
下一篇 2022年9月16日

相关推荐

  • 2024年9款优质CRM系统全方位解析

    文章介绍的工具有:纷享销客、Zoho CRM、八百客、红圈通、简道云、简信CRM、Salesforce、HubSpot CRM、Apptivo。 在选择合适的CRM系统时,许多企业面临着功能繁多、选择困难的痛点。对于中小企业来说,找到一个既能提高客户关系管理效率,又能适应业务扩展的CRM系统尤为重要…

    2024年7月25日
    1600
  • 数据库权限关系图表是什么

    数据库权限关系图表是一种以图表形式展示数据库权限分配和管理的工具。它可以有效地帮助我们理解和管理数据库中的各种权限关系。数据库权限关系图表主要包含以下几个部分:数据对象、用户(或用户组)、权限类型、权限级别、权限状态等。其中,数据对象是权限关系图表中的核心元素,它代表了数据库中的各种数据资源,如表、…

    2024年7月22日
    200
  • 诚信数据库是什么意思

    诚信数据库是一种收集、存储和管理个人或组织诚信信息的系统。它是一种用于评估和管理个人或组织行为的工具,通常由政府、商业组织或者非营利组织进行运营。诚信数据库的主要功能包括:1、评估个人或组织的诚信状况;2、提供决策支持;3、预防和控制风险;4、促进社会信用体系建设。 在这四大功能中,评估个人或组织的…

    2024年7月22日
    400
  • 数据库期末关系代数是什么

    关系代数是一种对关系进行操作的代数系统,是关系模型的数学基础,主要用于从关系数据库中检索数据。其操作包括选择、投影、并集、差集、笛卡尔积、连接、除法等。其中,选择操作是对关系中的元组进行筛选,只保留满足某一条件的元组;投影操作则是从关系中选择出一部分属性构造一个新的关系。 一、选择操作 选择操作是关…

    2024年7月22日
    700
  • mysql建立数据库用什么命令

    在MySQL中,我们使用"CREATE DATABASE"命令来创建数据库。这是一个非常简单且基础的命令,其语法为:CREATE DATABASE 数据库名。在这个命令中,“CREATE DATABASE”是固定的,而“数据库名”则是你要创建的数据库的名称,可以自己设定。例如,如…

    2024年7月22日
    500
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部