Spring Boot集成ShardingSphere实现数据分片(二) | Spring Cloud 41

一、前言

我们在上篇 Spring Boot集成ShardingSphere实现数据分片(一) | Spring Cloud 40 介绍了数据分片的背景及面临的挑战,本章我们结合实际业务场景来描述各数据分片类型的优缺点。

二、数据分片类型

在上篇中已知数据分片的拆分方式分为垂直分片和水平分片。而在实际的业务场景中可以分为:垂直分表、垂直分库、水平分表、水平分库。

ShardingSphere支持的分片算法请见:https://shardingsphere.apache.org/document/current/cn/dev-manual/sharding/

2.1 垂直分表

2.1.1 基本概念

将一个表中的字段按照业务进行归类拆分成多个表,每个表存储其中一部分字段。

2.1.2 优点

  • 拆分后业务清晰,拆分规则明确

  • 系统之间整合或扩展容易

  • 为了避免IO争抢并减少锁表的几率

  • 充分发挥热门数据的操作效率,热门字段和冷门字段分开存储,比如一个人员基本信息表、一个人员详细信息表,大字段一定要放在冷门字段的表中

    为什么大字段IO效率低?

    • 数据本身长度过长,需要更长的读取时间;
    • 跨页,页是数据库存储基本单位,很多查找及定位操作都是以页为单位,单页内的数据行越多数据库整体性能越好,而大字段占用空间大,单页存储数据少,因此IO效率低;
    • 数据以行为单位将数据加载到内存中,如果字段长度短,内存就可以加载更多的数据,减少磁盘IO,从而提高数据库性能;

2.1.3 缺点

  • 无法解决拆分后单表数据量过大问题

2.2 垂直分库

2.2.1 基本概念

垂直分表只解决了单一表数据量大的问题,并没有将表分布到不同的服务器上,因此每张表还是竞争同一台宿主机的CPU、内存、网络IO和磁盘。

垂直分库就是按照业务将表进行归类,分布到不同的数据库中,从而将压力分散至不同的数据库,它的核心理念是专库专用。

2.2.2 优点

  • 拆分后业务清晰,拆分规则明确
  • 系统之间整合或扩展容易
  • 数据维护简单,能对不同业务的数据进行分级管理、维护、监控、扩展等
  • 在高并发场景下,能适当提高业务的吞吐量,减少单机硬件资源瓶颈存在的影响

2.2.3 缺点

  • 无法解决拆分后单表数据量过大问题
  • 跨库业务表无法 JOIN,只能通过接口方式解决,提高了系统复杂度
  • 跨库事务处理复杂
  • 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高

2.3 水平分表

2.3.1 基本概念

水平分表是通过某个字段(或某几个字段),根据某种规则将数据分散至多个表中,每个分片表仅存储数据的一部分。

2.3.2 优点

  • 优化单一表数据量过大而产生的性能问题
  • 避免IO争抢并减少锁表的几率

2.3.2 缺点

  • 跨表JOIN/分页/排序性能低

2.3.4 常用水平分表的方式

  • Hash取模分表

    数据库分表一般都是采用这种方式,比如一个order表,根据orderId%4,并按照结果分为4张表

    • 优点
      • 数据分片较为均匀,并容易出现热点和并发访问的瓶颈
    • 缺点
      • 容易产生跨分片查询的复杂问题
  • 数据Range分表

    按照时间区间或字段的区间进行拆分

    • 优点
      • 单表大小可用
      • 易于扩展
      • 有效避免跨分片查询的问题
    • 缺点
      • 热点数据可能成为性能瓶颈

2.4 水平分库

2.4.1 基本概念

水平分表只解决了单一表数据量大的问题,并没有将表分布到不同的服务器上,因此每张表还是竞争同一台宿主机的CPU、内存、网络IO和磁盘。

水平分库是把同一个表的数据按照一定规则拆分到不同的数据库中,从而将压力分散至不同的数据库。

2.4.2 优点

  • 优化单一表数据量过大而产生的性能问题
  • 避免IO争抢并减少锁表的几率

2.4.3 缺点

  • 跨库JOIN/分页/排序性能低

猜你喜欢

转载自blog.csdn.net/ctwy291314/article/details/130379383
今日推荐