社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

MySQL冗余数据的三种方案 | 架构师之路

架构师之路 • 6 年前 • 721 次点击  

一,为什么要冗余数据

互联网数据量很大的业务场景,往往数据库需要进行水平切分来降低单库数据量。


水平切分会有一个patition key通过patition key的查询能够直接定位到库,但是非patition key上的查询可能就需要扫描多个库了。


此时常见的架构设计方案,是使用数据冗余这种反范式设计来满足分库后不同维度的查询需求


例如:订单业务,对用户和商家都有订单查询需求:

Order(oid, info_detail);

T(buyer_id, seller_id, oid);

如果用buyer_id来分库,seller_id的查询就需要扫描多库。

如果用seller_id来分库,buyer_id的查询就需要扫描多库。


此时可以使用数据冗余来分别满足buyer_id和seller_id上的查询需求:

T1(buyer_id, seller_id, oid)

T2(seller_id, buyer_id, oid)

同一个数据,冗余两份,一份以buyer_id来分库,满足买家的查询需求;一份以seller_id来分库,满足卖家的查询需求。


如何实施数据的冗余,是今天将要讨论的内容。

 

二,服务同步双写


顾名思义,由服务层同步写冗余数据,如上图1-4流程:

  • 业务方调用服务,新增数据

  • 服务先插入T1数据

  • 服务再插入T2数据

  • 服务返回业务方新增数据成功


优点

  • 不复杂,服务层由单次写,变两次写

  • 数据一致性相对较高(因为双写成功才返回)


缺点

  • 请求的处理时间增加(要插入两次,时间加倍)

  • 数据仍可能不一致,例如第二步写入T1完成后服务重启,则数据不会写入T2


如果系统对处理时间比较敏感,引出常用的第二种方案。


三,服务异步双写


数据的双写并不再由服务来完成,服务层异步发出一个消息,通过消息总线发送给一个专门的数据复制服务来写入冗余数据,如上图1-6流程:

  • 业务方调用服务,新增数据

  • 服务先插入T1数据

  • 服务向消息总线发送一个异步消息(发出即可,不用等返回,通常很快就能完成)

  • 服务返回业务方新增数据成功

  • 消息总线将消息投递给数据同步中心

  • 数据同步中心插入T2数据


优点

  • 请求处理时间短(只插入1次)


缺点

  • 系统的复杂性增加了,多引入了一个组件(消息总线)和一个服务(专用的数据复制服务)

  • 因为返回业务线数据插入成功时,数据还不一定插入到T2中,因此数据有一个不一致时间窗口(这个窗口很短,最终是一致的)

  • 在消息总线丢失消息时,冗余表数据会不一致


不管是服务同步双写,还是服务异步双写,服务都需要关注“冗余数据”带来的复杂性。如果想解除“数据冗余”对系统的耦合,引出常用的第三种方案。


四,线下异步双写


为了屏蔽“冗余数据”对服务带来的复杂性数据的双写不再由服务层来完成,而是由线下的一个服务或者任务来完成,如上图1-6流程:

  • 业务方调用服务,新增数据

  • 服务先插入T1数据

  • 服务返回业务方新增数据成功

  • 数据会被写入到数据库的log

  • 线下服务或者任务读取数据库的log

  • 线下服务或者任务插入T2数据


优点

  • 数据双写与业务完全解耦

  • 请求处理时间短(只插入1次)


缺点

  • 返回业务线数据插入成功时,数据还不一定插入到T2中,因此数据有一个不一致时间窗口(这个窗口很短,最终是一致的)

  • 数据的一致性依赖于线下服务或者任务的可靠性


总结

互联网数据量大的业务场景常常:

  • 使用水平切分来降低单库数据量

  • 使用数据冗余的反范式设计来满足不同维度的查询需求

  • 使用服务步双写法能够很容易的实现数据冗余

  • 为了降低时延可以优化为服务异步双写法

  • 为了屏蔽“冗余数据”对服务带来的复杂性可以优化为线下异步双写法



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/0eNg6wxi2P
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2516
 
721 次点击