热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

性能优化之数据库篇5分库分表与数据迁移

一、数据库拆分1.为什么要做数据库拆分单机数据库存在的问题?从容量、性能、可用性和运维成本上难以满足海量数据的场景。性能方面,数据量超过一定阈值,B+树索引慎独增加导致磁盘访问的I

一、数据库拆分

1. 为什么要做数据库拆分

单机数据库存在的问题?

从容量、性能、可用性和运维成本上难以满足海量数据的场景。

  1. 性能方面,数据量超过一定阈值,B+树索引慎独增加导致磁盘访问的IO次数增加,进而导致查询性能的下降。
  2. 容量方面,单机能存储的数据量有限
  3. 可用性方面,大量的查询落到单一的数据库节点或者简单的主从架构上,数据库很难承担。
  4. 运维方面,数据量达到一定阈值,主从同步延迟高、增加字段索引、备份这些都会很慢,影响业务系统。

主从结构解决了高可用、读扩展。但是单机容量不变,单机写性能无法解决。

为了解决这些问题,我们需要采用分库分表,将数据库拆分开。降低单个节点的写压力,提升整个系统的数据容量上限。

扩展立体方

  • X轴:通过clone整个系统复制,集群
  • Y轴:通过解耦不同功能复制,业务拆分
  • Z轴:通过拆分不同数据扩展,数据分片

2. 垂直拆分

垂直拆分,按照业务纬度分库分表。

垂直拆库

将一个数据库,拆分为多个提供不同业务数据处理能力的数据库。如:将一个电商的单独库拆为用户库、订单库、商品库。

垂直拆表

如果单表数据量过大,还需要对单表进行拆分。如:一个200列的订单主表,拆分为十几个子表:订单表、订单详情表、订单收件信息表等。

垂直拆分的优缺点:

优点:

  • 单库(单表)变小,便于管理
  • 对性能和容量有提升
  • 拆分后,系统和数据复杂度降低
  • 可以作为微服务改造的基础

缺点:

  • 库变多,管理变复杂
  • 对业务系统有较强的侵入性
  • 改造过程复杂,容易出故障
  • 拆分到一定程度就无法继续拆分

3. 水平拆分

水平拆分就是直接对数据进行分片,有分库和分表两个具体方式。不改变数据本身的结构,只是降低单个节点数据量。这样对业务系统本身的代码来说不需要做特别大的改动,甚至可以基于一些中间件做到透明。

比如把一个10亿条记录的订单的单库单表。按用户id除以32取模,将单库拆分为32个库;再按订单id除以32取模,每个库再拆为32个表。这样就是32*32=1024个表,单个表数据量就只有不到百万条了。

水平分库分表

一般来说我们我们的数据都是有创建时间的,可以按时间拆分,按照年、季度、月、天都可以。

或者根据用户拆分、甚至可以根据一些自定义的复杂的逻辑来拆分。

为什么有时候不建议分表,只建议分库?

因为分表不能解决容量问题,如果瓶颈在IO(磁盘IO、网络IO)上,分表也解决不了,因为分表还是在同一个机器,而分库可以在两个机器上。

分库还是分表,如何选择?

一般情况下,如果数据本身读写压力较大,磁盘IO已经成为瓶颈,那么分库比分表要好。而使用不同的库,可以并行提升整个集群的并行数据处理能力。

相反的情况下,可以尽量考虑分表,降低单表的数据量。

水平分库分表的优缺点:
优点:

  • 解决容量问题
  • 比垂直拆分对系统影响小
  • 部分提升性能和稳定性

缺点:

  • 集群规模大,管理复杂
  • 复杂SQL支持问题
  • 数据迁移问题
  • 一致性问题

4. 数据的分类管理

数据的分类管理是指通过对数据进行分类提升数据管理能力。

随着对业务系统、对数据的分析了解发现,很多数据对质量的要求是不一样的。

如订单数据,肯定一致性要求最高,不能丢失。而一些日志数据,中间数据,则没有那么高的一致性。丢了就丢了。

另外,同一张表里的订单数据也可以采用不同策略,无效订单比较多,我们可以定期转移或清除。(一些交易系统里80%以上的是下单后取消的无意义订单,所以可以清理它

如果没有无效订单,也可以考虑:

  1. 最近一周下单但是未支付的订单,被查询和支付的可能性较大。而再以前一点的,可以直接取消掉。
  2. 最近3个月下单的数据,被在线重复查询和系统统计的可能性最大。
  3. 3个月以前-3年以内的数据,查询的可能性小,可以不提供在线查询
  4. 3年以上的数据,可以直接不提供任何方式的查询。

这样的话,我们就可以根据分类采用一定的手段去优化系统:

  1. 定义一周内下单但未支付的数据为热数据,同时放到数据库和内存
  2. 定义3个月内的数据为温数据,放到数据库,提供正常的查询操作
  3. 定义3个月到3年的数据为冷数据,从数据库删除,归档到一些便宜的磁盘,用压缩的方式(比如MySQL的tokuDB引擎)存储,用户需要查询的话提工单来查询
  4. 定义3年以上的数据为冰数据,备份到磁带之类的介质上,不提供任何查询操作。

5. 数据库中间件

数据库中间件的技术演进

ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由JDBC、Proxy和Sidecar(规划中)这3款相互独立,又能混合部署配合使用的产品组成。它们均提供数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构、云原生等各种多样化的应用场景。

ShardingSphere-JDBC

框架ShardingSphere-JDBC,可以直接在业务代码使用,支持常见的数据库和JDBC。只适用于Java语言。

使用实例:

  • 读写分离:https://github.com/mmcLine/sharding/
  • 分库分表:https://gitee.com/mmcLine/shardingjdbc-database-example

二、数据迁移

方案一:全量

  1. 业务系统停机
  2. 数据库迁移,校验一致性
  3. 业务系统升级,接入新数据库

如果新数据库结构一样,可以dump后全量导入。如果是异构的话,需要用程序处理。

方案二:全量+增量

依赖于数据本身的时间戳

  1. 先同步数据到最近的某个时间戳(如前一天)
  2. 然后再发布升级时停机维护
  3. 再同步最后一段时间的变化数据
  4. 最后升级业务系统,接入新数据库。

方案三:binlog+全量+增量

  • 通过主库或从库的binlog来解析和重新构造数据,实现复制。
  • 一般需要中间件工具的支持。

可以实现多线程,断点续传,全量或增量的数据同步。

继而可以做到:

  1. 实现自定义复杂异构数据结构
  2. 实现自动扩容和缩容,比如分库分表到单库单表、单库单表到分库分表、分4个库到分8个库等等。

下面介绍一个迁移工具:

ShardingSphere-scaling

下载包:https://archive.apache.org/dist/shardingsphere/4.1.0/


推荐阅读
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • “您可以从三个选项中(快速、便宜或好)选择两个”提出这个问题的人可能不是可观测性工程师。但也可能是,在可观测性方面,决定您 ... [详细]
  • 熟练掌握Spring Cloud,终于成为Java工程师的面试门槛 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
author-avatar
大魔王
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有