南阳网站建设费用,淘宝网请人做淘宝客网站,巩义做网站汉狮网络,安装wordpress步骤文章目录为什么分库分表一、垂直分片、水平分片二、常用的数据分片策略三、垂直分表、垂直分库、水平分库、水平分表四、垂直切分、水平切分优缺点五、数据分片规则六、分库分表带来的问题本文参考博主「小Y是我的」的文章#xff0c;原文链接#xff1a;https://blog.csdn.n…
文章目录为什么分库分表一、垂直分片、水平分片二、常用的数据分片策略三、垂直分表、垂直分库、水平分库、水平分表四、垂直切分、水平切分优缺点五、数据分片规则六、分库分表带来的问题本文参考博主「小Y是我的」的文章原文链接https://blog.csdn.net/m0_48383346/article/details/116999608博主「勤天」的文章原文链接https://blog.csdn.net/demored/article/details/123371982为什么分库分表
随着平台的业务发展数据可能会越来越多甚至达到亿级。以MySQL为例单库数据量在5000万以内性能比较好超过阈值后性能会随着数据量的增大而明显降低。单表的数据量超过1000w性能也会下降严重。这就会导致查询一次所花的时间变长并发操作达到一定量时可能会卡死甚至把系统给拖垮
我们是否可以通过提升服务器硬件能力来提高数据处理能力能但是这种方案很贵并且提高硬件是有上限的。那我们能不能把数据分散在不同的数据库中使得单一数据库和表的数据量变小从而达到提升数据库操作性能的目的 可以这就是数据库分库分表。
分库分表就是把较大的数据库和数据表按照某种策略进行拆分。目的在于降低每个库、每张表的数据量减小数据库的负担提高数据库的效率缩短查询时间。另外因为分库分表这种改造是可控的底层还是基于RDBMS因此整个数据库的运维体系以及相关基础设施都是可重用的。
一、垂直分片、水平分片
垂直(纵向)分片按照业务维度将表拆分到不同的数据库中专库专用分担数据库压力(提高IO性能)。 水平(横向)分片按某种规则将单表数据拆分到多张表中。从理论上突破了单机数据量的瓶颈是分库分表的标准解决方案。
垂直切分的最大特点就是规则简单实施也更为方便尤其适合各业务之间的耦合度非常低。相互影响非常小业务逻辑非常清晰的系统。在这样的系统中能够非常easy做到将不同业务模块所使用的表分拆到不同的数据库中。依据不同的表来进行拆分。对应用程序的影响也更小拆分规则也会比較简单清晰。水平切分于垂直切分相比。相对来说略微复杂一些。由于要将同一个表中的不同数据拆分到不同的数据库中对于应用程序来说拆分规则本身就较依据表名来拆分更为复杂后期的数据维护也会更为复杂一些。当我们某个或者某些表的数据量和访问量特别的大通过垂直切分将其放在独立的设备上后仍然无法满足性能要求这时候我们就必须将垂直切分和水平切分相结合。先垂直切分然后再水平切分。才干解决这样的超大型表的性能问题。
二、常用的数据分片策略
取模分片取模算法来分片如id%21的一起 id%20的一起 优点数据存放比较均匀。 缺点扩容需要大量数据迁移。按范围分片 优点扩容不需要迁移数据。 缺点数据存放不均匀容易产生数据倾斜。根据业务场景灵活定制分片策略。
三、垂直分表、垂直分库、水平分库、水平分表
垂直切分可以分为: 垂直分库和垂直分表水平切分可以分为水平分库和水平分表。 垂直分表可以把一个宽表的字段按访问频次、业务耦合松紧、是否是大字段的原则拆分为多个表这样既能使业务清晰还能提升部分性能。拆分后尽量从业务角度避免联查否则性能方面将得不偿失。 说明一开始商品表中包含商品的所有字段但是我们发现: 1商品详情和商品属性字段较长。 2商品列表的时候我们是不需要显示商品详情和商品属性信息只有在点进商品商品的时候才会展示商品详情信息。 所以可以考虑把商品详情和商品属性单独切分一张表提高查询效率。 垂直分库可以把多个表按业务耦合松紧归类分别存放在不同的库这些库可以分布在不同服务器从而使访问压力被多服务器负载大大提升性能同时能提高整体架构的业务清晰度不同的业务库可根据自身情况定制优化方案。但是它需要解决跨库带来的所有复杂问题。 水平分库可以把一个表的数据(按数据行)分到多个不同的库每个库只有这个表的部分数据这些库可以分布在不同服务器从而使访问压力被多服务器负载大大提升性能。它不仅需要解决跨库带来的所有复杂问题还要解决数据路由的问题。 水平分表可以把一个表的数据(按数据行)分到多个同一个数据库的多张表中每个表只有这个表的部分数据这样做能小幅提升性能它仅仅作为水平分库的一个补充优化。
一般来说在系统设计阶段就应该根据业务耦合松紧来确定垂直分库垂直分表方案在数据量及访问压力不是特别大的情况首先考虑缓存、读写分离、索引技术等方案。若数据量极大且持续增长再考虑水平分库分表方案。
四、垂直切分、水平切分优缺点
垂直切分优缺点 优点解决业务系统层面的耦合业务清晰 - 与微服务的治理类似也能对不同业务的数据进行分级管理、维护、监控、扩展等 - 高并发场景下垂直切分一定程度的提升IO、数据库连接数、单机硬件资源的瓶颈 缺点分库后无法Join只能通过接口聚合方式解决提升了开发的复杂度 - 分库后分布式事务处理复杂 - 依然存在单表数据量过大的问题需要水平切分
水平切分优缺点 优点不存在单库数据量过大、高并发的性能瓶颈提升系统稳定性和负载能力 - 应用端改造较小不需要拆分业务模块 缺点跨分片的事务一致性难以保证 - 跨库的Join关联查询性能较差 - 数据多次扩展难度和维护量极大
五、数据分片规则
我们我们考虑去水平切分表将一张表水平切分成多张表这就涉及到数据分片的规则比较常见的有
Hash取模分表数值Range分表一致性Hash算法分表
Hash取模分表 概念 一般采用Hash取模的切分方式例如假设按goods_id分4张表。goods_id%4 取整确定表
优点数据分片相对比较均匀不容易出现热点和并发访问的瓶颈。缺点后期分片集群扩容时需要迁移旧的数据很难。 - 容易面临跨分片查询的复杂问题。
比如上例中如果频繁用到的查询条件中不带goods_id时,将会导致无法定位数据库,从而需要同时向4个表发起查询再在内存中合并数据取最小集返回给应用分库反而成为拖累。
数值Range分表 概念 按照时间区间或ID区间来切分。例如将goods_id为11000的记录分到第一个表10012000的分到第二个表以此类推。 优点单表大小可控 - 天然便于水平扩展后期如果想对整个分片集群扩容时只需要添加节点即可无需对其他分片的数据进行迁移 - 使用分片字段进行范围查找时连续分片可快速定位分片进行快速查询有效避免跨分片查询的问题。 缺点 热点数据成为性能瓶颈。
例如按时间字段分片有些分片存储最近时间段内的数据可能会被频繁的读写而有些分片存储的历史数据则很少被查询
一致性Hash算法 一致性Hash算法能很好的解决因为Hash取模而产生的分片集群扩容时需要迁移旧的数据的难题。
六、分库分表带来的问题
分库分表有效的缓解了大数据、高并发带来的性能和压力也能突破网络IO、硬件资源、连接数的瓶颈但同时也带来了一些问题。
事务一致性问题 由于分库分表把数据分布在不同库甚至不同服务器不可避免会带来分布式事务问题我们需要额外编程解决该问题。跨节点join 在没有进行分库分表前我们检索商品时可以通过以下SQL对店铺信息进行关联查询
SELECT p.*,s.[店铺名称],s.[信誉]
FROM [商品信息] p
LEFT JOIN [店铺信息] s ON p.id s.[所属店铺]
WHERE...ORDER BY...LIMIT...但经过分库分表后**[商品信息]和[店铺信息]**不在一个数据库或一个表中甚至不在一台服务器上无法通过sql语句进行关联查询我们需要额外编程解决该问题。
跨节点分页、排序和聚合函数 跨节点多库进行查询时limit分页、order by排序以及聚合函数等问题就变得比较复杂了。需要先在不同的分片节点中将数据进行排序并返回然后将不同分片返回的结果集进行汇总和再次排序。例如进行水平分库后的商品库按ID倒序排序分页取第一页 以上流程是取第一页的数据性能影响不大但由于商品信息的分布在各数据库的数据可能是随机的如果是取第N页需要将所有节点前N页数据都取出来合并再进行整体的排序操作效率可想而知所以请求页数越大系统的性能也会越差。
在使用Max、Min、Sum、Count之类的函数进行计算的时候与排序分页同理也需要先在每个分片上执行相应的函数然后将各个分片的结果集进行汇总和再次计算最终将结果返回。
主键避重 在分库分表环境中由于表中数据同时存在不同数据库中主键值平时使用的自增长将无用武之地某个分区数据库生成的ID无法保证全局唯一。因此需要单独设计全局主键以避免跨库主键重复问题。 由于分库分表之后数据被分散在不同的服务器、数据库和表中。因此对数据的操作也就无法通过常规方式完成并且它还带来了一系列的问题。我们在开发过程中需要通过一些中间件解决这些问题市面上有很多中间件可供我们选择其中Sharding-JDBC和mycat较为流行。