数据库分片原则和算法

1. 数据分片概念

        数据库分片是指将一个大型数据库拆分成多个小型数据库,每个小型数据库称为一个分片。通过这种方式,可以将数据库的负载分散到多个服务器上,从而提升性能瓶颈以及可用性。

        数据分片的核心手段就是对关系型数据库进行分库和分表。分库和分表均可以有效的避免由数据量超过可承受阈值而产生的查询瓶颈。除此之外,分库还能够用于有效的分散对数据节点单点的访问(你想想看,查订单的去订单节点查,查用户的去用户节点去查)。

        分表虽然无法缓解数据节点的压力,但却能够提供尽量将分布式事务变为本地事务来处理,一旦涉及到跨库的更新操作,分布式事务往往会使问题变得复杂(比如用户下订单时,扣积分、减库存就够你喝一壶了)。

        使用主从的分片方式,可以有效的避免数据单点,从而提升数据架构的可用性(更新操作去主节点,查询操作去从节点)。

        通过分库和分表进行数据的拆分来使得各个表的数据量保持在阈值以下,以及对流量进行疏导应对高访问量,是应对高并发和海量数据系统的有效手段。

什么情况下应该使用分片?

        是否应该实现分片数据库架构,几乎总是一个争论的问题。有些人认为分片对于达到一定规模的数据库来说,是不可避免的结果。而另一些人则认为这是一个令人头疼的问题,除非绝对必要,否则应该避免,因为分片增加了操作的复杂性。

  • (1)处理大规模数据: 数据量的快速增长是现代应用的常见情况。当数据量达到单个服务器的容量限制时,分片可以帮助应用处理大规模的数据,并将数据分布在多个节点上,充分利用集群的资源。
  • (2)提高读写性能: 分片可以将负载分散到多个节点上,从而提高数据库的读写性能。每个分片独立处理一部分数据,减轻了单个节点的负担,并允许并行处理查询和事务。

(3)增加可扩展性: 分片允许根据需求扩展数据库的容量和吞吐量。当数据量增加时,可以简单地增加更多的分片节点,而不是升级单个节点的硬件或软件。

(4)减少单点故障: 通过将数据分布在多个节点上,分片可以减少单个节点故障对整个系统的影响。如果一个节点发生故障,其他节点仍然可用,从而保证了系统的可用性和容错性。

5)提供地理位置灵活性: 分片使得数据可以根据地理位置进行存储。这可以帮助应用满足数据存储的合规性要求,并降低数据访问的延迟。

2.1分片原则

2.1.1垂直分片

1、原理

        按照业务拆分的方式叫做垂直分片,又叫做纵向拆分,就是专库专用的意思(有点像公司各个部门的意思,各司其职)。拆分之前,一个数据节点由多个业务表构成,每个表存储着不同的业务数据。而拆分之后,我们把表按照业务进行归类,分布到不同的数居节点中,从而将压力分散至不同的数据节点。比如与用户相关的放到用户库,订单相关的放到订单库。

​        垂直分片需要对架构和设计进行调整。通常来讲,是来不及应对互联网业务需求快速变化的(例如双十一订单量突然增大);而且,它也无法真正地解决单点瓶颈。垂直拆分可以缓解数据量和访问量带来的问题,但无法根治。如果垂直拆分之后,表中的数据量依然超过单节点所能承载的阈值,则需要水平分片来进一步处理。

2、特点

(1)每个库(表)的结构都不一样;

(2)每个库(表)的数据至少有一列一样(分库或分表后至少有一个字段一样以将多个库或表关联起来);

(3)每个库(表)的并集是全量数据;

3、优点

(1)拆分后业务清晰(转库专用按业务拆分);

(2)实现动静分离、冷热数据分离设计体现。冷库是指访问较少的数据;热库是指访问较多的数据。

(3)数据维护简单,按业务不同放到不同机器上。

4、缺点

(1)无法很好的应对业务需求快速变化的情况;

