数据库读写分离主从间数据同步延时怎么保证数据一致性

数据库读写分离主从间数据同步延时怎么保证数据一致性

gfd

1.缘起:

互联网项目架构中,经常会在项目中配置多个数据源进行数据库的读写分离以此来提高数据库操·

作性能,区间范围内的 规避数据库瓶颈,提升数据库应用性能;不通常数据库都是一主多从 或多

主多从 亦或 mysq HA 中的多主多从 集群;当主从数据库进行数据同步时 是有一定延迟的,尤

其是网络抖动或者 其他原因造成 主从数据库数据不一致问题。那么这种问题如何解决呢?

 

2.数据库读写分离时 数据一致性保证

一切脱离了业务场景的架构设计都是耍流氓。。。

 

首先我们要确认这种主从同步延迟导致的 读写分离数据不一致性问题会不会对业务产生影响,影

响多大,业务能不能容忍,由以上维度可以推导出一下几种场景:

 

2.1 业务能够容忍数据不一致;

有容奶大。。。。

 

2.2 业务要求强一致性,不能容忍这种不一致;

举个栗子:

银行系统,扣费业务。 A用户的账户余额查询 与扣费更新账户余额在一个事物中,

那么在查询从库,更新主库,当刚好并发存款时就有可能会出现账户金额查询结果

不一致问题。业务上是绝对不允许的。

 

如此,怎么破?-- 简单粗暴的处理方案直接读主库,首先分析下 公司的这种业务的

场景 都是这样要求强一致性的吗?还是只有其中某几个? 那么分析后便可有针对

性的 对要求强一致的业务操作进行主库查询主库更新。

 

2.3 业务强一致性,不能容忍不一致,的另外一种实现方案;

首先 分析下 从库读取操作场景。 为什么会不一致? 因为主从同步有延迟,同步频率是

个配置数据库主从同步的属性可配置的,那么我们默认让他1秒钟同步一次。那么这种

延迟导致数据不一致就是发生在这一秒钟之内的未同步而已。

 

承接上述场景 极端一点,假如我在读取从库时距离主从同步发生还差0.0001毫秒,也就

是说在这个0.0001 毫秒之后我就可以在从库中读取到主从一致的数据了。解决主从同步

导致数据不一致的切入点就在这里。

 

借助redis 这个缓冲中间件。我们按照某种规则将新增的更新的(此种操作都会发生在

主库操作上)数据按照 用户ID+业务ID+其他业务维度 做成KEY 将其存储在 redis中并

设置失效时间就是1秒; 从库做查询时按照 上述key 去redis 中查找如果存在 则读取主

库,如果不存在说明数据已经同步到了从库直接查从库即可。

 

此种方案有点投机取巧的意味。但实战过很好用。。。既做到了数据一致性,又最大限

度的做到了主从数据库间的读写分离;

 

3. 总结:

一切脱离了业务场景的架构设计都是耍流氓。。。。。

上述通过对业务场景的分析根据不同的业务要求:

1. 忽略不一致;

2. 强读主库;

3. “选择性的”强读主库;

 

第三中方案就是 让读写分离最大化,最大限度的提高数据库性能,规避DB瓶颈。

你可能感兴趣的:(mysql,java,Spring,架构师之路)