iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中如何实现半同步semi-sync replication
  • 473
分享到

MySQL中如何实现半同步semi-sync replication

2023-06-29 06:06:32 473人浏览 八月长安
摘要

这篇文章主要介绍MySQL中如何实现半同步semi-sync replication,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、半同步简介MASTER节点在执行完客户端提交的事务后不是立刻返回结果给客

这篇文章主要介绍MySQL中如何实现半同步semi-sync replication,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

一、半同步简介

  • MASTER节点在执行完客户端提交的事务后不是立刻返回结果给客户端,而是等待至少一个SLAVE节点接收并写到relay log中才返回给客户端。

  • 半同步相对于异步复制而言,提高了数据的安全性,同时也造成了一定程度的延迟,这个延迟最少是一个tcp往返的时间。所以,半同步复制最好在低延时的网络中使用。

  • Mysql从5.5开始就支持半同步复制,在5.7.2版本的时候对半同步复制进行了一次改进;原先的半同步策略为 AFTER_COMMIT 改进后的策略为 AFTER_SYNC 两者的差异在于SLAVE节点ACK应答MASTER的时机不同。

二、两种模式介绍

AFTER_COMMIT 模式介绍

MASTER将每个事务写入到二进制日志并刷盘保存,同时将事务发送给SLAVE,然后将事务提交给存储引擎处理并进行提交,然后等待SLAVE返回确认信息,在收到确认信息后,MASTER将结果返回给客户端,然后当前客户端可以继续工作。

AFTER_SYNC 模式介绍

MASTER将每个事务写入到二进制日志并刷盘保存,同时将事务发送给SLAVE,然后等待SLAVE返回确认信息,收到确认信息后,将事务提交给存储引擎处理并进行提交,并将结果返回给客户端,然后当前客户端可以继续工作。

三、两种方式比较

对于第一种 AFTER_COMMIT 方式,当前客户端只有在服务器向存储引擎提交数据并收到SLAVE返回的确认后,才会收到事务的返回结果。在事务提交之后收到SLAVE返回确认信息之前,此刻其他客户端可以看到当前客户端提交的事务信息。
如果SLAVE节点由于网络等原因并未收到MASTER节点传递过来的事务,而MASTER节点此刻crash了。HA进行故障转移,客户端都连到SLAVE节点上,这时先前在MASTER节点看到的事务在SLAVE节点并未看到,就会发生事务丢失的情况。

对于第二种 AFTER_SYNC 方式,当事务被SLAVE确认后MASTER在存储引擎层面进行提交事务后,所有客户端才能看到事务造成的数据更改。因此,所有客户端在MASTER上同一时刻看到是相同的数据。
当MASTER节点crash的情况下,所有在MASTER上提交的事务都被复制到SLAVE(保存到中继日志中)。 MASTER服务器意外crash。此刻HA进行故障转移到SALVE后,客户端看到的数据是无损的,因为SLAVE是最新的。
注意,然而,在这种情况下,MASTER不能直接恢复使用,因为它的二进制日志可能包含未提交的事务,此刻当二进制日志恢复并用于业务需求时,可能会导致与SLAVE的冲突。

四、如何开启半同步

方式1:半同步以插件的形式存在,咱们可以直接在线开启即可(本次采用这次方式)

主节点开启:

[root@Greatsql][(none)]>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';Query OK, 0 rows affected (0.02 sec)

从节点开启:

[root@GreatSQL][(none)]>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';Query OK, 0 rows affected (0.02 sec)

 PS:一般情况下所有节点都同步部署master和slave插件,这样故障切换的时候会比较方便处理

方式2:在my.cnf配置中进行开启

 主从节点都同步配置开启:

plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_sync_slave=semisync_slave.so"rpl_semi_sync_master_enabled=1rpl_semi_sync_slave_enabled=1

五、查看插件开启情况

方式1:查询plugin

主节点查看:

[root@GreatSQL][test]>show plugins;| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |

从节点查看:

[root@GreatSQL][(none)]>show plugins;| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |

方式二:查询infORMation_schema.plugins信息更全面

主节点信息:

