想必各位小伙伴在面试大厂的时候都遇到过这个面试题,要是提前有准备还好,没准备的话可能就被打了个措手不及,本文将从为什么使用分库分表技术分库分表的基本概念分库分表的好处以及分库分表的注意事项来聊一聊这个话题。

数据库架构演变

刚开始我们只用单机数据库就够了,随后面对越来越多的请求,我们将数据库的写操作和读操作进行分离, 使用主库(Master)负责写,使用多个从库副本(Slaver Replication)负责读,从库从主库同步更新数据,保持数据一致。架构上就是数据库主从同步。从库可以水平扩展,所以更多的读请求不成问题。

但是当用户量级上来后,写请求越来越多,该怎么办?加一个Master是不能解决问题的, 因为数据要保存一致性,写操作需要2个master之间同步,相当于是重复了,而且更加复杂。

这时就需要用到分库分表(sharding),对写操作进行切分。

为什么要使用分库分表

在业务系统中关系型数据库(以MySQL为例)本身比较容易成为系统的瓶颈,比如单机存储容量、连接数、处理能力有限等等的原因非常容易让我们的系统变得“迟缓”,甚至崩溃。即使我们的数据库架构采用主从模式也依然存在这个问题,随着系统越来越复杂,不可能去用多主多从的模式,而且多主多从模式中数据一致性的问题处理起来比较棘手,所以也依然存在很多查询不理想的情况。总的来说,分库分表是为了解决数据库存储大量数据时出现的性能瓶颈。

  • IO瓶颈

    • 磁盘读IO瓶颈。由于热点数据太多,数据库缓存完全放不下,查询时会产生大量的磁盘IO,查询速度会比较慢,这样会导致产生大量活跃连接,最终可能会发展成无连接可用的后果。可以采用一主多从,读写分离的方案,用多个从库分摊查询流量。或者采用分库+水平分表(把一张表的数据拆成多张表来存放,比如订单表可以按user_id来拆分)的方案。
    • 第二种:磁盘写IO瓶颈。由于数据库写入频繁,会产生频繁的磁盘写入IO操作,频繁的磁盘IO操作导致产生大量活跃连接,最终同样会发展成无连接可用的后果。这时只能采用分库方案,用多个库来分摊写入压力。再加上水平分表的策略,分表后,单表存储的数据量会更小,插入数据时索引查找和更新的成本会更低,插入速度自然会更快。
  • CPU瓶颈

    • SQL问题。如果SQL中包含join,group by,order by,非索引字段条件查询等增加CPU运算的操作,会对CPU产生明显的压力。 这时可以考虑SQL优化,创建适当的索引,也可以把一些计算量大的SQL逻辑放到应用中处理。
    • 单表数据量太大。由于单张表数据量过大,比如超过一亿,查询时遍历树的层次太深或者扫描的行太多,SQL效率会很低,也会非常消耗CPU。这时可以根据业务场景水平分表。
分库分表的基本概念

分库分表的方式有垂直切分水平切分两种

  • 垂直分库

以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。每个库的结构都不一样,每个库的表结构也不一样,并且没有交集,最后将不同的库部署在不同的服务器上。数据库业务层面的拆分,和服务的“治理”,“降级”机制类似,也能对不同业务的数据分别的进行管理,维护,监控,扩展等。 数据库往往最容易成为应用系统的瓶颈,而数据库本身属于“有状态”的,相对于Web和应用服务器来讲,是比较难实现“横向扩展”的。 数据库的连接资源比较宝贵且单机处理能力也有限,在高并发场景下,垂直分库一定程度上能够突破IO、连接数及单机硬件资源的瓶颈。

  • 垂直分表

以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。一般是将热点数据作为主表,这样更多的热点数据就能被缓存下来,进而减少了随机读IO。将不常用的, 数据较大,长度较长(比如text类型字段)的拆分到“扩展表“。但是查询的时候不要去join表,因为join会增加CPU的负担,而且join必须两个表在同一台实例上。正确的做法是:分别获取主表和扩展表数据然后用关联字段关联得到全部数据。

  • 水平分库


以字段为依据,按照一定策略(RANGE、HASH取模等),将一个库中的数据拆分到多个库中。每个库的结构都一样;每个库的数据都不一样,没有交集;所有库的并集是全量数据。一般水平分库后,多个数据库是部署到不同服务器上,这样能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈。

  • 水平分表


针对数据量巨大的单张表(比如订单表),按照某种规则(RANGE、HASH取模等),切分到多张表里面去。 但是这些表还是在同一个库中,所以数据库操作还是有IO瓶颈,不建议采用。

分库分表存在的问题

当然任何解决方案方案都是有利有弊,我们应该尽量发挥它的优势,分库分表能带来的好处也是显而易见的:分库分表之后可以减少单库IO/CPU的瓶颈,解决了单表访问慢的问题,但是也不能够忽略它的劣势。

  • 跨库join的问题

分库分表之后因为不同的表在不同的库中,我们就无法join不同库中的表。通常的解决方案是分别查询不同库中不同的表,然后在service中聚合起来。

  • 事物的问题

因为分库分表之后不同的业务表全都分散开来了,所以也就演变成了分布式事务,那么就要对应的解决方案来处理,常见的TCC、2PC来解决。

  • 唯一ID的问题

