分库分表和数据库分片方案

分库分表和数据库分片方案

数据库数据量达到千万级别时查询效率会很低,分库分表是一种很有效的解决方案。

垂直划分和水平划分

垂直划分:垂直划分又分为垂直分库和垂直分表两种,垂直分库就是将关联度低的各种表放在不同的数据库中,垂直分表是针对表的列进行的,将字段拆到其他表中形成新表,这样表的记录就会变小,索引就会降低空间消耗,提升性能。垂直划分业务逻辑清晰便于管理,提升高并发性能,但是表无法连接查询,涉及分布式事务技术,且不能从本质上减少表的大数据量,还需要借助水平划分。

水平划分:分为分库分表和库内分表,库内分表由于还是共用cpu和IO提升不明显,将表的记录按照一定的逻辑分散到多个数据库多个表中,水平划分彻底解决了大表问题,但还是存在连接查询不方便,需要引入分布式事务等缺点。

水平划分的数据分片规则主要有两种:首先是根据不同的时间分库,比如每一天的数据生成一个数据库,或者冷热数据分离,根据数据查询的频率分库,其次是根据某个字段计算hash值来划分,但容易面临复杂的查询问题,如果查询语句中不涉及该字段将导致无法直接定位到数据库。

分库分表带来的问题

1、分布式事务:跨库事务操作,分布式事务需要协调多个节点,延长了事务的执行时间,并发访问发生冲突和死锁的概率增高,对事务一致性要求不高的系统可以不苛求实时一致性,而追求最终一致性即可,也就是事务补偿:对数据检查,日志对比等。

(分布式事务产生的原因可能是因为分库分表,也可能是因为应用SOA化)

2、连接查询问题

解决方案有:使用全局表(将各模块都有可能依赖的表在每个数据库都保存一份)、字段冗余(一种反范式设计,根据连接查询业务将要连接查询的信息加入表中)、数据组装(将连接查询拆分成两次)、将关联的表放在一起、频繁的连接查询可以建立对应的映射表

复杂的查询还可能用到基因法:

假如要用name查id但是不知道id在哪个库中,可以让name在设计时就跟随一个标记,可以根据这个标记或者标记计算出来的hash值直接拿到id所在的库位置

3、跨节点分页、排序、函数

都要在各自的表中执行一遍,然后将结果汇总起来再执行一遍

4、全局主键避重问题

可以用uuid(生成一个32个16进制数字)、用一个特殊的表生成主键(设置成自增,每次取出这个值)、建立多个ID生成服务器(第一个产生1、3/5、。。。第二个2/4/6.。)、还可以利用缓存(每次只通过表生成一个ID,然后将ID拓展多个值放在内存中等待取用,然后取用完毕继续生成)、根据实际业务设计一个根据时间生成的字符串(精确到毫秒位,每一个毫秒再设计1000个独立数)

5、数据扩容和迁徙

如果是根据主键范围分库的话,扩容很简单,如果是哈希取模分片,那就要用到一致性hash

分片方案

数据库分片的逻辑可以封装在应用端的持久层,也可以在应用和数据之间加一层代理,在中间件中维护分片逻辑。

原文地址:https://www.cnblogs.com/shizhuoping/p/11563948.html

时间: 2024-08-29 13:07:49

分库分表和数据库分片方案的相关文章

架构组件:基于Shard-Jdbc分库分表,数据库扩容方案

一.数据库扩容 1.业务场景 互联网项目中有很多"数据量大,业务复杂度高,需要分库分表"的业务场景. 这样分层的架构 (1)上层是业务层biz,实现业务逻辑封装: (2)中间是服务层service,封装数据访问: (3)下层是数据层db,存储业务数据: 2.扩容场景和问题 当数据量持续新增,面临着这样一些需求,两台数据库无法容纳,需要数据库扩容,这里选择2台-扩容到3台的模式,如下图: 这样扩容的问题 (1)分库分表的策略导致数据迁移量大: (2)影响数据的持续服务性: (3)指定时间

【分库分表】sharding-jdbc—分片策略

一.分片策略 Sharding-JDBC认为对于分片策略存有两种维度: 数据源分片策略(DatabaseShardingStrategy):数据被分配的目标数据源 表分片策略(TableShardingStrategy):数据被分配的目标表 两种分片策略API完全相同,但是表分片策略是依赖于数据源分片策略的(即:先分库然后才有分表) 二.分片算法 Sharding分片策略继承自ShardingStrategy,提供了5种分片策略: 由于分片算法和业务实现紧密相关,因此Sharding-JDBC并