(Thu Feb 17 03:03:12 2022)[root@GreatSQL][(none)]>select * from information_schema.plugins where plugin_name like "%semi%"\G;*************************** 1. row ***************************           PLUGIN_NAME: rpl_semi_sync_master        PLUGIN_VERSION: 1.0         PLUGIN_STATUS: ACTIVE           PLUGIN_TYPE: REPLICATION   PLUGIN_TYPE_VERSION: 4.0        PLUGIN_LIBRARY: semisync_master.soPLUGIN_LIBRARY_VERSION: 1.10         PLUGIN_AUTHOR: oracle Corporation    PLUGIN_DESCRIPTION: Semi-synchronous replication master        PLUGIN_LICENSE: GPL           LOAD_OPTION: ON1 row in set (0.00 sec)ERROR:No query specified# 从节点信息(Thu Feb 17 16:05:19 2022)[root@GreatSQL][(none)]>select * from information_schema.plugins where plugin_name like "%semi%"\G;*************************** 1. row ***************************           PLUGIN_NAME: rpl_semi_sync_slave        PLUGIN_VERSION: 1.0         PLUGIN_STATUS: ACTIVE           PLUGIN_TYPE: REPLICATION   PLUGIN_TYPE_VERSION: 4.0        PLUGIN_LIBRARY: semisync_slave.soPLUGIN_LIBRARY_VERSION: 1.10         PLUGIN_AUTHOR: Oracle Corporation    PLUGIN_DESCRIPTION: Semi-synchronous replication slave        PLUGIN_LICENSE: GPL           LOAD_OPTION: ON1 row in set (0.00 sec

六、开启半同步功能

因为上面是在线安装插件的,所以插件安装完成后,服务还要启动一下

主节点启用半同步复制:

[root@GreatSQL][test]>SET GLOBAL rpl_semi_sync_master_enabled = on;Query OK, 0 rows affected (0.00 sec)

 从节点启用半同步复制:

t@GreatSQL][(none)]>SET GLOBAL rpl_semi_sync_slave_enabled = on;Query OK, 0 rows affected (0.00 sec)

以上设置完成后,从节点重启IO线程

(Mon Feb 14 15:19:58 2022)[root@GreatSQL][(none)]>(Mon Feb 14 15:19:58 2022)[root@GreatSQL][(none)]>STOP SLAVE IO_THREAD;Query OK, 0 rows affected, 1 warning (0.01 sec)(Mon Feb 14 15:21:41 2022)[root@GreatSQL][(none)]>START SLAVE IO_THREAD;Query OK, 0 rows affected, 1 warning (0.01 sec)

七、查看半同步是否运行

 主节点:

[root@GreatSQL][test]>show status like 'Rpl_semi_sync_master_status';+-----------------------------+-------+| Variable_name               | Value |+-----------------------------+-------+| Rpl_semi_sync_master_status | ON    |+-----------------------------+-------+1 row in set (0.00 sec)

 从节点:

[root@GreatSQL][(none)]>show status like 'Rpl_semi_sync_slave_status';+----------------------------+-------+| Variable_name              | Value |+----------------------------+-------+| Rpl_semi_sync_slave_status | ON    |+----------------------------+-------+1 row in set (0.01 sec)

查看主节点error.log,可以看出来从节点已经启用半同步复制了

# 关键信息 Start semi-sync binlog_dump to slave (server_id: 3306)2022-02-14T02:16:35.411061-05:00 13 [Note] [MY-010014] [Repl] While initializing dump thread for slave with UUID <652ade08-8b1c-11ec-9f62-00155dcff90a>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(12).2022-02-14T02:16:35.411236-05:00 13 [Note] [MY-010462] [Repl] Start binlog_dump to master_thread_id(13) slave_server(3306), pos(, 4)2022-02-14T02:16:35.411263-05:00 13 [Note] [MY-011170] [Repl] Start asynchronous binlog_dump to slave (server_id: 3306), pos(, 4).2022-02-14T02:16:35.411419-05:00 12 [Note] [MY-011171] [Repl] Stop asynchronous binlog_dump to slave (server_id: 3306).2022-02-14T02:19:33.913084-05:00 9 [Note] [MY-011130] [Repl] Semi-sync replication initialized for transactions.2022-02-14T02:19:33.913133-05:00 9 [Note] [MY-011142] [Repl] Semi-sync replication enabled on the master.2022-02-14T02:19:33.913638-05:00 0 [Note] [MY-011166] [Repl] Starting ack receiver thread.2022-02-14T02:21:46.899725-05:00 14 [Note] [MY-010014] [Repl] While initializing dump thread for slave with UUID <652ade08-8b1c-11ec-9f62-00155dcff90a>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(13).2022-02-14T02:21:46.899894-05:00 14 [Note] [MY-010462] [Repl] Start binlog_dump to master_thread_id(14) slave_server(3306), pos(, 4)2022-02-14T02:21:46.899953-05:00 14 [Note] [MY-011170] [Repl] Start semi-sync binlog_dump to slave (server_id: 3306), pos(, 4).

