进入 GitChat 阅读原文
前言
本篇讲义将以“订单中心”为例,介绍“多key”类业务,随着数据量的逐步增大,数据库性能显著降低,数据库水平切分相关的架构实践。
一、什么是“多key”类业务
所谓的“多key”,是指一条元数据中,有多个属性上存在前台在线查询需求。
订单中心业务分析
订单中心是一个非常常见的“多key”业务,主要提供订单的查询与修改的服务,其核心元数据为:
Order(oid, buyer_uid, seller_uid, time, money, detail…);其中:
-
oid为订单ID,主键
-
buyer_uid为买家uid
-
seller_uid为卖家uid
-
time, money, detail, …等为订单属性
数据库设计上,一般来说在业务初期,单库单表就能够搞定这个需求,典型的架构设计为:
前台业务架构不变,站点访问,服务分层,数据库水平切分。
后台业务需求则抽取独立的web/service/db来支持,解除系统之间的耦合,对于“业务复杂”“并发量低”“无需高可用”“能接受一定延时”的后台业务:
-
可以去掉service层,在运营后台web层通过dao直接访问数据层。
-
可以不需要反向代理,不需要集群冗余。
-
可以通过MQ或者线下异步同步数据,牺牲一些数据的实时性。
-
可以使用更契合大量数据允许接受更高延时的“索引外置”或者“HIVE”的设计方案。
解决了后台业务的访问需求,问题转化为,前台的oid,buyer_uid,seller_uid如何来进行数据库水平切分呢p>
多个维度的查询较为复杂,对于复杂系统设计,可以逐步简化。
四、假设没有seller_uid
订单中心,假设没有上的查询需求,而只有oid和上的查询需求,就蜕化为一个“1对多”的业务场景,对于“1对多”的业务,水平切分应该使用“基因法”。
再次回顾一下,什么是分库基因strong>
通过分库,假设分为16个库,采用%16的方式来进行数据库路由,所谓的模16,其本质是的最后4个bit决定这行数据落在哪个库上,这4个bit,就是分库基因。
也再次回顾一下,什么是基因法分库strong>
在订单数据oid生成时,oid末端加入分库基因,让同一个下的所有订单都含有相同基因,落在同一个分库上。
如上图所示:
-
当有订单生成时,通过buyer_uid分库,oid中融入分库基因,写入DB-buyer库。
-
通过线下异步的方式,通过binlog+canal,将数据冗余到DB-seller库中。
-
buyer库通过分库,seller库通过分库,前者满足oid和的查询需求,后者满足的查询需求。
数据冗余的方法有很多种:
-
服务同步双写。
-
服务异步双写。
-
线下异步双写(上图所示,是线下异步双写)。
不管哪种方案,因为两步操作不能保证原子性,总有出现数据不一致的可能,高吞吐分布式事务是业内尚未解决的难题,此时的架构优化方向,并不是完全保证数据的一致,而是尽早的发现不一致,并修复不一致。
最终一致性,是高吞吐互联 业务一致性的常用实践。保证数据最终一致性的方案有三种:
-
冗余数据全量定时扫描。
-
冗余数据增量日志扫描。
-
冗余数据线上消息实时检测。
这些方案细节在“多对多”业务水平拆分的文章里详细展开分析过,便不再赘述。
六、oid/buyer_uid/seller_uid同时存在
通过上述分析:
-
如果没有,“多key”业务会蜕化为“1对多”业务,此时应该使用“基因法”分库:使用分库,在oid中加入分库基因
-
如果没有oid,“多key”业务会蜕化为“多对多”业务,此时应该使用“数据冗余法”分库:使用和来分别分库,冗余数据,满足不同属性上的查询需求
-
如果oid/buyer_uid/seller_uid同时存在,可以使用上述两种方案的综合方案,来解决“多key”业务的数据库水平切分难题。
七、总结
复杂难题的解决,都是一个化繁为简,逐步击破的过程。
对于像订单中心一样复杂的“多key”类业务,在数据量较大,需要对数据库进行水平切分时,对于后台需求,采用“前台与后台分离”的架构设计方法:
-
前台、后台系统web/service/db分离解耦,避免后台低效查询引发前台查询抖动。
-
采用前台与后台数据冗余的设计方式,分别满足两侧的需求。
-
采用“外置索引”(例如ES搜索系统)或者“大数据处理”(例如HIVE)来满足后台变态的查询需求。
对于前台需求,化繁为简的设计思路,将“多key”类业务,分解为“1对多”类业务和“多对多”类业务分别解决:
-
使用“基因法”,解决“1对多”分库需求:使用分库,在oid中加入分库基因,同时满足oid和上的查询需求
-
使用“数据冗余法”,解决“多对多”分库需求:使用和来分别分库,冗余数据,满足和上的查询需求
-
如果oid/buyer_uid/seller_uid同时存在,可以使用上述两种方案的综合方案,来解决“多key”业务的数据库水平切分难题。
数据冗余会带来一致性问题,高吞吐互联 业务,要想完全保证事务一致性很难,常见的实践是最终一致性。
任何脱离业务的架构设计都是耍流氓,共勉。
水平切分是一个很有意思的话题,感谢坚持半年订阅的小伙伴们,下个月最后一章,为答谢大伙的支持,可免费订阅(gitchat不允许免费,设定为1元),欢迎大家订阅。
也欢迎大家持续关注本次系列话题的最后一场Chat:《后语:除了水平切分,数据库架构设计还经常遇到哪些问题》。
实录
实录:《沈剑:“多KEY”类业务数据库水平切分架构解析》
彩蛋

文章知识点与官方知识档案匹配,可进一步学习相关知识MySQL入门技能树首页概览32811 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!