首页 > 编程知识 正文

大表是否要分库,分库分表的几种实现形式

时间:2023-05-03 13:23:00 阅读:167325 作者:1356

一、为什么需要分库分表?

随着业务的发展,数据量不断增加,因此增加、删除、修改等数据操作的开销也越来越大。 基于单个数据库单表的设计已经不能满足存储需要,数据库随时都面临爆炸风险。

另外,物理服务器资源有限(CPU、磁盘、内存、IO等)。 最终数据库可承载的数据量、数据处理能力将成为瓶颈。

二、怎么解决?

1、增加存储只能暂时放宽,但可能是一个性价比较高的方案

2、数据实现动静态分离,定时备份末态数据,缓解存储压力

例:

热数据: 3个月内订单数据,查询实时性高; (mysql的按库分类的表)

冷数据A:3个月~ 12个月前的订单数据,咨询频率不高(es中) )。

冷数据b :一年前的订单数据几乎不被查询,只有偶尔的查询需求(hive ) )。

3、数据库表可以解决单表海量数据的查询性能问题,库表可以解决单数据库并发访问压力问题。 在某些情况下,这两个问题都需要考虑。 因此,为了扩展系统的并发处理能力,提高单表的查询性能,必须同时进行单表和库两种操作。 这就是要使用的库表。

三.分库分表的实现方案

分割的方法有两种。 一个是水平分割,另一个是垂直分割,分割表是分割数据库的解决方案。 通过在分区表的实现方案中实现分片逻辑,将分区表的实现方案分为客户端、代理分片、分布式数据库三大类

1、客户

客户端分片是使用分区表数据库的APP应用层直接对分片逻辑进行操作。 平铺规则必须在同一APP应用程序的多个模块中同步。 每个APP应用程序都有一个处理分片的内置逻辑实现,通常依赖于jar来实现。 具体的实现方法有三种。 一种方法是直接在APP应用层实现,另一种方法是在ORM框架中实现。 第三通过定制JDBC协议实现;

APP应用层实现:这是一种通用、简单的实现方式,通过直接在APP应用层读取片规则来实现路由逻辑,APP应用层自己决定访问其实例、其库、其表、其字段等体系结构如下。

该方案虽然入侵了业务,但实现起来比较简单,适合快速上手,出现问题也很容易调查。 目前,一些开源实现了dbsplit方案

实施ORM框架:

在ORM框架中进行定制,并通过框架的扩展机制实现分库表的逻辑。 目前,许多企业通过mybatis配置文件中SQL的表索引的参数实现切片;

mybatis实现了分区划分方式。

此方案也是推荐方案

JDBC协议实现:

我们定制实现了JDBC协议,为业务提供了JDBC的统一接口,业务方不需要相关分区表的实现,分区表规则在JDBC内部实现,对业务方透明

体系结构如下。

ShardingSphere-JDBC体系结构

由于此解决方案对业务透明且不入侵业务,因此开发人员可以最大限度地关注逻辑的实现,但开发人员必须了解并使用JDBC协议。 现在流行的框架:shardingsphere,前身是由sharding-jdbc由当开发的,现在交给了apahce

3359 github.com/Apache/incubator-shardingsphere

使用限制:

某些SQL语法不受支持,例如having、union、or、insertintovalues(V1,v2 )、(v3,v4 )和distinct )。 不支持子查询

2、代理瓷砖

代理层是在APP应用层和数据库层增加代理层,将切片规则配置在代理层的产物,代理层对外向APP应用层提供与JDBC兼容的接口,业务也不需要切片规则

该方案的优点是对业务透明,缺点是增加了网络代理,性能有损失;

3、分布式数据库

通过在DB内部实现分片化功能来实现分布式存储,对业务是透明的

体系结构如下。

的开源实现,阿里的OceanBase,开源的tidb和度小满nesiodb

四.个案研究

1、billing模块t_bill_record数据超过二千万条

水平分割,每周建立2年的表t_bill_record_yyyymmdd

新数据将根据当前时间进入相应的表中

根据查询数据时间宽度,合并查询的表数据

数据迁移(避免影响正在使用的表,如果有影响,每次处理1000行数据并执行commit,然后为insert/update/delete sleep 1秒)。 select时,每次查询2000行数据,之后sleep1秒)

2、亿级订单系统设计

以订单表为例,使用此字段作为shard key非常合适,因为订单表中的订单id一定不能重复。 其他表格也一样。

例:张order表分为10个数据库,每个数据库有100个表

中间变量=shard_key /(库数*单个库的表数) ) ) ) ) ) ) ) ) ) ) ) )。

库编号=四舍五入(中间变量/单个库的表数) )

表格编号=中间变量%单个数据库的表格数、

如果shard_key不是整数类型,则表示hash先进行了取模,

例如,hash(shard_key ) %数据库容量

数据迁移(双写入迁移方案)

在联机系统中,在以前编写库的所有位置,添加/删除操作都是所谓的双写操作,不仅包括对旧库的添加/删除操作,还包括对新库的添加/删除操作。 就是同时写两个库(旧库和新库)

同时启动作业,将旧库的数据同步到新库,数据完全匹配后,将所有操作联机到新库服务器

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。