mysql 分库分表_大众点评订单系统分库分表实践

原大众点评的订单单表早就已经突破两百G,由于查询维度较多,即使加了两个从库,优化索引,仍然存在很多查询不理想的情况。去年大量抢购活动的开展,使数据库达到瓶颈,应用只能通过限速、异步队列等对其进行保护;业务需求层出不穷,原有的订单模型很难满足业务需求,但是基于原订单表的DDL又非常吃力,无法达到业务要求。随着这些问题越来越突出,订单数据库的切分就愈发急迫了。

这次切分,我们的目标是未来十年内不需要担心订单容量的问题。

先对订单库进行垂直切分,将原有的订单库分为基础订单库、订单流程库等,本文就不展开讲了。

1f271b4196952e27dda14513de14d71c.png

垂直切分缓解了原来单集群的压力,但是在抢购时依然捉襟见肘。原有的订单模型已经无法满足业务需求,于是我们设计了一套新的统一订单模型,为同时满足C端用户、B端商户、客服、运营等的需求,我们分别通过用户ID和商户ID进行切分,并通过PUMA(我们内部开发的MySQL binlog实时解析服务)同步到一个运营库。

5a8c1b2d6492f956c36ca94f49114ba3.png

切分策略

1. 查询切分

将ID和库的Mapping关系记录在一个单独的库中。

3ac11d4ff89d655314b9eab131a943f7.png

优点:ID和库的Mapping算法可以随意更改。

缺点:引入额外的单点。

2. 范围切分

比如按照时间区间或ID区间来切分。

a4e4abff8a1872825ddafdf2d8e05f10.png

优点:单表大小可控,天然水平扩展。

缺点:无法解决集中写入瓶颈的问题。

3. Hash切分

一般采用Mod来切分,下面着重讲一下Mod的策略。

301b617c5fc8f2c9a37a755a6df9eafd.png

数据水平切分后我们希望是一劳永逸或者是易于水平扩展的,所以推荐采用mod 2^n这种一致性Hash。

以统一订单库为例,我们分库分表的方案是32*32的,即通过UserId后四位mod 32分到32个库中,同时再将UserId后四位Div 32 Mod 32将每个库分为32个表,共计分为1024张表。线上部署情况为8个集群(主从),每个集群4个库。

为什么说这种方式是易于水平扩展的呢?我们分析如下两个场景。

场景一:数据库性能达到瓶颈

方法一

按照现有规则不变,可以直接扩展到32个数据库集群。

48a3cff33d925a69a3692395ca9ca355.png

方法二

如果32个集群也无法满足需求,那么将分库分表规则调整为(32*2^n)*(32⁄2^n),可以达到最多1024个集群。

0187b49256671be845b39d44fdb9934b.png

场景二:单表容量达到瓶颈(或者1024已经无法满足你)

方法:

02969f4ad9412e98a55f5f41ba990e1e.png

假如单表都已突破200G,200*1024=200T(按照现有的订单模型算了算,大概一万千亿订单,相信这一天,嗯,指日可待!),没关系,32*(32*2^n),这时分库规则不变,单库里的表再进行裂变,当然,在目前订单这种规则下(用userId后四位 mod)还是有极限的,因为只有四位,所以最多拆8192个表,至于为什么只取后四位,后面会有篇幅讲到。

另外一个维度是通过ShopID进行切分,规则8*8和UserID比较类似,就不再赘述,需要注意的是Shop库我们仅存储了订单主表,用来满足Shop维度的查询。

唯一ID方案

这个方案也很多,主流的有那么几种:

1. 利用数据库自增ID

优点:最简单。

缺点:单点风险、单机性能瓶颈。

2. 利用数据库集群并设置相应的步长(Flickr方案)

优点:高可用、ID较简洁。

缺点:需要单独的数据库集群。

3. Twitter Snowflake

优点:高性能高可用、易拓展。

缺点:需要独立的集群以及ZK。

4. 一大波GUID、Random算法

优点:简单。

缺点:生成ID较长,有重复几率。

我们的方案

为了减少运营成本并减少额外的风险我们排除了所有需要独立集群的方案,采用了带有业务属性的方案:

> 时间戳+用户标识码+随机数

有下面几个好处:方便、成本低。

基本无重复的可能。

自带分库规则,这里的用户标识码即为用户ID的后四位,在查询的场景下,只需要订单号就可以匹配到相应的库表而无需用户ID,只取四位是希望订单号尽可能的短一些,并且评估下来四位已经足够。

可排序,因为时间戳在最前面。

当然也有一些缺点,比如长度稍长,性能要比int/bigint的稍差等。

其他问题事务支持:我们是将整个订单领域聚合体切分,维度一致,所以对聚合体的事务是支持的。