(2)部分业务无法关联,存在跨库查询问题。

2.1.2水平分片

1、原理

        水平分片又叫做横向拆分(就像一个公司会在不同的城市设置不同的分公司去处理日常工作)。相对于垂直分片,它不再将数据根据业务逻辑归类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个节点或表中,每个分片仅包含数据的一部分。例如:根据主键分片,偶数主键的记录放入0库(或表),奇数主键的记录放入1库(或表)。

        水平分片从理论上突破了单机数据量处理的瓶颈,并且扩展相对自由,是分库分表的标准解决方案。

2、特点

(1)每个库(表)的原理都一样;

(2)每个库(表)的数据都不一样;

(3)每个库(表)的并集是全量数据;

3、优点

(1)单库(表)的数据保持在一定的量,有助于性能提高;

(2)提高了系统的稳定性和负载能力;

(3)拆分的库(表)的结构相同,程序改造较少;

4、缺点

(1)数据的扩容很有难度维护量大,拆分规则很难抽象出来;

2.1.3数据分片引发问题

        面对散乱的分库分表之后的数据,开发工程师和数据库管理员对数据库的操作变得复杂就是其中的重要挑战之一。他们需要知道数据需要从哪个具体的数据库的哪个表中获取。你想想看,原来我们都在同一个地方办公,你想叫张三、李四都很容易,但现在大家都分派在天南海北,交流起来就不方便。

(1)数据聚合

        能够正确地运行在单节点数据库中的SQL,在分片之后的数据库中并并不一定能够正确运行。例如,分表导致表名称的修改,或者分页、排序、聚合分组等操作的不正确处理,比如,我们想查询订单表的前10条数据,以前只要一条SQL语句搞定,现在分到不同的数据节点,这时再想分页查询会让你崩溃。

(2)分布式事务

        采用分表策略,在降低一个表数据量的情况下,尽量使用本地事务,因为都在一个数据节点下就可以避免跨库事务的问题。

        在不能避免跨库事务的场景中,有些业务还是要保证事务的一致性,基于XA分布式事务在高并发的场景中性能无法满足需要,大多采用最终一致性的柔性事务代替强一致事务。

 2.2分片中间件

2.2.1 jdbc应用层分片

相比proxy性能更强,但其把语言限制在只能使用java,导致局限性很大。

1、sharding-jdbc(shardingsphere)

2.2.2 proxy代理层分片

没有语言限制!

1、mycat

2、mysql-proxy

2.3分片算法

2.3.1 range

思路:以用户中心的业务主键uid为划分依据,将数据水平切分到两个数据库实例上去:

        db_1:存储0到1千万的uid数据;

        db_2:存储1千万到2千万的uid数据;

(1)range算法的优点

  • 切分策略简单,根据id,按照范围,业务很快能够定位到数据在哪个库上;
  • 扩容简单,如果容量不够,只要增加db_3即可;

(2)range算法的不足

  • id必须要满足递增的特性;
  • 数据量不均,新增的db_3,在初期的数据会比较少;
  • 请求量不均,一般来说,新注册的用户活跃度会比较高,故db_2往往会比db_1负载要高,导致服务器利用率不平衡;

2.3.2 hash

思路:以用户中心的业务主键uid为划分依据,将数据水平切分到两个数据库实例上去:

        db_1:存储id取模得1的id数据;

        db_0:存储id取模得0的id数据;

(1)hash算法的优点

  • 切分策略简单,根据uid,按照hash,业务很快能够定位到数据在哪个库上;
  • 数据量均衡,只要uid是均匀的,数据在各个库上的分布一定是均衡的;
  • 请求量均衡,只要uid是均匀的,负载在各个库上的分布一定是均衡的;

(2)hash算法的不足

  • 扩容麻烦,如果容量不够,要增加一个库,重新hash可能会导致数据迁移,如何平滑的进行数据迁移,是一个需要解决的问题;

2.3.3索引表

