高性能集群-分库分表

这是我架构设计专栏的第5篇文章。

我的架构设计专栏:https://www.nowcoder.com/creation/manager/columnDetail/0ybvLm

我的八股知识专栏:https://www.nowcoder.com/creation/manager/columnDetail/j8ZZk0

觉得有用的欢迎订阅专栏和关注我!

1.前言

读写分离分散了数据库读写操作的压力,但没有分散存储压力,当数据量达到千万甚至上亿条的时候,单台数据库服务器的存储能力会成为系统的瓶颈,主要体现在这几个方面:

  • 数据量太大,读写的性能会下降,即使有索引,索引也会变得很大,性能同样会下降。
  • 数据文件会变得很大,数据库备份和恢复需要耗费很长时间。数据文件越大,极端情况下丢失数据的风险越高(例如,机房火灾导致数据库主备机都发生故障)。

基于上述原因,**单个数据库服务器存储的数据量不能太大,需要控制在一定的范围内。为了满足业务数据存储的需求,就需要将存储分散到多台数据库服务器上。**今天我来介绍常见的分散存储的方法“分库分表”,其中包括“分库”和“分表”两大类。

2.什么是分库分表?

分库 就是将数据库中的数据分散到不同的数据库上,一般是业务分库。

分表 就是对单表的数据进行拆分,可以是垂直拆分,也可以是水平拆分

3.业务分库

**业务分库指的是按照业务模块将数据分散到不同的数据库服务器。**例如,一个简单的电商网站,包括用户、商品、订单三个业务模块,我们可以将用户数据、商品数据、订单数据分开放到三台不同的数据库服务器上,而不是将所有数据都放在一台数据库服务器上。

虽然业务分库能够分散存储和访问压力,但同时也带来了新的问题,接下来我进行详细分析。

  • join 操作问题业务分库后,原本在同一个数据库中的表分散到不同数据库中,导致无法使用 SQL 的 join 查询。例如:“查询购买了化妆品的用户中女性用户的列表”这个功能,虽然订单数据中有用户的 ID 信息,但是用户的性别数据在用户数据库中,如果在同一个库中,简单的 join 查询就能完成;但现在数据分散在两个不同的数据库中,无法做 join 查询,只能采取先从订单数据库中查询购买了化妆品的用户 ID 列表,然后再到用户数据库中查询这批用户 ID 中的女性用户列表,这样实现就比简单的 join 查询要复杂一些。
  • 事务问题原本在同一个数据库中不同的表可以在同一个事务中修改,业务分库后,表分散到不同的数据库中,无法通过事务统一修改。虽然数据库厂商提供了一些分布式事务的解决方案(例如,MySQL 的 XA),但性能实在太低,与高性能存储的目标是相违背的。例如,用户下订单的时候需要扣商品库存,如果订单数据和商品数据在同一个数据库中,我们可以使用事务来保证扣减商品库存和生成订单的操作要么都成功要么都失败,但分库后就无法使用数据库事务了,需要业务程序自己来模拟实现事务的功能。例如,先扣商品库存,扣成功后生成订单,如果因为订单数据库异常导致生成订单失败,业务程序又需要将商品库存加上;而如果因为业务程序自己异常导致生成订单失败,则商品库存就无法恢复了,需要人工通过日志等方式来手工修复库存异常。
  • 成本问题业务分库同时也带来了成本的代价,本来 1 台服务器搞定的事情,现在要 3 台,如果考虑备份,那就是 2 台变成了 6 台。

4.分表

1.怎么分表?

表将不同业务数据分散存储到不同的数据库服务器,能够支撑百万甚至千万用户规模的业务,但如果业务继续发展,同一业务的单表数据也会达到单台数据库服务器的处理瓶颈。例如,淘宝的几亿用户数据,如果全部存放在一台数据库服务器的一张表中,肯定是无法满足性能要求的,此时就需要对单表数据进行拆分。

单表数据拆分有两种方式:垂直分表和水平分表。示意图如下:

单表进行切分后,是否要将切分后的多个表分

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏价格永远为19.9元! 不想当架构师的后端开发工程师不是好码农! 此专栏一方面用于存放我的架构设计学习笔记, 另外我会在本专栏加入一系列最常问八股问题帖子,内容就是我根据自己的面试经历和网上的面经,去筛选八股里面哪些是最常被问到的问题把它们整理出来,大家可以在面试前一两个小时快速把这一系列最常问八股的帖子拿出来看看,临时抱佛脚的效果应该很好

