读写分离-分库分表
【摘要】 读写分离解决的并发读写压力的问题,数据库存储压力的问题如何解决?1.什么是分库分表?分为分库和分表,见名知意就是将张表分为多个表或者多个库进行存储。一般分为垂直和水平拆分。 垂直拆分就是列拆分,水平拆分就是表行拆分。2.分库分表的常见情况虽然一般不建议分库分表,但由于数据量达到一定时,严重影响了系统的性能,就需要进行分库分表,常见情况:单表的数据达到千万级,这个根据数据库定,oracle和m...
读写分离解决的并发读写压力的问题,数据库存储压力的问题如何解决?
1.什么是分库分表?
分为分库和分表,见名知意就是将张表分为多个表或者多个库进行存储。
一般分为垂直和水平拆分。 垂直拆分就是列拆分,水平拆分就是表行拆分。
2.分库分表的常见情况
虽然一般不建议分库分表,但由于数据量达到一定时,严重影响了系统的性能,就需要进行分库分表,常见情况:
- 单表的数据达到千万级,这个根据数据库定,oracle和mysql能支撑的数据量很明显不一致
- 数据库中的数据太大,占用空间大,备份时间长
- 应用的并发量太大
ps:分库分表代表着多余的资源开销,例如需要进行分片,多余的库资源管理等等,具有一定的成本,且可能导致一些功能的异常,需要进行适配。所以具体需不需要分库分表需要根据项目自身的性能需求而定。
3.分片算法
分库分表后,需要涉及如何拆分。 垂直拆分更像是对表结构的优化,水平拆分是对数据的拆分。
水平拆分需要涉及分片算法。 即根据一定的规则将数据行进行拆分, 达到后续依旧能够快速定位数据行的目的,而不影响功能。
- 哈希分片:根据哈希值分配表、库。对于随机读写场景比较适配,且能较好的均分数据。 但对于后续再新增哈希分片不够友好。
- 范围分片:根据特定的范围区间来分配数据,比如id,时间等。对于拥有特定的范围数据有更好的适配场景,且新增分片也更简单。但可能热点数据分配不够均匀,导致单库单表压力勾过大。
- 映射表分片:新增一个映射表。可以更好的进行数据切片和新增分片,足够的灵活。但是增加了新的开销和复杂度。
- 一致性哈希分片:将哈希空间定义成环,顺时针查找最近的表/库。解决了传统哈希伸缩性不足的问题。
- ps:对于一致性和不一致性哈希之间的区别简单理解为 不一致性哈希基于可变数求余,一致性哈希是基于不可变数求余。具体可参考如下链接,这位博主讲解的比较细致:https://www.51cto.com/article/700345.html
- 地理位置分片:根据地理位置(如城市)来分配数据
- 融合算法分片:灵活组合多种分片算法
- ...等等
分片键如何选择?
分片键即分片算法的关键字段,表的每列都有可能成为分片键,但是好的分片键应具备以下特点:
- 具有共性:能够覆盖绝大多数查询场景,尽量减少单词查询所涉及的分片数量
- 具有离散型:能够将数据均匀地分散到各分片,避免数据倾斜和热点问题
- 具有稳定性:分片键的值不会发生变化,避免一致性问题
- 具有可拓展性:能够支持分片的动态增加和减少,避免重新分片开销
一般很难满足以上全部特点,需要适当权衡
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)