`
1028826685
  • 浏览: 938460 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类

订单分库分表实践总结以及关键步骤

 
阅读更多

转载地址http://mp.weixin.qq.com/s?__biz=MzA5Nzc4OTA1Mw==&mid=2659597584&idx=1&sn=67f5327423d7c66c3d3a6d32a040198d&scene=0#rd

随着唯品会业务的快速发展,订单量的不断增长,原有的订单存储架构已经不能满足公司的发展了,特别是在大促高峰期,原订单库已经成为抢购瓶颈,已经严重制约公司的发展。

唯品会旧订单库包含几十张订单相关表,旧订单库是典型的一主多从架构;主库容量已接近服务器物理空间上限,同时也已经达到MySQL的处理上限,很快将无法再处理新增订单。

旧订单库面临的问题有:

1、超大容量问题

  • 订单相关表都已经是超大表,最大表的数据量已经是几十亿,数据库处理能力已经到了极限;

  • 单库包含多个超大表,占用的硬盘空间已经接近了服务器的硬盘极限,很快将无空间可用;

2、性能问题

单一服务器处理能力是有限的,单一订单库的TPS也有上限,不管如何优化,总会有达到上限,这限制了单位时间的订单处理能力,这个问题在大促时更加明显,如果不重构,订单达到一定量以后,就无法再继续增长,严重影响到用户体验。

3、升级扩展问题

  • 单一主库无法灵活的进行升级和扩展,无法满足公司快速发展要求;

  • 所有的订单数据都放在同一库里面,存在单点故障的风险;

综上所述,容量、性能问题是急需解决的问题,扩展是为了将来3~5年内能够很好的满足唯品会快速发展的需要,而不需要每隔几个月花费人力物力去考虑扩容等问题。

解决方法思考

1、解决容量问题

我们可以考虑到最直接的方式是增加大容量硬盘,或者对IO有更高要求,还可以考虑增加SSD硬盘来解决容量的问题。此方法无法解决单表数据量问题。

可以对数据表历史数据进行归档,但也需要频繁进行归档操作,而且不能解决性能问题。

2、解决性能问题

提高数据库服务器的配置,这个可以提升一定数量的QPS和TPS,但仍然不能解决单服务器连接数、IO读写存在上限的问题,此方法仍然存在单点故障的问题。

拆分方法探讨

常见的数据库拆分方式有三种:垂直拆分、水平拆分、垂直水平拆分。

1、垂直拆分

垂直拆库是根据数据库里面的数据表的相关性进行拆分,比如:一个数据库里面既存在用户数据,又存在订单数据,那么垂直拆分可以把用户数据放到用户库、把订单数据放到订单库。如下图:
垂直拆表是对数据表进行垂直拆分的一种方式,常见的是把一个多字段的大表按常用字段和非常用字段进行拆分,每个表里面的数据记录数一般情况下是相同的,只是字段不一样,使用主键关联,如下图:

2、水平拆分

水平拆分是把单表按某个规则把数据分散到多个表的拆分方式,比如:把单表1亿数据按某个规则拆分,分别存储到10个相同结果的表,每个表的数据是1千万,拆分出来的表,可以分别放至到不同数据库中,即同时进行水平拆库操作,如下图:
水平拆分可以降低单表数据量,让每个单表的数据量保持在一定范围内,从而提升单表读写性能。但水平拆分后,同一业务数据分布在不同的表或库中,可能需要把单表事务改成跨表事务,需要转变数据统计方式等。

3、垂直水平拆分

垂直水平拆分,是综合了垂直和水平拆分方式的一种混合方式,垂直拆分把不同类型的数据存储到不同库中,再结合水平拆分,使单表数据量保持在合理范围内,提升总TPS,提升性能,如下图:

垂直拆分策略

原订单库把所有订单相关的数据(订单销售、订单售后、订单任务处理等数据)都放在同一数据库中,不符合电商系统分层设计,对于订单销售数据,性能第一,需要能够在大促高峰承受每分钟几万到几十万订单的压力;而售后数据,是在订单生成以后,用于订单物流、订单客服等,性能压力不明显,只要保证数据的及时性即可;所以根据这种情况,把原订单库进行垂直拆分,拆分成订单售后数据、订单销售数据、其他数据等,如下图:

水平拆分策略

垂直拆分从业务上把订单下单数据与下单后处理数据分开,但对于订单销售数据,由于数据量仍然巨大,最大的订单销售相关表达到几十亿的数据量,如果遇到大型促销(如:店庆128、419、618、双十一等等),数据库TPS达到上限,单销售库单订单表仍然无法满足需求,还需要进一步进行拆分,在这里使用水平拆分策略。

订单分表是首先考虑的,分表的目标是保证每个数据表的数量保持在1000~5000万左右,在这个量级下,数据表的大小与性能是最理想的。

如果几十个分表都放到一个订单库里面,运行于单组服务器上,则受限于单组服务器的处理能力,数据库的TPS有限,所以需要考虑分库,把分表放到分库里面,减轻单库的压力,增加总的订单TPS。

1、用户编号HASH切分

使用用户编号哈希取模,根据数据量评估,把单库拆分成n个库,n个库分别存放到m组服务器中,如下图:
每组服务器容纳4个库,如果将来单服务器达到性能、容量等瓶颈,可以直接把数据库水平扩展为2倍服务器集群,还可以继续扩展为4倍服务器集群。水平扩展可以支撑公司在未来3~5年的快速订单增长。

使用用户编号进行 sharding,可以使得创建订单的处理更简单,不需要进行跨库的事务处理,提高下单的性能与成功率。

2、订单号索引表

根据用户编号进行哈希分库分表,可以满足创建订单和通过用户编号维度进行查询操作的需求,但是根据统计,按订单号进行查询的占比达到80%以上,所以需要解决通过订单号进行订单的CURD等操作,所以需要建立订单号索引表。

订单号索引表是用于用户编号与订单号的对应关系表,根据订单号进行哈希取模,放到分库里面。根据订单号进行查询时,先查出订单号对应的用户编号,再根据用户编号取模查询去对应的库查询订单数据。

订单号与用户编号的关系在创建订单后是不会更改的,为了进一步提高性能,引入缓存,把订单号与用户编号的关系存放到缓存里面,减少查表操作,提升性能,索引不命中时再去查表,并把查询结果更新到缓存中。

3、分布式数据库集群

订单水平分库分表以后,通过用户编号,订单号的查询可以通过上面的方法快速定位到订单数据,但对于其他条件的查询、统计操作,无法简单做到,所以引入分布式数据库中间件。

下图是基本构架:

总结与思考

技术架构与业务场景息息相关,不能脱离实际的业务场景、历史架构、团队能力、数据体量等等去做架构重构,对于一家快速发展的电子商务公司,订单系统是核心,订单库是核心的核心,订单库的重构就像汽车在高速公路上跑着的过程中更换轮胎。

本文是对唯品会订单库重构——采用分库分表策略对原订单库表进行拆分的粗略总结,在订单库重构过程中遇到的问题远远超过这些,比如:历史数据的迁移、各外围系统的对接等,但这些在公司强大的技术团队面前,最终都顺利的解决,新旧订单库顺利的切换,给公司快速的业务发展提供坚实的保障。

分享到:
评论
1 楼 misisipi101 2017-08-27  
假设库已经分为32个,那么要扩展到64个,怎样做呢

相关推荐

    47_来来来!咱们聊一下你们公司是怎么玩儿分库分表的?.zip

    6. **笔记.docx** 和 **01_分库分表的由来.png**、**02_数据库如何拆分.png**:这些文件可能包含了学习笔记、图表或者示例,有助于直观地理解分库分表的背景、实施步骤以及实际效果。 总的来说,分库分表是解决大...

    DB 分库分表项目改造心得

    "DB 分库分表项目改造心得"这个标题暗示了作者在实际操作过程中对数据库优化的一种实践和经验分享。以下是基于这个主题可能涉及的一些重要知识点: 1. **数据库垂直拆分**:垂直拆分是将一个大表按照业务逻辑拆分成...

    mysql数据库分库分表实践

    在应对大数据量带来的挑战时,"mysql数据库分库分表实践"成为了许多企业解决数据库性能瓶颈的关键策略。本文将深入探讨这一主题,分析背景、调研的技术特性,并介绍相关的架构设计改造。 一、背景 随着零售行业的...

    对分库分表的一些想法

    4. **数据迁移与同步**:在进行分库分表时,数据迁移是关键步骤,需要确保数据的完整性和一致性。可以使用如ETL工具(Extract-Transform-Load)进行数据抽取、转换和加载。同时,实时数据同步也至关重要,例如使用...

    分库分表shardingjdbc

    ### 分库分表shardingjdbc知识点详述 #### 一、简介 Apache ShardingSphere 是一个分布式的数据库中间件项目,旨在提供简单易用、高度可扩展的数据分片解决方案。ShardingSphere 支持多种模式,包括 JDBC 模式、...

    sharding-jdbc-demo.zip

    本文将以"sharding-jdbc-demo.zip"为例,详细介绍如何使用Sharding-JDBC框架实现按月分表,以及其中涉及的关键技术和实践要点。 Sharding-JDBC是一款轻量级的Java框架,它无需中间件即可实现数据库的水平扩展。其...

    SharedingJDBC4.0按月分表(不分库)demo

    为了解决这一问题,许多分库分表的解决方案应运而生,其中SharedingJDBC作为一个流行的Java中间件,提供了高效的数据分片策略。本文将详细介绍如何使用SharedingJDBC 4.0实现按月分表的功能,但不涉及分库操作。 ...

    sharding-jdbc-mybatis.zip

    本实例以"sharding-jdbc-mybatis.zip"为例,详细讲解如何将Sharding-JDBC与MyBatis进行整合,实现分库分表的功能。 1. **Sharding-JDBC介绍** Sharding-JDBC作为一款Java客户端直连数据库的ORM框架,其工作原理是...

    系统架构优化最佳实践.pdf

    同时,数据库拆分也是重要步骤,包括垂直分表、垂直分库、水平分表和水平分库分表,以适应数据量的增长和处理需求。 三、结构演变 结构演变是系统优化的持续过程,随着业务和技术的发展,系统架构需要不断演进以...

    2013年中国数据库大会-19-阿里数据库关键技术

    可扩展架构采用分库分表和读写分离的技术,而高可用架构则实现了主-主(M-M)和主-主-从(M-M-S)的部署模式。实例管理上实现了单机多实例和资源隔离。 6. MySQL 5.5参数配置 张瑞分享了一系列的MySQL参数配置,...

    SSM实战项目——Java高并发秒杀API,详细流程+学习笔记

    5. **读写分离与分库分表**:对于大规模的秒杀系统,可能需要对数据库进行读写分离和水平扩展,通过分库分表策略减轻单库压力。 6. **数据库优化**:使用索引优化查询效率,设计合理的数据模型,减少join操作,避免...

    3.五八到家账户账务系统架构与实践.pdf

    - 账务系统需要按照业务线进行分库分表,以便更高效地管理不同类型的业务数据。 - 用户账户和商家账户被分开,以满足不同的业务需求和确保数据的独立性。 2. **账务系统作用**: - 记录账户余额:账务系统需要...

    物流库存管理系统

    4. 性能优化:考虑索引的建立、查询优化,以及如何合理分库分表以应对大数据量的挑战。 5. 安全性:确保数据的安全性,通过用户权限控制、备份恢复策略等手段防止数据丢失或被非法访问。 在《物流库存管理系统_03...

    网上购物管理系统数据库(store).rar

    7. 数据库优化:考虑到网上购物系统的高并发访问,数据库性能优化也很关键,包括索引优化、查询优化、存储过程使用、读写分离、分库分表等策略。 8. 安全性:保护用户数据的安全是网上购物系统必须考虑的,这包括...

    网上书店论文-课程设计

    例如,通过CDN加速静态资源加载,采用数据库分库分表提高查询效率。 8. **测试与部署**:系统开发完成后,需进行单元测试、集成测试、压力测试等,确保各功能正确无误。最后,选择合适的服务器环境进行部署,如...

    电子商务+社区功能数据库设计文档

    同时,为应对高并发和大量数据,可能需要进行分库分表设计,使用缓存技术等。 社区功能的数据库设计则需要考虑用户动态、论坛帖子、评论等社交元素,这些通常涉及到用户关系、话题分类、帖子回复等复杂的数据结构。...

    在线购物系统

    数据库优化包括索引设置、查询优化、事务处理,以及考虑扩展性,如读写分离、分库分表等策略。 4. **安全性**:为了保护用户数据和交易安全,系统需要实现HTTPS加密通信,防止中间人攻击。同时,密码应通过哈希算法...

    Dubbo分布式系统架构支付系统项目工程全套源码(含数据库).zip

    在支付系统中,数据库往往需要支持高并发读写,并且对数据的一致性和完整性有严格要求,可能使用了主从复制、分库分表等技术来提升性能和可用性。 5. **软件/插件**:在开发过程中,可能会使用到各种开发工具、IDE...

    java秒杀系统设计与实现.互联网工程师进阶与分析

    3. 数据库优化:使用分库分表、读写分离等策略,搭配Redis等缓存技术,提高数据库性能。 4. 高并发处理:使用线程池限制并发量,结合非阻塞I/O(如Netty)提升处理效率。 三、秒杀系统设计原则 1. 幂等性:确保同一...

Global site tag (gtag.js) - Google Analytics