您现在的位置是:亿华云 > 系统运维
数据库主从不一致,怎么解?
亿华云2025-10-04 01:11:14【系统运维】6人已围观
简介在聊数据库与缓存一致性问题之前,先聊聊数据库主库与从库的一致性问题。问:常见的数据库集群架构如何?答:一主多从,主从同步,读写分离。如上图:一个主库提供写服务 多个从库提供读服务,可以增
在聊数据库与缓存一致性问题之前,怎么解先聊聊数据库主库与从库的数据一致性问题。
问:常见的库主数据库集群架构如何?
答:一主多从,主从同步,怎么解读写分离。数据

如上图:
一个主库提供写服务 多个从库提供读服务,库主可以增加从库提升读性能 主从之间同步数据画外音:任何方案不要忘了本心,怎么解加从库的数据本心,是库主提升读性能。
问:为什么会出现不一致?怎么解
答:主从同步有时延,这个时延期间读从库,数据可能读到不一致的库主数据。

如上图:
服务发起了一个写请求 服务又发起了一个读请求,怎么解此时同步未完成,数据读到一个不一致的库主脏数据 数据库主从同步最后才完成画外音:任何数据冗余,必将引发一致性问题。
问:如何避免这种主从延时导致的不一致?
答:常见的方法有这么几种。
方案一:忽略
任何脱离业务的架构设计都是耍流氓,绝大部分业务,例如:百度搜索,淘宝订单,站群服务器QQ消息,58帖子都允许短时间不一致。
画外音:如果业务能接受,最推崇此法。
如果业务能够接受,别把系统架构搞得太复杂。
方案二:强制读主

如上图:
使用一个高可用主库提供数据库服务 读和写都落到主库上 采用缓存来提升系统读性能这是很常见的微服务架构,可以避免数据库主从一致性问题。
方案三:选择性读主
强制读主过于粗暴,毕竟只有少量写请求,很短时间,可能读取到脏数据。
有没有可能实现,只有这一段时间,可能读到从库脏数据的读请求读主,平时读从呢?
可以利用一个缓存记录必须读主的数据。

如上图,当写请求发生时:
写主库 将哪个库,哪个表,哪个主键三个信息拼装一个key设置到cache里,这条记录的超时时间,设置为“主从同步时延”画外音:key的格式为“db:table:PK”,假设主从延时为1s,这个key的服务器托管cache超时时间也为1s。

如上图,当读请求发生时:
这是要读哪个库,哪个表,哪个主键的数据呢,也将这三个信息拼装一个key,到cache里去查询,如果,
cache里有这个key,说明1s内刚发生过写请求,数据库主从同步可能还没有完成,此时就应该去主库查询 cache里没有这个key,说明最近没有发生过写请求,此时就可以去从库查询以此,保证读到的一定不是不一致的脏数据。
总结
数据库主库和从库不一致,常见有这么几种优化方案:
业务可以接受,系统不优化 强制读主,高可用主库,用缓存提高读性能 在cache里记录哪些记录发生过写请求,来路由读主还是读从文字很短,不能解决所有问题,但希望能给大家一些启示。
亿华云很赞哦!(14712)
相关文章
- 众所周知,com域名拥有最大的流通市场和流通历史。最好选择com域名,特别是在购买域名时处理域名。其次可以是cn域名、net域名、org域名等主流域名,现在比较流行的王域名和顶级域名,都是值得注册和投资的。
- Nacos在企业中如何使用集群环境?
- Vue.js设计与实现之组件的实现原理
- 边缘渲染是如何提高前端性能的?
- 因为域名解析需要同步到DNS根服务器,而DNS根服务器会不定时刷,只有DNS根服务器刷新后域名才能正常访问,新增解析一般会在10分钟左右生效,最长不会超过24小时,修改解析时间会稍微延长。
- 数据库的“行式存储”和“列式存储”
- 大规模升级来临,谈谈Oracle 12cR2使用经验
- 如何搭建MySQL数据库系统
- 比较短的域名方便用户记忆和传播,它带来的好处往往会超过其他类型的域名,如果你非要域名短而且还要包含关键词,那么往往会事与愿违,现在这种域名基本上是可遇而不可求的。
- MySQL数据库查询缓存总结