复杂查询:垂直切分后,就跟join说拜拜了;水平切分后,查询的条件一定要在切分的维度内,比如查询具体某个用户下的各位订单等;禁止不带切分的维度的查询,即使中间件可以支持这种查询,可以在内存中组装,但是这种需求往往不应该在在线库查询,或者可以通过其他方法转换到切分的维度来实现。

数据迁移

数据库拆分一般是业务发展到一定规模后的优化和重构,为了支持业务快速上线,很难一开始就分库分表,垂直拆分还好办,改改数据源就搞定了,一旦开始水平拆分,数据清洗就是个大问题,为此,我们经历了以下几个阶段。

第一阶段

04f1756c4f942433bd1c3b4ac32b0414.png数据库双写(事务成功以老模型为准),查询走老模型。

每日job数据对账(通过DW),并将差异补平。

通过job导历史数据。

第二阶段

c76a183504451321cfbe214eba3ee6d4.png历史数据导入完毕并且数据对账无误。

依然是数据库双写,但是事务成功与否以新模型为准,在线查询切新模型。

每日job数据对账,将差异补平。

第三阶段

b7dae975c8f7f6cb01fab97b0829ad4f.png老模型不再同步写入,仅当订单有终态时才会异步补上。

此阶段只有离线数据依然依赖老的模型,并且下游的依赖非常多,待DW改造完就可以完全废除老模型了。

总结

并非所有表都需要水平拆分,要看增长的类型和速度,水平拆分是大招,拆分后会增加开发的复杂度,不到万不得已不使用。

在大规模并发的业务上,尽量做到在线查询和离线查询隔离,交易查询和运营/客服查询隔离。

拆分维度的选择很重要,要尽可能在解决拆分前问题的基础上,便于开发。

数据库没你想象的那么坚强,需要保护,尽量使用简单的、良好索引的查询,这样数据库整体可控,也易于长期容量规划以及水平扩展。

最后感谢一下棒棒的DBA团队和数据库中间件团队对项目的大力协助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[渝粤教育] 西南科技大学 经济学概论 在线考试复习资料

经济学概论——在线考试复习资料 一、单选题 1.可持续发展战略的核心内容是正确处理? A.农、轻、重之间的比例关系 B.第一、二、三产业之间的比例关系 C.经济发展与人口、资源、环境之间的关系 D.积累与消费之间的比例关系 2.调整和优化产业结构就是要? A.在国民经济各部门之…

多模光纤收发器购买时需要注意什么问题?

光纤收发器是光通讯产品的一类,它一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中,同时在帮助把光纤最后一公里线路连接到城域网和更外层的网络上也发挥了巨大的作用。现如今,随着光通信产业的高速发展&#xff0…

[渝粤教育] 西南科技大学 计算机网络应用基础 在线考试复习资料2021版(1)

计算机网络应用基础——在线考试复习资料2021版 一、单选题 1. 在数字通信中广泛采用CRC循环冗余码的原因是CRC可以( )。 A. 检测出一位差错 B. 检测并纠正一位差错 C. 检测出多位突发性差错 D. 检测并纠正多位突发性差错 答案:看左边查询 2.为了保证连接的可靠性,TCP通常…

[渝粤教育] 西南科技大学 高级语言程序设计(Java) 在线考试复习资料

高级语言程序设计(Java)——在线考试复习资料 一、单选题 1.下列哪一个包给出了Runnable接口的定义?( ) A.iava.util B.java.io C.java.lang D.java.sql 2.下列( )属于Java线程同步方法。 A.joiny( ) B.run( ) C.wait( ) D.stroy( ) 3.下列方法中可以…

cd mysql 权限不够_.bash_profile权限不够_cdmysql权限不够

mac环境下创建bash_profile文件并写入内容_IO690x477 - 118KB - JPEGmac下创建bash_profile的问题? - Mac - 知乎585x366 - 22KB - PNG如何设置bash profile格式599x366 - 38KB - JPEG如何设置bash profile格式599x366 - 38KB - JPEG.bash_profile .bashrc profile文件的作用的…

POE交换机产品如何设计防雷保护?

在POE供电系统实际应用中,有很多受电设备AP或移动基站的基站AP与天线,经常要安装于建筑物的高端点,因此这些受电设备也成为遭受雷击的高发点。所以,对于这类的数据网络中心,不仅要考虑建设良好的直击雷防护网与良好的接…

【渝粤教育】电大中专学前儿童科学教育 (5)作业 题库

