广告
返回顶部
首页 > 资讯 > 数据库 >数据库架构演变及分库分表
  • 569
分享到

数据库架构演变及分库分表

2024-04-02 19:04:59 569人浏览 安东尼
摘要

当生产环境中业务量激增,数据库数据量也会极具增加。当数据库的数据量达到一定程度时(数据库瓶颈),数据库宿主机负载超高,会严重影响业务,严重时会导致数据库宕机。为了避免这种极端情况的发生,我们应当在发生前做好

当生产环境中业务量激增,数据库数据量也会极具增加。当数据库的数据量达到一定程度时(数据库瓶颈),数据库宿主机负载超高,会严重影响业务,严重时会导致数据库宕机。
为了避免这种极端情况的发生,我们应当在发生前做好预案,用于解决数据库数据量过载的问题。
以下是我个人工作中使用的解决方案:
1)数据库主从或多主多从方案
2)数据库冷热数据拆分
3)数据库分库分表操作
4)在数据库前端增加缓存Redis或memcached

一开始时,公司部分业务的架构如下(全都是单节点情况)
数据库架构演变及分库分表
经过自己强调该架构严重的缺点:节点单一,服务中断情况严重等严峻问题,后演变为如下简图的架构:
数据库架构演变及分库分表
上述架构中,我们更新代码实现了不中断服务,同时解决了部分单一节点问题。后来一段时间业务做推广优惠活动,业务量激增,数据库数据量成指数性增长。数据库负载一直居高不下。当前的架构已经无法满足业务需求,后又提出对数据库进行数据的冷热数据拆分和数据读写分离(可以考虑使用中间件Mycat、Atlas、MaxScale,也可以考虑让开发写路由规则,有些框架自带路由规则),这里我们使用Mycat,如下图架构,这里只显示后端
数据库架构演变及分库分表
随着时间的推移,单库单表已经达到业务忍受的极限,这时候已经在硬件还是在Mysql参数调优上都已经无法满足业务。这时候提出了数据库的分库分表。这里主要讲解数据库的分库分表
分库分表一共有两种方案:
1) 垂直拆分
2) 水平拆分
1、 垂直拆分
所谓垂直拆分,就是将单一数据库拆分成多个数据库,可以考虑的方案:
1) 根据业务逻辑进行拆分
2) 根据冷热数据进行拆分
这里先讲解根据业务逻辑拆分:
这里以商品--订单--用户为例,当多种类商品存放于一个数据库和一张表中时,随着时间推移,数据量增大,单库单表查询能力下降,可以根据商品种类来进行拆分,比如公司的产品:高中、初中、小学,由单个表拆分成三个独立表。如果还大,继续拆分,高中拆分成高一、高二、高三。初中拆分成初一、初二、初三。小学拆分成小一、小二......小六。(所有的分库分表都源于生活中的逻辑)。
我们生产环境中针对数据进行了拆分,冷数据(采用MyISAM引擎),热数据(采用Innodb引擎),同时将MyISAM引擎的数据库的宿主机多采用redis或memcache进行缓存,Innodb引擎的数据库的宿主机针对业务情况分配计算型和内存型物理机,还是混合型,同时可以考虑使用redis做部分存储,用于缓解数据库压力。
垂直拆分优缺点:
优点:
1) 由单库单表拆分成多库多表,降低了数据库增删改查压力
2) 对冷热数据拆分,降低了成本并合理利用硬件
3) 对于垂直拆分的数据库,在设计数据库时就应当考虑好数据库架构的延展性,(否则会对后期的扩展造成很大的阻力)
4) 按照业务分库后,业务逻辑更加清晰,更方便运维管理。
缺点:
1) 对于联表查询,带来了不便,可以通过调用接口的方式来触发联表查询的操作,对整个系统而言,复杂度提高了。
2) 对于有些数据库,存在单库性能瓶颈影响整个业务情况。
3) 同时对于事务而言,复杂度提高了。
2、 水平拆分
所谓水平拆分,简单来说就是将一张表中的数据按照行拆分成多份存储到不同的数据库的表中。比如user表有9000条数据,将user表拆成user1、user2、user3三张表存放于不同的数据库中,user1存储前3000条数据,中间3000条数据存储到user2表中,最后3000条数据存放到user3表中。
水平拆分的分片维度(有很多算法来决定采用哪种水平拆分的方案)
1) 按照哈希切片,对某个字段进行求哈希值,然后除以分片的数量,最后取模,取模相同的数据为一个分片,这就是哈希分片。
这种分片方式没有时效性。对数据分散比较均匀,缺点是如果需要查询则需要对数据进行聚合处理。
2) 按照时间序列算法切片,有的业务会有明显的季度波动,可以使用时间算法。这种算法就是数据分配不均。
生产环境中,我们部分业务采用的是哈希算法和时间序列算法的混合式
说到水平拆分,不得不提的是水平拆分的路由规则
设计数据库的时候,就要考虑到数据库中各种表的路由规则,同时还需要考虑数据表将来按照什么样的路由规则来进行分库分表。
比如,某个新用户注册,这个用户是如何分配到哪个库哪个表中?一般在注册的时候都会系统自动分配一个uid。根据这个uid可以按照某种算法来进行分配。比如uid%4,(这里将一张表分成4个表),如果是1 则分到第一张表中,以此类推。