思路:id能直接定位到库,数据不能直接定位到库,如果通过id能查询到db,问题解决;

解决方案

(1)建立一个索引表记录id ->db的映射关系;

(2)用id来访问时,先通过索引表查询到id,再定位相应的库;

(3)索引表属性较少,可以容纳非常多数据,一般不需要分库;

(4)如果数据量过大,可以通过id来分库;

优点:节点扩容无影响;

潜在不足:多一次数据库查询,性能下降一倍;

2.4实现分片

        开启分片(Sharding)涉及多个方面,包括数据库架构设计、部署配置和应用程序的更改。下面是一般情况下开启分片的步骤:

(1)设计分片策略: 首先需要确定适合应用的分片策略,如基于范围、哈希或列表等方式。根据应用的需求和数据特点选择合适的分片策略,并考虑分片键的选择。

(2)数据库架构设计: 根据分片策略设计数据库的整体架构。确定分片的数量和节点规模,以及分片之间的数据关联方式和数据路由规则。

(3)物理服务器部署: 根据数据库架构设计,部署和配置物理服务器。每个分片应该分配给独立的物理节点或服务器,确保每个节点有足够的计算和存储资源。

(4)数据库分片初始化: 在每个分片节点上创建数据库实例,并根据分片策略进行初始化。创建相应的表结构、索引和约束等,确保每个分片节点的数据库结构一致。

(5)数据迁移: 将现有的数据迁移到分片集群中。根据分片策略将数据拆分并导入到各个分片中,保证数据的一致性和完整性。这可能涉及数据导出、转换和导入的过程。

(6)应用程序更改: 修改应用程序代码,使其能够适应分片架构。更新数据库连接配置,确保应用程序能够正确地路由和访问各个分片。此外,还需要修改查询语句、事务处理和数据访问逻辑,以适应分片环境。

(7)负载均衡和路由配置: 配置负载均衡和路由机制,确保请求在分片集群中均匀分布。这可以通过负载均衡器或代理来实现,将请求路由到相应的分片节点。

(8)测试和监控: 对分片环境进行全面测试,确保分片策略的正确性和性能表现。设置监控系统,实时监测各个分片节点的运行状态和性能指标。

