读写分离-分库分表

举报
object 发表于 2024/03/21 14:15:47 2024/03/21
【摘要】 读写分离解决的并发读写压力的问题,数据库存储压力的问题如何解决?1.什么是分库分表?分为分库和分表,见名知意就是将张表分为多个表或者多个库进行存储。一般分为垂直和水平拆分。 垂直拆分就是列拆分,水平拆分就是表行拆分。2.分库分表的常见情况虽然一般不建议分库分表,但由于数据量达到一定时,严重影响了系统的性能,就需要进行分库分表,常见情况:单表的数据达到千万级,这个根据数据库定,oracle和m...

读写分离解决的并发读写压力的问题,数据库存储压力的问题如何解决?

1.什么是分库分表?

分为分库和分表,见名知意就是将张表分为多个表或者多个库进行存储。

一般分为垂直和水平拆分。 垂直拆分就是列拆分,水平拆分就是表行拆分。

分表

2.分库分表的常见情况

虽然一般不建议分库分表,但由于数据量达到一定时,严重影响了系统的性能,就需要进行分库分表,常见情况:

  • 单表的数据达到千万级,这个根据数据库定,oracle和mysql能支撑的数据量很明显不一致
  • 数据库中的数据太大,占用空间大,备份时间长
  • 应用的并发量太大

ps:分库分表代表着多余的资源开销,例如需要进行分片,多余的库资源管理等等,具有一定的成本,且可能导致一些功能的异常,需要进行适配。所以具体需不需要分库分表需要根据项目自身的性能需求而定


3.分片算法

分库分表后,需要涉及如何拆分。 垂直拆分更像是对表结构的优化,水平拆分是对数据的拆分。

水平拆分需要涉及分片算法。 即根据一定的规则将数据行进行拆分, 达到后续依旧能够快速定位数据行的目的,而不影响功能。

  • 哈希分片:根据哈希值分配表、库。对于随机读写场景比较适配,且能较好的均分数据。 但对于后续再新增哈希分片不够友好。
  • 范围分片:根据特定的范围区间来分配数据,比如id,时间等。对于拥有特定的范围数据有更好的适配场景,且新增分片也更简单。但可能热点数据分配不够均匀,导致单库单表压力勾过大。
  • 映射表分片:新增一个映射表。可以更好的进行数据切片和新增分片,足够的灵活。但是增加了新的开销和复杂度。
  • 一致性哈希分片:将哈希空间定义成环,顺时针查找最近的表/库。解决了传统哈希伸缩性不足的问题。
    • ps:对于一致性和不一致性哈希之间的区别简单理解为 不一致性哈希基于可变数求余,一致性哈希是基于不可变数求余。具体可参考如下链接,这位博主讲解的比较细致:https://www.51cto.com/article/700345.html
  • 地理位置分片:根据地理位置(如城市)来分配数据
  • 融合算法分片:灵活组合多种分片算法
  • ...等等


分片键如何选择?

分片键即分片算法的关键字段,表的每列都有可能成为分片键,但是好的分片键应具备以下特点:

  • 具有共性:能够覆盖绝大多数查询场景,尽量减少单词查询所涉及的分片数量
  • 具有离散型:能够将数据均匀地分散到各分片,避免数据倾斜和热点问题
  • 具有稳定性:分片键的值不会发生变化,避免一致性问题
  • 具有可拓展性:能够支持分片的动态增加和减少,避免重新分片开销

一般很难满足以上全部特点,需要适当权衡



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。