以上,mysql半同步复制搭建完毕!

八、半同步参数信息

主节点参数信息:

[root@GreatSQL][test]>show variables like '%Rpl%';+-------------------------------------------+------------+| Variable_name                             | Value      |+-------------------------------------------+------------+| rpl_read_size                             | 8192       || rpl_semi_sync_master_enabled              | ON         || 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_stop_slave_timeout                    | 31536000   |+-------------------------------------------+------------+8 rows in set (0.00 sec)

部分参数简单说明:

MySQL中如何实现半同步semi-sync replication

 从节点参数信息:

[root@GreatSQL][test]>show variables like '%Rpl%';+---------------------------------+----------+| Variable_name                   | Value    |+---------------------------------+----------+| rpl_read_size                   | 8192     || rpl_semi_sync_slave_enabled     | ON       || rpl_semi_sync_slave_trace_level | 32       || rpl_stop_slave_timeout          | 31536000 |+---------------------------------+----------+4 rows in set (0.00 sec)

部分参数简单说明:

MySQL中如何实现半同步semi-sync replication

九、半同步状态信息

主节点查看:

[root@GreatSQL][test]> show status like '%Rpl_semi%';+--------------------------------------------+-------+| 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中如何实现半同步semi-sync replication

MySQL中如何实现半同步semi-sync replication

从节点转态信息:

show global status like '%semi%';+----------------------------+-------+| Variable_name              | Value |+----------------------------+-------+| Rpl_semi_sync_slave_status | ON    |+----------------------------+-------+1 row in set (0.00 sec)

参数简单说明:

MySQL中如何实现半同步semi-sync replication

十、测试一下半同步的同步情况

  • 半同步是否会降级为异步复制?是会的。

  • 当半同步复制发生超时时(由rpl_semi_sync_master_timeout参数控制,单位是毫秒,默认为10000,即10s),会暂时关闭半同步复制,转而使用异步复制。

  • 当MASTER DUMP 线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为半同步复制。

1.从节点暂时先关掉IO线程

[root@GreatSQL][(none)]>STOP SLAVE IO_THREAD;Query OK, 0 rows affected, 1 warning (0.02 sec)

2.主节点写入几条测试数据

[root@GreatSQL][test]>insert into ptype values(4,'4','4'),(5,'5','5'),(6,'6','6');Query OK, 3 rows affected (0.02 sec)

3.等待10s后查看复制状态,半同步已经关掉了

[root@GreatSQL][test]>show status like 'Rpl_semi_sync_slave_status';+----------------------------+-------+| Variable_name              | Value |+----------------------------+-------+| Rpl_semi_sync_slave_status | OFF   |+----------------------------+-------+1 row in set (0.00 sec)

4.从节点开启IO线程

[root@GreatSQL][(none)]>START SLAVE IO_THREAD;Query OK, 0 rows affected, 1 warning (0.02 sec)

5.再次查看复制状态,半同步复制自动开启了

t@GreatSQL][test]>show status like 'Rpl_semi_sync_slave_status';+----------------------------+-------+| Variable_name              | Value |+----------------------------+-------+| Rpl_semi_sync_slave_status | ON    |+----------------------------+-------+1 row in set (0.00 sec)

以上是“MySQL中如何实现半同步semi-sync replication”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中如何实现半同步semi-sync replication

