MySQL复制可能造成数据不一致的地方

标签: mysql 复制 数据 | 发表时间:2021-05-15 07:06 | 作者:wubx
出处:https://juejin.cn/frontend

上周在讲复制故障处理,利用DML在从主上手工造数据,导致主从复制中断,然后处理复制故障,同时给大家安利了:

课程Demo程序:主从故障自动修复:zhishutech/ReplGurd (github.com)  建议fork|star | watch  有完善的地方请pull回来

复制主从数据一致性校验、修复程序:pt-table-checksum/pt-table-sync 使用。

结课QA环节一个学生问到:老师除了误操作写了从节点造成数据不一致性外,还有哪些原因?

看到这个问题,当时我真的是一口鲜血喷在了屏幕上啊?

在4月26日MySQL复制原理及应用中刚讲了复制原理及半同步中可能出现的数据不一致时间点,整整用了一节课,在5月10日课中,被问到这个问题。有点无语了,老师也想说你们是我见过最差的一届了,怎么刚讲过,你们都忘了呢~~~ :) 好吧。当时就利用老师的特权给你们留个作业,回顾:MySQL复制原理及应用场景,试试能不能解答复制主从可能造成主从数据不一致的地方。果真有很给力的同学,不管什么是哪一届都还是有很多优秀的同学,第二天一早就收到一份作业,也分享出来,给各位一个参考:

主从复制可能造成不一致分析(作者A1364-路遥-北京)

MYSQL5.7 之前半同步复制采用的是 AFTER_COMMIT 方式--比 AFTER_SYNC 会有更大概率造成数据不一致

AFTER_COMMIT 是先做 REDO COMMIT 后传 BINLOG,做事务提交,只是不给客户端返回。

AFTER_COMMIT模式下丢失数据实验

版本8.0.23 (版本不重要,原理没变,所有MySQL都一样,本期课程使用的MySQL 8.0.23)

主库参数

+-------------------------------------------+--------------+

| Variable_name | Value |

+-------------------------------------------+--------------+

| rpl_semi_sync_master_enabled | ON |

| rpl_semi_sync_master_timeout | 60000000000 |

| 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_COMMIT |

| rpl_semi_sync_slave_enabled | OFF |

| rpl_semi_sync_slave_trace_level | 32 |

+-------------------------------------------+--------------+

从库参数

+-------------------------------------------+--------------+

| Variable_name | Value |

+-------------------------------------------+--------------+

| rpl_semi_sync_master_enabled | OFF |

| rpl_semi_sync_master_timeout | 60000000000 |

| 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_COMMIT |

| rpl_semi_sync_slave_enabled | ON |

| rpl_semi_sync_slave_trace_level | 32 |

+-------------------------------------------+--------------+

从库上停掉IO_THREAD模拟从库异常

stop replica io_thread;

主库上插入一条数据,此时会HANG住(但是这条数据已经写入了,开启一个会话是可以查到该数据的)

insert into t values(1);

开启新SESSION查询T表

select * from t;

+------+

| id |

+------+

| 1 |

+------+

开启另一个会话杀掉主库MYSQLD进程pkill -9 mysqld

此时从库中是查不到这条数据的。

select * from t;

Empty set (0.00 sec)

如果此时发生主从切换则主从数据发生不一致。这也是after_commit模式复制中幻读现象。 如图:

AFTER_SYNC 是先传 binlog 后做 REDO COMMIT