分库分表增加数据库读写性能

三种方式: 1.垂直拆分 2.水平拆分 3.混合1.2 查询逻辑: 添加逻辑: 数据库集群可用mycat 1.http://blog.csdn.net/wangfanbb/article/details/50887108 2.http://blog.csdn.net/jiazibo/article/details/54136599 3.http://blog.csdn.net/bluishglc/article/details/7696085 4.http://blog.csdn.net/zjc

09 | 数据库优化方案(二):写入数据量增加时,如何实现分库分表?

数据库的写入请求量大造成的性能和可用性方面的问题,要解决这些问题,你所采取的措施就是对数据进行分片.这样可以很好地分摊数据库的读写压力,也可以突破单机的存储瓶颈,而常见的一种方式是对数据库做“分库分表”. 数据库分库分表的方式有两种:一种是垂直拆分,另一种是水平拆分.这两种方式,在我看来,掌握拆分方式是关键,理解拆分原理是内核.所以你在学习时,最好可以结合自身业务来思考. 垂直拆分的原则一般是按照业务类型来拆分,核心思想是专库专用,将业务耦合度比较高的表拆分到单独的库中.举个形象的例子,就是在整

记录一次经历的数据库从单库到分库分表的过程

前言 目前所在的的项目组,由于项目正在处于一个业务爆发期,每天数据的增长量已经给我们数据库乃至系统造成了很多不确定的因数,前期依靠优化业务和SQL等方式暂时还能够支撑住.但是最近发现某些表数据达到500W+以后查询统计性能严重下降,高峰时段出现了很多SQL阻塞的情况例如: 这种阻塞带来的灾难是滚雪球的,由于越堆越多基本上把数据库已经拖死,所以我们就面临数据库切分的问题. 技术选型 既然要分库分表那数据库集群是少不了的,那我们的项目怎样和这些集群打交道呢?我调研了大概分为以下几种来完成这个功能(仅

【干货】数据库分库分表基础和实践

数据库架构的演变在业务数据量比较少的时代,我们使用单机数据库就能满足业务使用,随着业务请求量越来越多,数据库中的数据量快速增加,这时单机数据库已经不能满足业务的性能要求,数据库主从复制架构随之应运而生. 主从复制是将数据库写操作和读操作进行分离,使用多个只读实例(slaver replication)负责处理读请求,主实例(master)负责处理写请求,只读实例通过复制主实例的数据来保持与主实例的数据一致性.由于只读实例可以水平扩展,所以更多的读请求不成问题,随着云计算.大数据时代的到来,事情并

数据库-数据库设计-分库分表

为什么要分库分表 分库分表的设计 带来的问题 扩容 分布式事务 多个路由字段怎么设置 关于分库分表最全的一篇文章 这里介绍设计分库分表框架时应该考虑的设计要点,并给出相应的解决方案. 一.整体的切分方式 简单来说,数据的切分就是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果,即分库分表. 数据的切分根据其切分规则的类型,可以分为如下两种切分模式. 垂直(纵向)切分:把单一的表拆分成多个表,并分散到不同的数据库(主机)上. 水平(横

mysql数据库分库分表shardingjdbc

分库分表理解 分库分表应用于互联网的两个场景;大量数据和高并发,通常策略有两种:垂直分库,水平拆分 垂直拆分:是根据业务将一个库拆分为多个库,将一个表拆分为多个表,例如:将不常用的字段和经常访问的字段分开存放,在实际开发由于跟业务关系紧密,所以一般采用水平拆分. 水平拆分:则是根据分片算法讲一个库拆分为多个库,来进行维护,与垂直拆分不同,水平拆分是按照一定的规则进行拆分,将不同的数据拆分至不同的物理库. 关系型数据库在大于一定数据量的情况下检索性能会急剧下降.在面对互联网海量数据情况时,所有数据

数据库为什么要分库分表

1 基本思想之什么是分库分表?从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上.2 基本思想之为什么要分库分表? 数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大:另外,由于无法进行分布式式部署,而一台服务器的资源(CPU.磁盘.内存.IO等)是有限的,最终数据库所能承载的数据量.数据处理能力都将遭遇瓶颈.3 分库分