本文链接: https://www.lsjlt.com/news/323100.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中如何实现半同步semi-sync replication
    这篇文章主要介绍MySQL中如何实现半同步semi-sync replication,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、半同步简介MASTER节点在执行完客户端提交的事务后不是立刻返回结果给客...
    99+
    2023-06-29
  • MySQL主从复制之半同步semi-sync replication
    目录一、半同步简介二、两种模式介绍三、两种方式比较四、如何开启半同步五、查看插件开启情况六、开启半同步功能七、查看半同步是否运行八、半同步参数信息九、半同步状态信息十、测试一下半同步...
    99+
    2022-11-13
  • MySQL同步数据Replication如何实现
    今天小编给大家分享一下MySQL同步数据Replication如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。MySQ...
    99+
    2023-07-05
  • Mysql中如何实现半同步复制
    本篇文章为大家展示了Mysql中如何实现半同步复制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、环境准备:centos系统服务器2台、一台用户做Mysql主服务...
    99+
    2022-10-18
  • MySQL中怎么实现半同步复制
    MySQL中怎么实现半同步复制,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。半同步复制:什么是半同步复制我们知道在默认情况下,...
    99+
    2022-10-18
  • 怎么实现MySQL中的半同步复制
    这篇文章给大家介绍怎么实现MySQL中的半同步复制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 关于MySQL的复制架构,大体有下面三种方式,异步,全同步复制,半同步复制。三种复制...
    99+
    2022-10-19
  • MySQL中怎么实现主从复制和半同步复制
    这篇文章将为大家详细讲解有关MySQL中怎么实现主从复制和半同步复制,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、复制的介绍MySQL支持单向、异步复制...
    99+
    2022-10-18
  • MySQL中基于GTID半同步如何搭建主从
    下文给大家带来有关MySQL中基于GTID半同步如何搭建主从内容,相信大家一定看过类似的文章。我们给大家带来的有何不同呢?一起来看看正文部分吧,相信看完MySQL中基于GTID半同步如何搭建主从你一定会有所...
    99+
    2022-10-18
  • MySQL中如何进行基于GTID半同步搭建主从
    MySQL中如何进行基于GTID半同步搭建主从,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 背景   * GTID:...
    99+
    2022-10-18
  • MySQL是如何实现主备同步
    主备同步,也叫主从复制,是MySQL提供的一种高可用的解决方案,保证主备数据一致性的解决方案。 在生产环境中,会有很多不可控因素,例如数据库服务挂了。为了保证应用的高可用,数据库也必须要是高可用的。 因此在生产环境中...
    99+
    2022-05-26
    MySQL 主备同步 MySQL 主备同步实现
  • 如何实现MySQL数据库同步
    这篇文章主要介绍了如何实现MySQL数据库同步,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MySQL 的数据同步,在 MySQL 官方网站...
    99+
    2022-10-19
  • canal如何实现mysql的数据同步
    这篇文章将为大家详细讲解有关canal如何实现mysql的数据同步,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。canal是什么?canal [kə'næl],译...
    99+
    2022-10-18
  • 如何在java中实现同步
    如何在java中实现同步?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3....
    99+
    2023-06-14
  • 不同云服务器如何实现mysql数据库同步
    下文给大家带来关于不同云服务器如何实现mysql数据库同步,感兴趣的话就一起来看看这篇文章吧,相信看完不同云服务器如何实现mysql数据库同步对大家多少有点帮助吧。目标:A云服务器上自建的数据库同步到B云服...
    99+
    2022-10-18
  • 详解Mysql如何实现数据同步到Elasticsearch
    目录一、同步原理二、logstash-input-jdbc三、go-mysql-elasticsearch四、elasticsearch-jdbc五、logstash-input-j...
    99+
    2022-11-12
  • MySQL如何搭建主从同步实现操作
    小编给大家分享一下MySQL如何搭建主从同步实现操作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、MySQL 8.0 主从同步主从同步的流程(原理):mast...
    99+
    2023-06-29
  • java中如何实现线程同步
    方法一:使用synchronized关键字 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。注: synchronized关键字也可以修饰静态方法,此...
    99+
    2019-08-08
    java教程 java 实现 线程同步
  • ktl工具如何实现mysql向mysql同步数据方法
    小编给大家分享一下ktl工具如何实现mysql向mysql同步数据方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用ktl工...
    99+
    2022-10-18
  • 如何在 PHP 中实现实时 Unix 同步?
    在开发 Web 应用程序时,我们经常需要将不同的系统之间同步数据,以便在多个系统之间保持数据的一致性。其中,Unix 同步是一种常用的同步方法。这种同步方法可以将不同系统之间的数据进行实时同步,从而保证数据的准确性和一致性。在 PHP 中...
    99+
    2023-07-07
    实时 unix 同步
  • 如何在 Spring 中实现同步操作?
    Spring 是一个非常流行的开源框架,它提供了许多功能来帮助开发人员构建优秀的应用程序。其中一个非常重要的功能是同步操作。在本文中,我们将探讨如何在 Spring 中实现同步操作。 一、Spring 中的同步操作 在 Spring 中,同...
    99+
    2023-09-22
    面试 同步 spring
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作