当前位置: 首页 > article >正文

关系型数据库分库分表、水平分和垂直分、客户端实现路由和proxy实现路由

分库分表:

分库 

是将数据拆分到多个数据库实例中的技术。每个数据库实例存储部分数据,以减少单个数据库的负载。分库通常用于大规模分布式系统中,以提高系统的扩展性和性能。

分库后的问题:

1.为了性能考虑,分库一般是值将表分到不同的物理机上,这样就没办法跨库查询(如果是一个server上的多个database,部分数据库产品支持跨库联合查,放到一个server上对性能提升不大)

2.事务问题:数据库事务是基于连接的,不同的库不能使用数据库事务。

分表

是将一个大表拆分为多个小表的技术。每个小表存储部分数据,以减少单个表的负载。分表可以在同一个数据库中,也可以在多个数据库中。

分表后的问题:

1.分表不分库:不能实聚合合查询,虽然理论可以用union来实现查询,但是索引会失效,union方案实际应用中根本行不通。

2.分库+分表:不能实聚合合查询,union也用不了。

水平分和垂直分

数据库只有垂直分:比如用户一个单独库, 订单一个单独库。

表-垂直分: 用户表可以根据字段垂直分成多个表,比如用户有ID、姓名、性别、个人介绍等,个人介绍是text类型的,那么为了性能我们可以把个人介绍等大字段单独分到子表里去。

表-水平分:根据某个字段按照某个规则水平分,假如用户表ID是自增的,那么可以100W分一张表。

分库分表带来的技术挑战:

分布式事务问题

在进行复杂操作时,如用户同时领取多张优惠券,可能涉及多个表的分片属性不一致,导致无法在同一数据库内完成事务操作。这种情况使得数据一致性受到威胁,最终业务侧可能不得不做出妥协,采用最终一致性解决方案。然而,这通常意味着牺牲了一部分实时性,以满足系统的整体性能和稳定性需求。

索引查询能力下降

分库分表后,查询特定条件下的数据可能变得复杂。例如,在电商系统中,若订单表基于用户ID分库分表,查询特定商家在特定时间内的所有订单将变得困难。这是因为查询需要跨多个数据库或数据表进行,增加了查询的时间和成本。使用异构数据库或依赖ElasticSearch等工具虽然可以解决部分问题,但可能导致数据一致性降低和系统复杂性增加。

全局主键和唯一约束问题

传统的MySQL自增ID在分库分表后难以满足应用需求。因为自增ID只能保证在单个数据库实例内的唯一性,而无法保证在多个数据库实例间的全局唯一性。因此,必须借助分布式ID生成器,如UUID或雪花算法来生成全局唯一ID。这不仅增加了维护工作,还进一步提升了架构复杂性。

扩容问题

随着业务的发展,系统需要不断扩容。然而,一旦决定实施分库分表,扩容将面临重大挑战。扩容过程往往伴随着系统停机和数据迁移,给业务带来不小的影响。此外,扩容还需要考虑数据的重新分布和分片规则的调整等问题,进一步增加了扩容的复杂性和风险。

运维难度增加

分库分表后,系统的数据库实例数量将大幅增加。这导致企业的运维成本上升,DBA团队面临巨大的压力。他们需要管理数十个甚至上百个数据库实例,并确保这些实例的稳定性和性能。此外,复杂的架构决策也增加了系统维护和故障排查的难度。

业务变更难度大

由于分库分表增加了系统的复杂度,当表结构变更时,需要对所有分片进行修改和调整。这增加了业务变更的难度和风险,可能导致系统不稳定或数据不一致等问题。

数据迁移成本高

在分库分表的场景下,数据的迁移成本很高。迁移过程中需要涉及数据的拆分、合并和迁移等环节,增加了数据迁移的难度和成本。此外,迁移过程中还需要确保数据的一致性和完整性,避免数据丢失或损坏。

分库分表后数据路由定位方案:

分库分表后数据库基本上会丧失了复杂的聚合(联机分析OLAP)查询能力,这个需要用ES 、hadoop等大数据相关技术来解决。

分库分表后基本上数据库就只保留了对单条数据的增删查改能力(联机事务OLTP),单条数据的增删查改就需要对数据的路由定位,技术上有两种方案:

a. 客户端代码里直接路由

b. 增加代理server ,由代理server来完成下游数据库的路由转发,客户端都连代理server. 

客户端路由proxy server
实现复杂性高,需要在客户端实现和维护路由逻辑低,路由逻辑集中在代理层
灵活性高,可以根据业务需求灵活调整中等,由代理层决定,灵活性有限
性能高,没有额外的代理开销中等,存在代理层的网络和处理开销
一致性管理较难,需要同步更新所有客户端容易,由代理层集中管理
连接管理复杂,客户端需管理多个数据库连接简单,代理层统一管理数据库连接
单点故障无单点故障代理层可能成为单点故障
扩展性高,客户端独立扩展高,代理层可水平扩展
开发维护成本实现client 路由逻辑相对简单实现一个proxy server 非常复杂的,需要sql解析,上下游数据转发;尤其性能和稳定性挑战非常大

分库分表开源方案:

方案有很多种,这里先列举2个:

1. Apache ShardingSphere

简介:Apache ShardingSphere 是一个开源的分布式数据库中间件,支持分库分表、读写分离和数据加密等功能。

特点

  • 支持多种分片策略(范围分片、哈希分片、复合分片等)。
  • 支持分布式事务。
  • 支持弹性扩展和数据治理。
  • 提供 JDBC 和代理两种模式。

2. Vitess

简介:Vitess 是一个开源的分布式数据库解决方案,最初由 YouTube 开发,旨在解决大规模 MySQL 集群管理问题 ,代理模式。

特点

  • 支持分库分表和读写分离。
  • 支持自动分片和分片重平衡。
  • 提供强大的监控和管理工具。

http://www.kler.cn/a/450051.html

相关文章:

  • 性能优化!突破性能瓶颈的尖兵CPU Cache
  • sqoop的参数有哪些?
  • 数据库系统原理:数据恢复与备份策略
  • 浅谈算法交易
  • taiwindcss
  • GitLab的安装与卸载
  • linux升级git版本
  • 《开启微服务之旅:Spring Boot Web开发举例》(一)
  • 拦截器魔法:Spring MVC中的防重放守护者
  • VSCode 插件开发实战(五):实现新语言支持和语法高亮
  • JavaEE进阶--mybatis使用测试日志参数传递浏览器访问
  • WPF 最小化到系统托盘
  • Vue3入门(7)
  • SQL语句整理五-StarRocks
  • 后端项目java中字符串、集合、日期时间常用方法
  • Strip Map和Wafer Map的一些小科普
  • Android修行手册 - 移动端几种常用动画方案对比
  • LLMs之PDF:MinerU(将PDF文件转换成Markdown和JSON格式)的简介、安装和使用方法、案例应用之详细攻略
  • Mac iOS、Android、Flutter、React Native开发环境配置
  • 【专题】2024抖音电商母婴行业分析报告汇总PDF洞察(附原数据表)
  • 【ArcGIS Pro】实现一下完美的坐标点标注
  • “年轻科技旗舰”爱玛A7 Plus正式发布,全国售价4999元
  • 【人工智能】探索当下热门视频生成模型
  • Elasticsearch:确保业务规则与语义搜索无缝协作
  • 项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(二)
  • MySQL数据库——复制表数据与结构