分库分表之后我们就不能再使用数据库自增ID,因为非常容易发生ID重复的问题。业内常见的解决方案有:UUID、雪花算法等。

  • 新老数据兼容的问题

通常来说分库分表改造完成之后,新来的数据可以直接写入新的数据来源,而旧的数据可以通过DBA团队来帮忙处理,一点一点的清洗数据,最终同步到新的数据源。

大厂都在使用的分库分表方案相关推荐

  1. 主表的引用字段中找不到唯一的索引_不用找了,大厂在用的分库分表方案,都在这里!...

    作者:尜尜人物 一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连接少甚至无连 ...

  2. MySQL主从(MySQL proxy Lua读写分离设置,一主多从同步配置,分库分表方案)

    Mysql Proxy Lua读写分离设置 一.读写分离说明 读写分离(Read/Write Splitting),基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELE ...

  3. 数据库面试 - 如何设计可以动态扩容缩容的分库分表方案?

    数据库面试 - 如何设计可以动态扩容缩容的分库分表方案? 面试题 如何设计可以动态扩容缩容的分库分表方案? 面试官心理分析 对于分库分表来说,主要是面对以下问题: 选择一个数据库中间件,调研.学习.测 ...

  4. mybatis+mysql分库分表_一种简单易懂的 MyBatis 分库分表方案

    数据库分库分表除了使用中间件来代理请求分发之外,另外一种常见的方法就是在客户端层面来分库分表 -- 通过适当地包装客户端代码使得分库分表的数据库访问操作代码编写起来也很方便.本文的分库分表方案基于 M ...

  5. MySQL第六讲 MySQL分库分表方案

    分库分表概念        分库分表就是业务系统将数据写请求分发到master节点,而读请求分发到slave 节点的一种方案,可以大大提高整个数据库集群的性能.但是要注意,分库分表的 一整套逻辑全部是 ...

  6. 最全的MySQL分库分表方案总结

    " 面试中我们经常会碰到的关于分库分表的问题!今天就给大家介绍互联网公司常用 MySQL 分库分表方案!希望对大家的面试有所帮助! 数据库瓶颈 不管是 IO 瓶颈,还是 CPU 瓶颈,最终都 ...

  7. 动态扩容缩容的分库分表方案

    1.面试题 如何设计可以动态扩容缩容的分库分表方案? 2.面试官心里分析 (1)选择一个数据库中间件,调研.学习.测试 (2)设计你的分库分表的一个方案,你要分成多少个库,每个库分成多少个表,3个库每 ...

  8. 互联网公司常用的分库分表方案【记录】

    一.数据库分库分表思路: 1.数据库瓶颈: 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连 ...

  9. 如何设计可以动态扩容缩容的分库分表方案?

    面试题 如何设计可以动态扩容缩容的分库分表方案? 面试官心理分析 对于分库分表来说,主要是面对以下问题: 选择一个数据库中间件,调研.学习.测试: 设计你的分库分表的一个方案,你要分成多少个库,每个库 ...

最新文章

  1. 美国在人工智能领域亟待解决的5大难题
  2. WF4.0进行单元测试
  3. Python天天美味(13) - struct.unpack
  4. CTF--misc 零宽度字符隐写
  5. mongodb授权登录,经过自己修改后的授权登录方式
  6. 如何“漂亮”地解决dota类游戏网络延迟同步?
  7. 通俗系列之同步、异步、阻塞和非阻塞
  8. vnc 树莓派 链接_树莓派 VNC Viewer 远程桌面配置教程
  9. rCNN学习笔记二:基于R-CNN的物体检测
  10. oracle数据库影响网络延时,磁盘排序对Oracle数据库性能的影响-通信/网络-与非网...
  11. 使用Async方法 Using Async Methods 精通ASP-NET-MVC-5-弗瑞曼 Listing 4-32.
  12. 【NOIP2016提高A组模拟9.14】数列编辑器
  13. matlab画图 横坐标为年月
  14. Error writing to registry key: RegSetValueEx failed; code 5
  15. 2.3.1 TextView(文本框)详解
  16. 编写程序:5类员工有对应封装类,创建Employee数组,若干不同的Employee对象,并实现增删改查功能(《黑马程序员》P144编程题加强版)
  17. python求斜边上的高_直角三角形斜边上的高如何求?
  18. 计算机已从异常关机中恢复,win7系统经常遇到“windows已从异常关机中恢复”的解决方法...
  19. AQS——CLH队列维护方法详解
  20. LaTeX中CTeX版本日期格式设置英文

热门文章

  1. 下沉市场投资热度提升 7天酒店打造酒店投资“极致性价比”
  2. 后端语言除了java_浅谈后端语言优缺点
  3. 荣耀平板V6使用感受 多元化平板给我不一样的5G体验
  4. 2021年钎焊考试资料及钎焊理论考试
  5. abc241 C(逆天盲僧竟是我自己)
  6. 痛心!商汤科技员工健身房猝死!网友:996福报何时是个头?
  7. python list删除元素是要注意的坑点
  8. 真 ● 禁秘技 ● 奥义 ● 终端美化
  9. 记一次Hive元数据管理问题的处理过程
  10. 《弹丸论破·希望学园与绝望高中生》:浅谈颠覆性的推理动作玩法