分库分表解决方案和数据库分片中常见的问题及其解决方案

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
可观测监控 Prometheus 版,每月50GB免费额度
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: 分库分表解决方案和数据库分片中常见的问题及其解决方案

@[toc]

分库分表解决方案和数据库分片中常见的问题及其解决方案


1、分库分表形式


水平分库
建立结构一样的库,根据分库方案划分数据到不同库

水平分表
建立多个表,根据分表方案划分数据到不同表

垂直分库
根据业务模块,把一组表划分为一个库

垂直分表
根据字段的活跃性,把字段组拆分到不同的表中

2、分库分表解决方案


分库分表工具(轻量级)
1、sharding-sphere :jar 包,前身是 sharding-jdbc (当当)
2、TSharding : 蘑菇街的中间件

分库分表工具(重量级)
1、Mycat : 中间件产品,基于开源的 cobar 开发
2、TDDL Smart Client : jar 包,Taobao Distribute Data Layer
3、Atlas : 奇虎 360
4、alibaba.cobar : 阿里 B2B 部门开发
5、Oceanus : 58 同城的数据库中间件
6、OneProxy : 支付宝首席架构师楼方鑫开发
7、vitess : 谷歌开发的数据库中间件

分表规则
1、Hash
2、Range

3、分库分表中存在的问题


1、事务问题
    方案一:使用分布式事务
        优点:交由数据库管理,简单有效
        缺点:性能代价高,特别是shard越来越多时
    方案二:由应用程序和数据库共同控制
        原理:将一个跨多个数据库的分布式事务分拆成多个仅处 于单个数据库上面的小事务,并通过应用程序来总控 各个小事务。
        优点:性能上有优势
        缺点:需要应用程序在事务控制上做灵活设计。如果使用 了spring的事务管理,改动起来会面临一定的困难。

2、跨节点的 Join 问题
    只要是进行切分,跨节点 Join 的问题是不可避免的。但是良好的设计和切分却可以减少此类情况的发生。解决这一问题的普遍做法是分两次查询实现。
    在第一次查询的结果集中找出关联数据的id,根据这些id发起第二次请求得到关联数据。

3、跨节点聚合问题
    比如 count、order by、group by 等聚合函数问题,方案是各节点完成计算后,交由业务层进行合并
    多节点的查询可以是并行的,因此大多数情况他比单一大表快很多,但是如果结果集很大,可能会导致内存消耗过高

4、数据迁移,容量规划,扩容等问题
    这些问题目前都没有特别好的解决方案,每个方案都或多或少的有一些问题存在,因此这个问题的解决难度其实挺高的

5、ID 问题
    数据被切分后,就不能依赖数据库的自增 ID 进行赋值,另外 ID 还需要承担携带路由信息的功能,以降低查询难度
    一种方案是使用 UUID ,但是 UUID 比较长会占用较多的存储空间,另外一方面,UUID 对索引不友好
    一种方案是通过维护一个 ID 签发表来对 ID 进行签发,但是这会导致插入需要增加一次查询,且该表容易成为性能瓶颈存在单点故障问题
    一种方案是使用雪花算法进行 ID 的下发

6、跨分片的排序问题
    如果排序字段是分片字段,则可以直接使用分片排序
    如果排序字段不是分片字段,则需要先在分片上进行排序,然后到业务系统进行合并,然后再排序

7、分库策略、分库数量
    这个需要根据实际的业务场景,进行合理的分配,否则容易给后期造成很大的问题

4、总结


1、分库分表,首先要知道数据库的瓶颈在哪里,才能给出合理的方案
2、对于 Key 的选择很重要,要考虑数据拆分均匀,也要考虑非 partition key 的查询
3、满足要求的情况下,划分规则越简单越好

相关文章
|
1月前
|
关系型数据库 MySQL Java
【IDEA】java后台操作mysql数据库驱动常见错误解决方案
【IDEA】java后台操作mysql数据库驱动常见错误解决方案
61 0
|
1月前
|
数据库
数据库创建之主文件不能容纳副本的解决方案
数据库创建之主文件不能容纳副本的解决方案
32 1
|
3月前
|
运维 数据库 数据库管理
云数据库问题之阿里云在运营商领域数据库替换的整体解决方案要如何实现
云数据库问题之阿里云在运营商领域数据库替换的整体解决方案要如何实现
|
3月前
|
存储 负载均衡 安全
高效管理大型数据库:分片与复制的策略与实践
在当今数据驱动的世界中,管理和优化大型数据库系统是每个企业的关键任务。特别是在面对数据量迅速增长的情况下,如何确保系统的高可用性和性能成为重要挑战。本文探讨了两种核心技术——分片(Sharding)和复制(Replication),以及它们在实际应用中的策略与实践。通过对比这两种技术的优缺点,并结合具体案例分析,本文旨在为数据库管理员和开发者提供一套高效管理大型数据库的综合方案。
|
3月前
|
关系型数据库 MySQL 数据库
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
|
14天前
|
算法 安全 数据库
数据库死锁的解决方案有哪些?
【10月更文挑战第28天】数据库死锁是数据库管理中的一个常见问题
44 15
|
21天前
|
关系型数据库 MySQL 数据库
一个 MySQL 数据库死锁的案例和解决方案
本文介绍了一个 MySQL 数据库死锁的案例和解决方案。
33 3
|
2月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
397 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
1月前
|
NoSQL 数据管理 关系型数据库
利用阿里云的尖端数据库解决方案增强游戏数据管理
利用阿里云的尖端数据库解决方案增强游戏数据管理
|
1月前
|
SQL 数据库
SQL-serve数据库不能连接本地服务器的解决方案
SQL-serve数据库不能连接本地服务器的解决方案
170 0