搞定分库后数据冗余和数据一致

概述

当单个数据库数据量达到一定程度后,我们可以采用多个从库解决读请求的系统瓶颈。 而写请求的系统瓶颈往往需要通过分库解决。

问题

以用户订单场景为例,用户会有查询订单需求,所以订单的分库需要基于userID做切分。

商家对订单统计纬度也同样有需求,所以单一的基于userID做切分的场景不满足这个场景了。

于是我们需要采用反范式设计来满足两种场景的需求。 采用两份数据冗余,即一份数据基于UserId,一份数据基于PoiId。

数据冗余实现

既然我们有了方案,需求指定具体的技术方案了。

做数据冗余常见有三种方案:

  • 应用层同步双写。
  • 应用层异步双写。
  • 基于底层中间件数据同步。

应用层异步双写

这是最简单的实现方式,在用户下单后,基于分库规则一份请求按userId划分入库,一份请求按poiId划分入库,数据落库才进行下一步请求,数据一致性强。

但是整个请求耗时的时间是两个入库时间的总和,如果在业务高峰期,往往造成时延升高问题,不适用于对时延敏感的系统。

应用层异步双写

将两个同步入库修改为异步入库,采用MQ异步消息投递方式实现,这样可以解决两次写入库带来的时间损耗,但是会引入MQ中间件,系统复杂度有一定的提升。

既然存在了异步队列,两个库之间存在数据不一致时间窗口,不适用于对数据一致性敏感对系统。

基于底层中间件数据同步

引入数据同步中间件,屏蔽了业务层实现数据同步,数据冗余的细节,而是交由底层同步中间件实现,使得开发人员专注于业务开发。

与第二种方案相比,中间件方式基于mysql的binlog实现,所以数据一致窗口更短,可靠性更高。

数据一致性

当然以上三种方式的后两种方式都是异步方式,在分布式场景下都会存在数据一致性问题,强一致性很难,一般业务系统都采用最终一致性。

为保证数据一致性可以采用:异步检测,异步修复。

异步检测

采用离线工具,或定时任务,定时对离线数据源进行扫描,如发现数据不一致进行补偿修复。

数据源扫描粒度视对一致性要求的强度而定。但是大量的数据扫描,耗时较长,效率较低。

为降低全量数据扫描的效率问题,可以设计增量数据扫描方式,设置更适合系统负载的扫描时间窗口,提高扫描检测效率。

如果想更实时扫描,可引入同步扫描方式,引入MQ推送消息,在订阅者接收到消息时,触发数据扫描,扫描时间窗口期内数据,同时进行修正。

原文发布于微信公众号 - 服务端技术杂谈(develop_king)

原文发表时间:2018-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏cnblogs

vue、rollup、sass、requirejs组成的vueManager

近段时间本人一直在思考如何基于vue搭建一个中后端管理系统的通用基础前端解决方案。思考的主要问题点如下: 如何使各个子业务模块的按需加载 css预处理方案的选择...

27660
来自专栏架构师之路

进程内缓存,究竟怎么玩?

除了常见的redis/memcache等进程外缓存服务,缓存还有一种常见的玩法,进程内缓存。

17430
来自专栏编程

在linux下安装w3af和使用

技术交流,请勿用于违法途径,后果自负 一、环境: sudoapt-get install git Python 2.7,大部分的linux都默认安装 sudoa...

39290
来自专栏小车博客

[OneIndex 2.0] 大版本更新,代码已放出。onedrive文件分享。

1.3K30
来自专栏Python爬虫与数据挖掘

安装完Python之后,如何设置Python环境变量

人生苦短,我用Python。最近有许多加群的萌新在咨询Python安装的事宜,Python安装问题不大,可以戳这篇文章:。本以为安装Python之后就可...

18820
来自专栏快乐八哥

Angular中ngCookies模块介绍

1.Cookie介绍 Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。内存Cookie由浏览器维护,保存在内...

27580
来自专栏林欣哲

图解Git合并--Merge和Rebase

项目初始情况 ? Merge fast-forward ? 快速合并,直接把指针指向前去,无冲突要解决。 非 fast-forward ? 保留历史记录,解决冲...

35270
来自专栏zaking's

走近webpack(0)--正文之前的故事

  在前端工作的过程中,只要你接触过vue,angular,react,gulp就一定知道webpack或者听说过或者使用过webpack,但是或许你对webp...

29640
来自专栏SpringBoot 核心技术

ubuntu下MySQL数据库自动备份并发送到指定邮箱

13120
来自专栏吴裕超

大型vue单页面项目优化总结

这是之前在公司oa项目优化时罗列的优化点,基本都已经完成,当时花了点心思整理的,保存在这里,方便以后其他项目用到查漏补缺。 1、打包文件中的app.js文件放入...

1K40

扫码关注云+社区

领取腾讯云代金券