需要注意的是,开启分片是一个复杂的过程,需要综合考虑应用需求、数据特点和系统架构。在进行分片之前,建议进行充分的规划和评估,确保分片的正确实施和运维。同时,还需要考虑数据迁移的复杂性和系统升级的挑战。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
关于java程序员发展需要学习的路线整理集合 技术 应用技术 计算机基础知识 cpu mem disk net 线程,进程 第三方库 poi Jsoup zxing Gson 数据结构 树 栈 链表 队列 图 操作系统 linux 代码控制 自动化代码检查 sonar 代码规范 阿里巴巴Java开发规范手册 UMPAY——编码规范 日志规范 异常规范 网络 协议 TCP/IP HTTP hession file HTTPS 负载均衡 容器 JBOSS tomcat resin jetty 容灾 日志框架 开源框架 slf4j 框架实现 log4j logback commong logging jdk logger 测试框架 测试框架 junit easymock testng mockito bug管理 禅道 jira 开发工具 编程工具 eclipse myeclipse idea vi VS webstorm sublime text 版本控制 svn git 项目管理 maven Nexus Jenkins 工作软件 反编译软件 office系列 下载器 adobe系列 记录软件 思维导图 office--Note 邮件管理 性能优化 分层优化 系统级别 中间件级别 JVM级别 代码级别 分段优化 前端 web应用 服务应用 资源池 数据库 大数据与nosql zookeeper hadoop hbase mongodb strom spark java语言 语言语法基础 异常 泛型 内部类 反射 序列化 nIo 匿名类 包装类 优先级 引用 语言工具类库 容器类 集合 链表 map 工具类 系统类 日期类 数字类 字符串+正则 流 字符流 字节流 语言特性 继承 封装 多态 JVM 多线程与并发 GC机制 GC收集器类型 串行 CMS 并行 G1 算法 复制 标记清理 标记整理 分区 新生代 eden survivor 老年代(old区) 永久代(perm区) 版本变化 1.5 1.6 1.7 1.8 1.9 IO/NIO IO类型 同步阻塞 同步非阻塞 基于信号 多路复用 异步IO 类加载机制 双亲委派 OSGI 算法 搜索 二分 排序 选择 冒泡 插入 快速 归并 堆 桶 基数 常用算法 贪婪 回溯 剪枝 动态规划 数据挖掘算法 KMP算法 GZZ算法 HASH分桶 关联规则算法 APRORIVE算法 分布式 负载均衡 水平伸缩 集群 分片 Key-hash 异步 一致性hash 消峰 分库分表 锁 悲观锁 乐观锁 行级锁 分布式锁 分区排队 一致性 一致性算法 paxos zab nwr raft gossip 柔性事务(TCC) 一致性原理 CAP BASE 中间件 数据库 mysql 存储引擎 索引 锁 oracle db2 缓存 redis 数据结构 持久 复制 cas 单线程 memcache eacache Tair 消息队列 jms Queue Topic kafka 持久 复制 Stream Partition rocketMQ RabbitMQ ActiveMQ 常用开源框架 Spring Spring MVC Spring WebFlow spring tx aop ioc Struts ibatis Mybatis CAS Dubbo 工作能力 软实力 应急能力 创新能力 管理能力 分享能力 学习能力 沟通能力 解决问题能力 经历 技术攻关案例 程序开发案例 程序设计案例 设计 设计原则 单一职责原则 开闭原则 里氏替换原则 依赖倒转原则 接口隔离原则 迪米特原则 设计模式 结构模式 适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 创建模式 抽象工厂模式 工厂方法模式 建造这模式 原型模式 单例模式 行为模式 责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板方法模式 访问者模式 设计案例 UML 架构 系统架构能力 基本理论 扩展性设计 可用性设计 可靠性设计 一致性设计 负载均衡设计 过载保护设计 协议设计 二进制协议 文本协议 接入层架构设计 DNS轮询 动静态分离 静态化 反向代理 LVS F5 CDN 逻辑层架构设计 连接池 串行化技术 影子Master架构 批量写入 配置中心 去中心化 通讯机制 同步 RPC RMI 异步 MQ Cron 数据层架构设计 缓存优化 DAO&ORM; 双主架构 主从同步 读写分离 性能优化架构能力 代码级别 关联代码优化 cache对其 分支预测 copy on write 内联优化 系统优化 cache 延迟计算 数据预读 异步 轮询与通知 内存池 模块化 工程架构能力 开发语言 运维与监控 监控 系统监控 日志监控 流量监控 接口监控 数据库监控 业务监控 性能监控 告警 日志 设计模式 数据结构与算法 各种工具
1. 填空 分布式数据库系统按局部数据库管理系统的数据模型分类,可以分为 和 两类。 同构型DDBS 异构型DDBS 分布式数据库系统按全避控制系统类型分类,可以分为 、 和 三类。 全局控制集中型DDBS 全局控制分散型DDBS 全局控制可变型DDBS 分布式数据库是分布式数据库系统中各站点上数据库的逻辑集合,它由 和 组成。 应用数据库 描述数据库 数据分片的三种基本方法是: 、 和 三类。 水平分片 垂直分片 混合分片 分布式数据库中的数据分布策略有: 、 、 和 四层。 集中式 分割式 复制式 混合式 分布式数据库是多层模式结构,一般划分为 、 、 和 四层。 全局外层 全局概念层 局部概念层 局部内层 一个分布式数据库管理系统一般应包括 、 、 和 四个基本功能模块。 查询处理模块 完整性处理模块 调度处理模块 可靠性处理模块 分布透明性包括 、 和 三个层次。 分片透明性 位置透明性 局部数据模型透明性 分布式数据库系统的创建方法,大致可分为 和 两种。 组合法 重构法 集中式数据库设计一般包括:需求分析,概念设计,逻辑设计和物理设计四个阶段,分 布式数据库设计除了上述四个阶段外,还需增加一些个新的阶段 ,它位于 和 之间。 分布设计 逻辑设计 物理设计 水平分片的方法可归为 和 两种。 初级分片 导出分片 DATAID-D相对于DATAID-1增加了 和 两个阶段。 分布要求分析 分布设计 DATAID-D中的分布设计分成 、 、 和 四个阶段。 分片设计 非冗余分配 冗余分配 局部模式的重新构造 分布式查询优化的准则是 。 通信费用和响应时间最短 在分布式系统中,查询代价QC= 。 I/O代价+CPU代价+通信代价 在分布式环境下,查询可分为 、 和 三种类型。 局部查询 远程查询 全局查询 分布式查询处理可以分为 、 、 和 四层。 查询分解 数据本地化 全局优化 局部优化一个分布式事务通常是由 和 组成。 主事务 子事务 事务的四个特性是: 、 、 和 。 原子性 一致性 隔离性 耐久性 控制分布式事务所执行的控制模型有: 、 和 。 主从模型 三角模型 层次模型 分布式数据库系统中,通信故障可以分为 和 两种。 报文故障 网络分割故障 事务恢复主要是依靠 来实现的。 日志 并发控制机制可以为 和 两种类型。 悲观并发控制法 乐观并发控制法 常用的基本封锁算法有: 、 、 和 。 简单的分布式封锁方法 主站点封锁法 主副本封锁法 快照方法 预防死锁的方法有 和 两种类型。 非占先权方法 占先权方法 检测分布式死锁的三种方法是 、 和 。 集中式 层次式 分布式 2. 简答题 分布式数据库系统的特点是什么 答:物理分布性:数据不是存放在一个站点上 逻辑整体性:是与分散式数据库系统的区别 站点自治性:是与多处理机的系统的区别 数据分布透明性 集中与自治相结合 存在适当的数据冗余度 事务管理的分布性 分布式数据库中数据分片的规则是什么 答:(1)完备性原则:必须把全局关系的所有数据映射到各自片段中,绝不允许有属于 全局关系的数据却不发球它的任何一个片段。 (2)可重构原则:必须保证能够由同一个全局关系的各个片段来重建该全局关系。对于 水平分片可用并操作重构全局关系,对于垂直分片可用连接操作重构全局关系。 (3)不相交原则:关系分片后的各个片断不能重叠或只包含主键重叠。 DATAID-D相对于DATAID-1增加哪两个阶段,这两个阶段的具体工作是什么 答:(1)分布要求分析阶段:收集关于分布的信息,如水平分片的划分谓词,每一应用 在各站点激活的频率等。 (2)分布设计阶段:始于全局数据库模式的规格说明和所收集的分布要求,然后产生全 局数据的分片模式和片段的位置分配模式,分配模式描述了分配在各站点上的数据情况 。 分布式事务的一般结构是什么 答:分布式事务的一般结构为: Begin Transaction原语:开始一个事务(2分) T1[] T2[] : 子事务或操作序列 : Tn[] Commit原语:事务成功完成的结束(2分) Rollback或Abort原语:事务失败的结束(1分) 5. 论述题 分布式数据库中,"数据分配"有哪些策略"数据分片"有哪些策略 数据分片的准则是什么 数据分配是指数据在计算机网络各场地上的分配策略。包括: (1)集中式:所有数据均安排在同一个场地上。 (2)分割式:所有数据只有一份,分别被安置在若干个场地。 (3)全复制式:数据在每个场地重复存储。 (4)混合式:数据库分成若干可相交的子集,每一子集安置在一个或多个场地上,但是 每一场地未必保存全部数据。 数据分片的方式有以下三种: (1)水平分片:按一定的条件把全局关系的所有元组划分成若干不相交的子集,每个子 集为关系的一个片段。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据库内核

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值