文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-29 06:14

关注

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

一、半同步简介

二、两种模式介绍

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

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

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”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