```

极端有两种情况:

1. 当主库还没来的及把日志传输到从库上;主库上在完成write binlog后crash

2.日志已经传输到从库上,完成了wait slave ack,此时发生crash;应用端此时并没有接收到主库返回OK。

情况1. 主库Crash恢复后,这个事务操作数据可以被commit,这种事务可以称为local commit或是幽灵事务,并没有真正的完成半同步。

情况2. 产生脏数据,是一个业务没得到确认的事务。也可以称为幽灵事务。

在after_sync中,确实不会丢数据了,但有可能会多数据。

那么使用复制如何保证数据的绝对一致性呢?

1. 首先这个需求是假的,不存在的,如果想要绝对的一致目前可以考虑MySQL Group Replication。

2. 再次,如果一定要用复制架构,同时又要绝对的一致性,考虑使用增强半同步结合session_track_gtids功能使用。

3. 复制一定是binlog row格式+gtid,同时在数据库故障时,注意local commit问题,引入数据校验机器。

孔子曰:三人行,必有我师。大胆交流,不耻下问。加油,学到了才是真本事。欢迎交流。

本文使用 文章同步助手 同步

相关 [mysql 复制 数据] 推荐:

MySQL数据库复制概论

- - Float_Luuu的博客
每当我们讨论一项(新的)领域技术的时候,最好的方式通常是首先抛出一些问题,这些问题大致分为三类:诶. 这项技术又是什么玩意(What)?这项技术为什么会存在. 我们已经有那么多解决方案(Method)了,我们问什么要用它(Why). 如果这项技术那么好且我们正好有场景可以用到这项技术,且能使我们的系统得到很乐观的优化,那么我们怎么用呢(How).

MySQL添加Hadoop数据实时复制功能

- - searchdatabase
  MySQL复制操作可以将数据从一个MySQL服务器(主)复制到其他的一个或多个MySQL服务器(从). 试想一下,如果从服务器不再局限为一个MySQL服务器,而是其他任何数据库服务器或平台,并且复制事件要求实时进行,是否可以实现呢?.   MySQL团队最新推出的 MySQL Applier for Hadoop(以下简称Hadoop Applier)旨在解决这一问题.

MySQL复制可能造成数据不一致的地方

- - 掘金 前端
上周在讲复制故障处理,利用DML在从主上手工造数据,导致主从复制中断,然后处理复制故障,同时给大家安利了:. 课程Demo程序:主从故障自动修复:zhishutech/ReplGurd (github.com)  建议fork|star | watch  有完善的地方请pull回来. 复制主从数据一致性校验、修复程序:pt-table-checksum/pt-table-sync 使用.

MySQL 数据库双向同步复制 - mindwind - 博客园

- -
MySQL 复制问题的最后一篇,关于双向同步复制架构设计的一些设计要点与制约. 数据库的双主双写并双向同步场景,主要考虑数据完整性、一致性和避免冲突. 对于同一个库,同一张表,同一个记录中的同一字段的两地变更,会引发数据一致性判断冲突,尽可能通过业务场景设计规避. 双主双写并同步复制可能引发主键冲突,需避免使用数据库自增类主键方案.

mysql主从复制

- - SQL - 编程语言 - ITeye博客
从库的配置,mysql5.5不支持配置文件的配置了,问了数据库的人,用命令行指定. 修改从库的配置 #default-storage-engine = InnoDB #修改 default-storage-engine = blackhole server-id = 11215004 #新增 replicate-do-db = test log-bin = mysql-bin #新增 binlog_format = row.

mysql中各种高可用方案&开源的数据复制方案

- - 数据库 - ITeye博客
mysql中高中高可用方案(http://www.cnblogs.com/lyhabc/p/3838764.html). MMM高可用mysql方案(http://blog.chinaunix.net/uid-20639775-id-3337488.html). MHA 高可用mysql方案(http://os.51cto.com/art/201307/401702_all.htm).

JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)

- - 企业架构 - ITeye博客
MySQL到Redis数据复制方案. 无论MySQL还是Redis,自身都带有数据同步的机制,像比较常用的 MySQL的Master/Slave模式 ,就是由Slave端分析Master的binlog来实现的,这样的数据复制其实还是一个异步过程,只不过当服务器都在同一内网时,异步的延迟几乎可以忽略.

饿了么MySQL异地多活的数据双向复制经验谈

- -
陈永庭,饿了么框架工具部高级架构师,主要负责MySQL异地双向数据复制,支撑饿了么异地多活项目. 曾就职于WebEx、Cisco、腾讯等公司. 今天我主要分享饿了么多活的底层数据实施,会和大家介绍在整个多活的设计和实施过程中我们是怎么处理异地数据同步的,而这个数据同步组件在我们公司内部称之为DRC.

MySQL主从复制配置

- - 天空极速
在实际企业应用环境当中,单台MySQL数据库是不足以满足日后业务需求的. 譬如服务器发生故障,没有备份服务器来提供服务的话,业务就得停止. 使用MySQL主从复制的好处有:. 1、采用主从服务器这种架构,稳定性得以提升. 如果主服务器发生故障,我们可以使用从服务器来提供服务;. 2、在主从服务器上分开处理用户的请求,可以提升数据处理效率;.