京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

MySQL中半同步模式的实现示例

2024-11-2 22:40| 发布者: 8b79| 查看: 89| 评论: 0

摘要: 目次1 半同步简介: 办理主从数据一致性题目2 实现半同步模式实践操纵2.1 MASTER2.2 SLAVE 12.3 SLAVE 2 2.4 检察client链接状态 2.5 SLAVE 服务器故障模拟2.5.1 停止 SLAVE 的 IO_THREAD 2.5.2 检察S
目次

1 半同步简介: 办理主从数据一致性题目

MySQL 半同步复制是一种机制,旨在办理主从数据的一致性题目。它的主要目标是在主服务器提交变乱之前等候至少一个从服务器确认收到了该变乱的二进制日志变乱。这样可以确保主服务器上的变乱在从服务器上至少有一个副本,从而提高数据可靠性。

在默认情况下,MySQL的复制是异步的,这意味着主服务器及其从服务器是独立的。异步复制可以提供最佳的性能,因为主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,无需等候验证更新数据是否已经复制到从服务器中,就可以自由处置惩罚别的进入的变乱处置惩罚请求。但这也同时带来了很高的风险,假如在主服务器或从服务器端发生故障,会造成主从数据的不一致,甚至在恢复时造成数据丢失。

从MySQL5.5开始引入了一种半同步复制功能,该功能可以确保主服务器和访问链中至少一台从服务器之间的数据一致性和冗余。在这种设置结构中,一台主服务器和其很多从服务器都进行了设置,这样在复制拓扑中,至少有一台从服务器在父主服务器进行变乱处置惩罚前,必须确认更新已经收到并写入了此中继日志 (Relay Log)。当出现超时,源主服务器必须临时切换到异步复制模式重新复制,直到至少有一台设置为半同步复制模式的从服务器及时收到信息。 继5.5半同步复制后,MySQL5.6又对其进行了优化和改进,此中有两个地方较为重要:

1> 在主从切换后,在传统的方式里,须要找到binlog和POS点,然后更改master指向,而在mysql5.6里,你无须再知道binlog和POS点,你只须要知道master的IP、端口,账号密码即可,因为同步复制是自动的,mysql通过内部机制GTID自动找点同步。 ​

2> 多线程复制,从前的版本,同步复制是单线程的,只能一个一个实行,在MySQL5.6里,可以做到多个库之间的多线程复制,但一个库里的表,多线程复制是无效的。

1.用户线程写入完成后master中的dump会把日志推送到slave端

2.slave中的io线程接收后保存到relaylog中继日志

3.保存完成后slave向master端返回ack

4.在未接受到slave的ack时master端时不做提交的,一直处于等候当收到ack后提交到存储引擎

5.在5.6版本中用到的时after_commit模式,after_commit模式时先提交在等候ack返回后输出ok

2 实现半同步模式实践操纵

2.1 MASTER