水平拆分的优缺点:
1) 单库单表的数据量最大就那么大,有数据量的限制,我们可以根据业务情况来分配,刚好达到最大(这个量很难把握),既能提高该表的操作性能又节省了资源
2) 因为对表的结构改变非常少,对于开发而言更改代码量非常少,只需要增加路由规则。
3) 对整体系统的稳定性和负载都有大大的提高
缺点:
1) jion操作非常困难,尤其是跨库的联表查询
2) 有的拆分规则很难抽象出来
3) 分片的事务一致性比较难解决
4) 还有数据库的扩容和维护比较困难
针对上述垂直拆分和水平拆分,都有以下缺点:
1) jion操作困难
2) 事务一致性困难
3) 多个数据源的管理变复杂。
如何解决事务一致性问题呢?(这个重要性排在第一位)
1) 采用本地事务的一致性(能用则用)
2) 分布式事务处理
分布式事务处理的解决方案:
1) 两阶段提交方案(最严格的方案,很少使用,因为是阻塞协议造成性能问题):分为准备(定资源)和提交(消费资源)两个阶段。这种方式依赖资源管理器。
2) 最大努力保证模式(最常用,极端情况需要实时补偿,将已提交的数据进行回滚)不依赖资源管理器
一共有两种操作:从消息队列中消费消息和更新数据库操作
开始消息事务开始数据库事务接收消息更新数据库提交数据库事务提交消息事务
当更新数据库时,突然中断,会进行回滚,恢复到初始状态,特殊情况,如果提交数据库事务成功,但是提交消息事务失败,就会造成消息再次消费的情况。这个可以通过消息幂等处理(有时候很多消息无法满足幂等性比如update操作,可以考虑增加一个消息应用状态表来记录消息消耗情况和数据库事务情况),出现上述极端情况,需要实时补偿。这种补偿机制类似于TCC模式Try-Confirm-Cancel(如果try都成功了,它会重复confirm或重复cancel,直到都成功),TCC要求Confirm/Cancel都必须是幂等操作。

3) 事务补偿机制
前面两种方案,都不是最好的,事务补偿机既能保证性能又能尽最大可能保证事务的一致性。说白了就是突破事务一失败就回滚的思想,指定在一定的时间内不断提交直到成功为止,如果超时则回滚。
分库分表过程中带来的问题
1、 扩容和数据的迁移
数据已经分片,同时数据量已经快达到阈值,需要对集群进行扩容,都采用成倍扩容。
以下是5个扩容步骤:
1) 增加新的路由规则,对新的数据库采用新路由规则进行写,同时对旧数据库采用旧路由规则写。(双写,两套路由规则)
2) 将双写前的旧数据按照新规则写入到新数据库中(需要做大量的数据清洗工作)。
3) 将按照旧的分片规则的查询更改为按照新的分片规则查询。
4) 将双写的路由规则代码下线,只按照新规则写数据
5) 删除按照旧分片规则写入的历史数据。
2、 分库分表带来的联表查询问题
举例:
卖家和买家,卖家需要查看该商品卖出情况,买家需要查看自己的交易情况,可以考虑使用两个表,一个以买家维度,记录买家商品交易情况,一个以卖家维度,记录卖家该商品交易情况。也就是查询交易和交易的数据是分别存储的,并从不同的系统提供接口。
方法二:通过搜索引擎解决(大数据了)

参考文档:
https://blog.csdn.net/it_man/article/details/21593187

您可能感兴趣的文档:

--结束END--

本文标题: 数据库架构演变及分库分表