全部评论
觉得有用的可以给文章点赞评论几句
1 回复 分享
发布于 2024-07-06 19:06 湖北
分库分表是一种常见的数据库优化策略,主要目的是分散存储和访问压力,提高数据库性能。分库是指将数据库中的数据分散到不同的数据库服务器上,一般按照业务模块进行划分。分表则是对单表的数据进行拆分,可以是垂直拆分,也可以是水平拆分。 垂直拆分适合将表中某些不常用且占了大量空间的列拆分出去,水平拆分适合表行数特别大的表,有的公司要求单表行数超过 5000 万就必须进行分表。 分库分表后,数据怎么迁移呢?常见的方法有停机迁移和双写方案。停机迁移是指在凌晨 2 点,系统使用的人数非常少的时候,挂一个公告说系统要维护升级预计 1 小时。然后,你写一个脚本将老库的数据都同步到新库中。双写方案是指同时向老库和新库写入数据,逐步将数据迁移到新库中,以避免服务中断。 分库分表后,会带来一些复杂性,例如路由算法、join 操作问题、事务问题、成本问题等。因此,并不是数据库性能不够的时候就分库分表,提升数据库性能方式很多,若有其他能在单数据库操作的方式则毫不犹豫使用,因为使用分表有固有的复杂性(join操作,事务,order by等)。
1 回复 分享
发布于 2024-07-06 17:41 AI生成
大专都是人上人
点赞 回复 分享
发布于 03-17 22:34 广东
觉得文章有用的欢迎动动byd小手点个赞,你的赞对我很重要!
点赞 回复 分享
发布于 2024-07-18 22:57 湖北
学java我只看大篮子,爱你哟
点赞 回复 分享
发布于 2024-07-10 09:49 上海
6
点赞 回复 分享
发布于 2024-07-06 21:30 湖北

相关推荐

都在说秋招是越早投越好,我越早投和双9大佬同台竞技,我压力暴大呀营销号都说越早投递越好真的不是贩卖焦虑吗
xxxxOxo:分批次投吧,投太多面试安排不过来或者一直面都没时间复盘,那很多面试等于白面了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-21 11:33
昨天是学校最后一场招聘会,鼠鼠去参加了,全场只有一个招聘java的岗位,上来先做一份笔试题,做完后他拿张纸对答案,然后开始问简历上的问题,深圳小厂,6-8k(题目如下),后面还有两轮面试。然后我就在招聘现场逛呀逛,看到有公司招聘电商运营,给的比上年的小厂还多,鼠鼠就去了解了下,然后hr跟鼠鼠要了份简历,虽然我的简历上面全是求职Java开发相关的内容,但是hr还是鼓励我说没关系,她帮我把简历给老板看看,下周一会给我通知。招聘会结束后鼠鼠想了一段时间,也和朋友聊了聊,发现我可能是不太适合这个方向,然后就跟爸爸说回家了给我发条微信,我有些话想跟他说说。晚上爸爸到家了,跟我发了条微信,我立马跑出图书馆跟他打起了电话,这个通话长达一个小时,主要是跟爸爸坦白说我不想找这行了,是你的儿子太没用了,想试试其他行业。然后爸爸也跟我说了很多,说他从来没有希望我毕业后就赚大钱的想法,找不到就回家去,回家了再慢慢找,实在找不到就跟他干(帮别人装修房子,个体户),他也知道工作不好找,让我不要那么焦虑,然后就是聊一些家常琐事。对于后面的求职者呢我有点建议想提一下,就是如果招实习的时间或者秋招开始,而你的简历又很差的情况下,不要说等做好项目填充完简历之后再投,那样就太晚了,建议先把熟悉的项目写上简历,然后边投边面边完善,求职是一个人进步的过程,本来就比别人慢,等到一切都准备好后再投岂不是黄花菜都凉了。时间够的话还是建议敲一遍代码,因为那样能让你加深一下对项目的理解,上面那些说法只是针对时间不够的情况。当然,这些建议可能没啥用,因为我只是一个loser,这些全是建立在我理想的情况下,有没有用还需其他人现身说法。上篇帖子没想到学校被人认了出来,为了不丢脸只能匿名处理了。
KPLACE:找研发类或技术类,主要还是要1.多投 2.多做准备,很多方面都要做准备 3.要有心理准备,投累了就休息一两天,再继续,要相信自己能找到
投递58到家等公司8个岗位
点赞 评论 收藏
分享
07-18 22:55
海南大学 Java
点赞 评论 收藏
分享
评论
9
14
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务