[code]mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.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 | +----------------------+---------------+ [/code] [code][root@mysql-01 ~]# vim /etc/my.cnf [mysqld] datadir=/data/mysql socket=/data/mysql/mysql.sock symbolic-links=0 log_bin=mysql-bin server_id=10 gtid_mode=ON enforce-gtid-consistency=ON rpl_semi_sync_master_enabled=1 # 增长模块 master 端自启动 [root@mysql-01 ~]# systemctl restart mysqld # 检察模块是否安装成功 mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS -> FROM INFORMATION_SCHEMA.PLUGINS -> WHERE PLUGIN_NAME LIKE '%semi%'; +----------------------+---------------+ | PLUGIN_NAME | PLUGIN_STATUS | +----------------------+---------------+ | rpl_semi_sync_master | ACTIVE | +----------------------+---------------+ mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%'; +-------------------------------------------+------------+ | Variable_name | Value | +-------------------------------------------+------------+ | 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 | +-------------------------------------------+------------+ mysql> SHOW STATUS LIKE 'Rpl_semi_sync%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 0 | -- (1) 表现当前有多少个从服务器客户端正在进行半同步复制。 | Rpl_semi_sync_master_net_avg_wait_time | 0 | -- (2) 表现主服务器在等候从服务器确认时网络平均等候时间(毫秒)。这里的值为0,表现没有平均网络等候时间。 | Rpl_semi_sync_master_net_wait_time | 0 | -- (3) 表现主服务器在网络等候上的总时间(毫秒)。这里的值同样为0,表现没有总的网络等候时间。 | Rpl_semi_sync_master_net_waits | 0 | -- (4) 表现主服务器因网络原因等候的次数。这里的值为0,表现没有因网络原因导致的等候。 | Rpl_semi_sync_master_no_times | 0 | -- (5) 表现主服务器没有等候任何从服务器确认的次数。这里的值为0,表现所有变乱都至少等候了一个从服务器简直认。 | Rpl_semi_sync_master_no_tx | 0 | -- (6) 表现主服务器没有提交任何变乱的次数。这里的值为0,表现所有变乱都进行了半同步复制。 | Rpl_semi_sync_master_status | ON | -- (7) 表现半同步复制当前是否启用。在这里,半同步复制是启用的。 | Rpl_semi_sync_master_timefunc_failures | 0 | -- (8) 表现由于时间函数失败而导致半同步复制失败的次数。这里的值为0,表现没偶然间函数失败。 | Rpl_semi_sync_master_tx_avg_wait_time | 0 | -- (9) 表现主服务器在等候从服务器确认变乱时的平均等候时间(毫秒)。这里的值为0,表现没有平均等候时间。 | Rpl_semi_sync_master_tx_wait_time | 0 | -- (10) 表现主服务器等候从服务器确认变乱的总等候时间(毫秒)。这里的值为0,表现没有总的等候时间。 | Rpl_semi_sync_master_tx_waits | 0 | -- (11) 表现主服务器等候从服务器确认变乱的次数。这里的值为0,表现没有等候时间。 | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | -- (12) 表现主服务器在等候从服务器确认时回溯binlog位置的次数。这里的值为0,表现没有回溯binlog位置。 | Rpl_semi_sync_master_wait_sessions | 0 | -- (13) 表现主服务器等候从服务器确认变乱时涉及的会话数量。这里的值为0,表现没有等候会话。 | Rpl_semi_sync_master_yes_tx | 0 | -- (14) 表现主服务器成功提交变乱并得到从服务器确认的次数。这里的值为0,表现没有变乱成功提交并得到确认。 +--------------------------------------------+-------+ [/code]

2.2 SLAVE 1

[code]mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; [root@mysql-02 ~]# vim /etc/my.cnf [mysqld] datadir=/data/mysql socket=/data/mysql/mysql.sock symbolic-links=0 server_id=20 gtid_mode=ON enforce-gtid-consistency=ON rpl_semi_sync_slave_enabled=1 [root@mysql-02 ~]# systemctl restart mysqld [root@mysql-02 ~]# mysql -uroot -pOpenlab123! mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | rpl_semi_sync_slave_enabled | ON | | rpl_semi_sync_slave_trace_level | 32 | +---------------------------------+-------+ mysql> SHOW STATUS LIKE 'Rpl_semi_sync%'; # 检察模块是否加载 +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | ON | +----------------------------+-------+[/code]

2.3 SLAVE 2 

[code]mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; [root@mysql-02 ~]# vim /etc/my.cnf [mysqld] datadir=/data/mysql socket=/data/mysql/mysql.sock symbolic-links=0 server_id=30 gtid_mode=ON enforce-gtid-consistency=ON rpl_semi_sync_slave_enabled=1 [root@mysql-02 ~]# systemctl restart mysqld [root@mysql-02 ~]# mysql -uroot -pOpenlab123! mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | rpl_semi_sync_slave_enabled | ON | | rpl_semi_sync_slave_trace_level | 32 | +---------------------------------+-------+ mysql> SHOW STATUS LIKE 'Rpl_semi_sync%'; # 检察模块是否加载 +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | ON | +----------------------------+-------+[/code]