本文链接: https://www.lsjlt.com/news/42944.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 数据库架构演变及分库分表
    当生产环境中业务量激增,数据库数据量也会极具增加。当数据库的数据量达到一定程度时(数据库瓶颈),数据库宿主机负载超高,会严重影响业务,严重时会导致数据库宕机。为了避免这种极端情况的发生,我们应当在发生前做好...
    99+
    2022-10-18
  • 故事篇:数据库架构演变之路
    故事的开头总是这样,适逢其会、猝不及防。今天我哼着“也是黄昏的沙滩上,有着脚印两对半......”在海边散步,迎面走来了一位身穿黄金甲的男子,来海边还穿这么花哨,真是个傻X。定睛一看,这不是嘉文吗? > 背景介绍:嘉文四世,德玛西亚皇子...
    99+
    2017-05-20
    故事篇:数据库架构演变之路
  • 数据库分库分表思路
    数据库分布式核心内容无非就是数据切分(Sharding),以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。 ...
    99+
    2017-10-27
    数据库分库分表思路
  • 支撑百万并发的数据库架构,不仅只需分库分表那么简单!
    原文: http://www.enmotech.com/web/detail/1/756/1.html 导读:本文来聊一下对于一个支撑日活百万用户的高并系统,其数据库架构应该如何...
    99+
    2022-10-18
  • 数据库系统变量分类及设置
    标题索引变量分类变量设置变量分类    变量主要分为全局变量和会话变量,全局变量是当客户端程序与服务器端建立会话后自动集成部分全局变量的值,而会话变量是只对当前变量有...
    99+
    2022-10-18
  • MySQL 数据库分表分区
    博主QQ:819594300博客地址:http://zpf666.blog.51cto.com/有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持!一、分表为什么要分表?我们的数据库数据越来越大,随之...
    99+
    2022-10-18
  • 数据库中如何实现分库分表
    这篇文章将为大家详细讲解有关数据库中如何实现分库分表,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 分片是解决数据库存储容量限制的直接途径。分片包括垂直分片与水平分片两...
    99+
    2022-10-18
  • MariaDBSpider数据库分库分表实践记录
    目录分库分表部署 MariaDB 实例Docker 部署虚拟机部署MariaDB 配置检查每个实例配置 Spider远程表基准性能测试加入后端数据库哈希分片根据值范围分片根据列表分片...
    99+
    2022-11-13
  • Mysql数据库分库分表全面瓦解
    目录1 为什么要分库分表2 垂直拆分(Scale Up 纵向扩展)2.1 垂直分库2.2 垂直分表 3 水平拆分(Scale Out 横向扩展) 3.1 库内分表...
    99+
    2022-11-13
  • MariaDB Spider数据库分库分表的方法
    本文小编为大家详细介绍“MariaDB Spider数据库分库分表的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“MariaDB Spider数据库分库分表的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-06-29
  • 网易马进:DDB从分布式数据库到结构化数据中心的架构变迁
    导语: 本文根据马进老师在2018年5月10日【第九届中国数据库技术大会(DTCC)】现场演讲内容整理而成。 马进 网易 DDB项目负责人 来自网易杭研大数据平台组,入职以来先后参与...
    99+
    2022-10-18
  • 如何理解数据库读写分离架构?
    如何理解数据库读写分离架构?,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。RD:数据量太大,数据库扛不住了,帮忙申请一个从库,读写分离。D...
    99+
    2022-10-19
  • 数据库分库分表是什么,什么情况下需要用分库分表
    目录数据量在什么情况下需要分表?1、oracle2、mysql3、sqlserver分库分表是什么,什么情况下需要用分库分表1、什么是分库分表?2、什么情况下需要分库分表?3、分库分...
    99+
    2022-11-11
  • 数据库的分表分库算法有哪些
    这篇文章主要讲解了“数据库的分表分库算法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“数据库的分表分库算法有哪些”吧!以下是几种常见的分表算法。1.按...
    99+
    2022-10-18
  • PHP中的数据分库和分表
    PHP是一种常用的编程语言,用于开发Web应用程序。在现代Web应用程序中,数据处理是非常重要的一部分。随着Web应用程序中使用数据的不断增加,数据的分库和分表已经成为数据处理的基本技术之一。在PHP应用中,数据分库和分表也是一个非常重要的...
    99+
    2023-05-23
    PHP编程 数据分库 数据分表
  • 如何进行数据库的架构整体分析
    这期内容当中小编将会给大家带来有关如何进行数据库的架构整体分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  很少谈架构方面的事情,主要是因为这确实是个对知识面和知识深...
    99+
    2022-10-19
  • Mycat分表分库分布式数据库项目实施与维护_MySQL高可用复制与分布式集群架构10
    Mycat分表分库分布式数据库项目实施与维护_MySQL高可用复制与分布式集群架构10视频教程学习地址    http://edu.51cto.com/course/14498...
    99+
    2022-10-18
  • 数据库分库分表后非分片键怎么查询
    这篇文章主要介绍“数据库分库分表后非分片键怎么查询”,在日常操作中,相信很多人在数据库分库分表后非分片键怎么查询问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”数据库分库分表后...
    99+
    2023-03-13
    数据库
  • wordpress数据库结构及表说明
    数据表结构:wp_commentmeta:存储评论的元数据wp_comments:存储评论wp_links:存储友情链接(Blogroll)wp_options:存储WordPress系统选项和插件、主题配...
    99+
    2022-10-18
  • 数据库分库分表和要注意的问题
    分库 分库讲白了就是比如现在你有一个数据库服务器,数据库中有两张表分别是用户表和订单表。 如果要分库的话现在你需要买两台机子,搞两个数据库分别放在两台机子上,并且一个数据库放用户表,一个数据库放订单表。 这样存储压力就分担到两个服务器上...
    99+
    2019-08-28
    数据库分库分表和要注意的问题
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作