作业视频教务托管,壹叁路路贰陆陆壹〇肆〇 学前儿童科学教育的学习重点是( ) A.技术的概念 B.学前儿童科学教育的内涵 C.科学的概念 D.学前儿童科学教育的概念 错误 正确答案:左边查询 学生答案:A 2.以认识自然为目的的是( &#…

lucene 多个分词查找_使用Lucene的新FreeTextSuggester查找长尾建议

lucene 多个分词查找Lucene的“ 建议”模块提供了许多有趣的自动建议实现,以便在用户将每个字符输入搜索框时为他们提供实时搜索建议。 例如, WFSTCompletionLookup将所有建议及其权重编译到一个紧凑的有限状态传感器中 ,从而可以对基本建议…

【渝粤教育】电大中专幼儿园课程论 (7)作业 题库

作业视频教务托管,壹叁路路贰陆陆壹〇肆〇 以下哪种不是按照课程的表现形态划分的( ) A.活动课程 B.分科课程 C.分科课程 D.显性课程 错误 正确答案:左边查询 学生答案:未作答 2.如果幼儿园课程的教育理念强调儿童的发…

32linux下安装mysql5.7_Linux系统下以RPM方式安装mysql-5.7.9

1在开始安装之前,我们先来一小段官方文档,看下图。图中英文翻译过来就是:从MySQL5.7.4起,以RPM包的方式安装后的MySQL的部署默认是安全的,并且有这些特点:在大多数情况下,你只需要安装MySQL-ser…

【渝粤教育】电大中专新媒体营销实务 (7)作业 题库

1.依产生的先后顺序,当前媒体可分为四类:报纸、杂志等纸质平面媒体、广播媒体、电视媒体、互联网媒体。该说法( ) A.正确 B.错误 错误 正确答案:左边查询 学生答案:A 2.第四媒体发展到宽带互联网阶段成为&a…

PoE交换机的4种连接方法

POE也被称为基于局域网的供电系统或有源以太网,有时也被简称为以太网供电,一个完整的POE系统包括供电端设备和受电端设备两部分。可能会有一些朋友对poe供电有一些疑问,这个在之前也有很多朋友问到过,那么,今天就由飞畅…

【渝粤教育】电大中专电商运营实操 (23)作业 题库

电子商务最重要的是( ) A商务 B网站 C信息技术 D货物 正确 正确答案:左边查询 学生答案:A 2下列关于电子商务的特点叙述错误的是( ) A全球性 B简单的电子化支付手段 C交易环节多,营销成本高 D信…

带有NetBeans 10的Java EE

Apache NetBeans项目正在逐步形成。 10.0版于2018年12月27日发布。 下载版中列出了自9.0版以来添加的主要功能。 对我个人而言,最重要的功能是JDK 11支持。 那么,Java EE呢? 在将所有NetBeans源从Oracle转移到Apache并合并到Apache NetBean…

【渝粤教育】电大中专职业健康与安全 (3)作业 题库

试卷答案 1根据系统安全工程的观点,危险是指系统中存在导致发生不期望后果的可能性超过了( ) A极限 B人们的承受程度 C危险度 D安全系数 错误 正确答案:左边查询 学生答案:A 2对职工来说,安全是&#xff0…

POE交换机供电原理及工作过程

POE指的是在现有的以太网Cat.5布线基础架构不作任何改动的情况下,在为一些基于IP的终端(如IP电话机、无线局域网接入点AP、网络摄像机等)传输数据信号的同时,还能为此类设备提供直流电的技术.就是支持以太网供电的交换机。那么&am…

datagridview控件读写mysql数据库表格的方法_c# datagridview表格控件常用操作

1) 行右键菜单private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e){if (e.Button MouseButtons.Right){if (e.RowIndex > 0){//若行已是选中状态就不再进行设置if (dataGridView1.Rows[e.RowIndex].Selected false){dataGridView…

【渝粤教育】电大中专计算机常用工具软件 (2)作业 题库

1下列类型的软件中,功能没有任何限制且又不需要付费的是()。 A共享软件 B正版软件 C免费软件 D试用软件 错误 正确答案:左边查询 学生答案:D 2在常见的软件版本号中,Professional表示()。 A测试版 B专业版 C家庭版 D免…

PoE交换机可以当普通交换机使用吗?

PoE交换机是一种新型的多功能交换机,随着PoE交换机的广泛应用,人们对PoE交换机有了一定的了解。然而,很多人认为PoE交换机可以自行发电,这种说法并不正确,通常所讲的PoE交换机供电指的是PoE交换机通过网线来给其他设备…

【渝粤教育】电大中专跨境电子商务理论与实务 (20)作业 题库

1.自营型平台的代表企业有敦煌网.大龙网.米兰网。该说法( ) A.正确 B.错误 错误 正确答案:左边查询 学生答案:A 2.跨境电子商务对接“中国制造”激活了“买卖全球”,而与跨境电商联合则成为“中…