2.4 检察client链接状态 

再次回到MASTER

[code][root@mysql-01 ~]# systemctl restart mysqld mysql> SHOW STATUS LIKE 'Rpl_semi_sync%'; +--------------------------------------------+-------+ | 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 | +--------------------------------------------+-------+ [/code]

2.5 SLAVE 服务器故障模拟

2.5.1 停止 SLAVE 的 IO_THREAD 

[code]# SLAVE 1 mysql> STOP SLAVE IO_THREAD; mysql> SHOW SLAVE STATUS\G # SLAVE 2 mysql> STOP SLAVE IO_THREAD; mysql> SHOW SLAVE STATUS\G[/code]

2.5.2 检察SLAVE 的IO线程是否关闭 

2.5.3 检察 MASTER 上 client 的连接状态

[code]mysql> SHOW STATUS LIKE 'Rpl_semi%';[/code]

2.5.4 在MASTER端插入数据

[code]mysql> insert into wawa values(7,'www.shuyan'); Query OK, 1 row affected (10.00 sec) # 会卡住十秒钟然后从同步转为异步,再插入数据 mysql> SELECT * FROM wawa; +----+-----------------+ | id | name | +----+-----------------+ | 1 | wawa | | 2 | shuyan | | 3 | shuyan and wawa | | 4 | shuyan-------- | | 5 | shuyan.com | | 6 | 12333 | | 7 | www.shuyan | +----+-----------------+[/code]

[code]mysql> SHOW STATUS LIKE 'Rpl_semi%'; +--------------------------------------------+-------+ | 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 | 1 | | Rpl_semi_sync_master_no_tx | 1 | # 一笔数据为同步 | Rpl_semi_sync_master_status | OFF | # 自动转为异步模式,等候slave恢复 | 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)[/code]

2.5.5 MASTER 还能写入数据的原因

为什么还能写入呢?是因为他在凌驾超时时间的时候,模式由同步模式转为异步模式

开启从服务器的 IO_THREAD 线程

[code]# SLAVE 1 mysql> start slave io_thread; # SLAVE 2 mysql> start slave io_thread; # 在SLAVE上发现数据已经同步过来了 mysql> select * from shuyan.wawa; +----+-----------------+ | id | name | +----+-----------------+ | 1 | wawa | | 2 | shuyan | | 3 | shuyan and wawa | | 4 | shuyan-------- | | 5 | shuyan.com | | 6 | 12333 | | 7 | www.shuyan | +----+-----------------+[/code]

在从服务器开启半同步复制时,主服务器会在等候从服务器相应之前设置一个超时时间。假如凌驾这个时间还没有收到从服务器的相应,主服务器会自动转换为异步模式。当从服务器恢复连接时,它会自动接收到主服务器在此期间插入的所有数据。

当从服务器IO_THREAD 线程 恢复连接时,从服务器会按照 GTID 的序次接收并应用来自主服务器的变乱。

当从服务器的 I/O 线程恢复连接时,它会查找 gtid_executed 列表中缺失的 GTID,并从相应的二进制日志文件和位置开始复制。这样,从服务器会按照 GTID 的序次接收并应用来自主服务器的变乱,从而包管数据的一致性和完整性

MySQL 半同步复制可以通过 GTID(全局变乱标识符)来比对数据。当从服务器恢复连接时,它会根据 GTID 查找主服务器上尚未应用的变乱,并自动接收到这些变乱。

到此这篇关于MySQL中半同步模式的实现示例的文章就介绍到这了,更多相关MySQL 半同步模式内容请搜索脚本之家从前的文章或继续浏览下面的相关文章渴望大家以后多多支持脚本之家!


来源:https://www.jb51.net/database/327132m7d.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-1 20:58 , Processed in 0.054636 second(s), 18 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

返回顶部