码农在囧途

坚持是一件比较难的事,坚持并不是自欺欺人的一种自我麻痹和安慰,也不是做给被人的,我觉得,坚持的本质并没有带着过多的功利主义,如果满是功利主义,那么这个坚持并不会长久,也不会有好的收获,坚持应该带着热爱,带着思想,把它当成习惯,但是并不是内卷,而是一种发自内心的喜欢和平实!希望我们都有自己的坚持,坚持写一篇文章,坚持爱一个人,坚持读一本书,坚持走向远方!

前言

上一篇我们说了ShardingSphere的读写分离,使用读写分离能够减轻单库的读写操作,从而提升数据库的吞吐量,但是当数据库中表的数据量到达一定数量时,我们可能就会需要进行分片了,

分片又分为垂直分片和水平分片,下面我们对二者进行简单的分析。

垂直分片

我们的一个数据库中通常是有很多数据表的,不过可能由于我们的分类不到位,就会出现涝的涝死旱的旱死的局面,比如某些数据表的读写操作十分频繁,而我的这个库中大量的集中了这种

读写操作频繁的表,那么整体的吞吐量就会降低,而某个库中又集中了读写不频繁的表,吞吐量十分的高(但是好像没什么卵用),所以我们应该合理的分配,以保证整理的吞吐量达到最大值,

下图将数据表各分到了一个数据库中。

不过垂直分片不能从根本上解决读写瓶颈,因为不管你再怎么分,所有的数据始终都集中在一张表里面,就算数据库的性能再好,也解决不了这个问题。所以我们需要进行

更加细粒度的划分,下面我们来讲解水平分片。

水平分片

水平分片又可以叫做横向拆分,就是将一张大表拆分为若干张小表,比如我一张表中有1亿条数据,那么我拆分为10张表,每张表中存1000万条数据,那么效率就会变高,

还有些数据需要进行分类和归档,那么我们也需要进行分表,之前我们系统中一个表用来存储文档信息,有十多年因为数据量十分庞大,在业务中需要对文档进行排序等操作,本来查询就比较

耗时了,再加上需要进行逻辑上的处理,所以就更加耗时,于是就进行了分表,将每一年的数据存进一个表,这样就提高了查询效率,并且更加容易对数据进行追踪和管理,如下就是水平

分片的图例。

ShardingSphere数据分片实战

使用ShardingSphere数据分片,我们只需通过简单的配置就能实现,ShardingSphere帮我们屏蔽了底层逻辑,我们也可通过ShardingSphere预留的

接口和SPI进行扩展我们的需求,比如可以实现我们自己的分片算法,主键生成策略等等。

下面演示将文档按照年份进行分表,将文档数据分表至2013年至2022年来存,一般我们的配置文件都是配置在nacos上面,所以能够灵活的进行配置,

当到了2023年,我们可以添加一个2023年的表,改下nacos的配置,当然,一般会先预留出数据表,nacos上面也留出空间,我们的是预留到2032年,

留出了10年。

yml文件

我们重点关注下面的一些配置,actual-data-nodes代表进行分片的表,使用表达式,document.document_$->{2013..2022}代表document数据库

下面的document_前缀的表进行分片,如document_2022document_2021{2013..2022}代表2013到2022这个区间,sharding-column是分片列,

是我们数据表中的某个字段,就是根据它来进行分片,sharding-algorithms是分片算法,我们可以通过SPI来实现自己的分片算法,接口是StandardShardingAlgorithm

如下我们使用的是INLINE基于行表达式的分片算法,algorithm-expression是分片表达式,ShardingSphere底层会进行解析表达式,然后分片到对应的数据表上面,

我们的表达式是document_$->{year},也就是根据年进行分片,当然,我们可以根据自己的需求去写表达式,比如根据主键取模进行分片等,需要根据我们的实际场景去做,

key-generate-strategy是主键生成策略,ShardingSphere支持自定义主键生成策略,我们只需要通过SPI就可以实现,接口是KeyGenerateAlgorithm,已经

实现了UUIDsnowflake雪花算法等主键生成策略。

spring:
shardingsphere:
mode:
type: Standalone
repository:
type: File
overwrite: true
datasource:
names: document
document:
jdbc-url: jdbc:mysql://localhost:3306/document?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
username: root
password: qwer123@
rules:
sharding:
tables:
document:
actual-data-nodes: document.document_$->{2013..2022}
table-strategy:
standard:
sharding-column: year #分片列
sharding-algorithm-name: document-inline # 分片算法名称
key-generate-strategy:
column: id # 主键列
key-generator-name: timestamp #主键生成算法
sharding-algorithms: #分片算法
document-inline:
type: INLINE
props:
algorithm-expression: document_$->{year}
key-generators:
timestamp:
type: SNOWFLAKE

测试数据数据分片

虚幻插入十次,每次都插入2013年到2022年的数据。

void addDocSliceYear(){
for (int i = 0; i < 10; i++) {
for (int year = 2013; year <= 2022; year++) {
Document document = new Document()
.setDocumentName("document year【" + year + "】")
.setDocumentDetail("year【" + year + "】")
.setYear(year);
documentService.save(document);
}
}
}

我们可以看出,数据分片成功,我们看一下分片的数据怎么查询的(此处只是单表查询),我们看一下ShardingSphere-SQL输出的sql语句

SELECT  id,document_name,document_detail,year  FROM document_2013
UNION ALL SELECT id,document_name,document_detail,year FROM document_2014
UNION ALL SELECT id,document_name,document_detail,year FROM document_2015
UNION ALL SELECT id,document_name,document_detail,year FROM document_2016
UNION ALL SELECT id,document_name,document_detail,year FROM document_2017
UNION ALL SELECT id,document_name,document_detail,year FROM document_2018
UNION ALL SELECT id,document_name,document_detail,year FROM document_2019
UNION ALL SELECT id,document_name,document_detail,year FROM document_2020
UNION ALL SELECT id,document_name,document_detail,year FROM document_2021
UNION ALL SELECT id,document_name,document_detail,year FROM document_2022

从控制台打印的SQL语句中看出,ShardingSphere分片查询使用的是UNION ALL,UNION ALL实现把前后两个SELECT集合的数据联合起来,组成一个结果集查询输出,

联合查询需要每个表中的的字段相同,字段类型相同,数量相同,这也是分片的基本要求。

上面我们只演示了单表的数据分片查询,如果是多表查询,我们需要配置binding-tables绑定表,这样能够减少查询的笛卡尔积,从而提升查询效率,我们就不做

详细的介绍,可去官网自己查看。

分片算法

ShardingSphere的分片算法有多种,我们也可以自己实现一套分片算法,通过SPI,分片算法的顶层接口是ShardingAlgorithm,目前实现了多种算法。

BoundaryBasedRangeShardingAlgorithm: 基于分片边界的范围分片算法

VolumeBasedRangeShardingAlgorithm: 基于分片容量的范围分片算法

ComplexInlineShardingAlgorithm: 基于行表达式的复合分片算法

AutoIntervalShardingAlgorithm: 基于可变时间范围的分片算法

ClassBasedShardingAlgorithm: 基于自定义类的分片算法

HintInlineShardingAlgorithm: 基于行表达式的 Hint 分片算法

IntervalShardingAlgorithm: 基于固定时间范围的分片算法

HashModShardingAlgorithm: 基于哈希取模的分片算法

InlineShardingAlgorithm: 基于行表达式的分片算法

ModShardingAlgorithm: 基于取模的分片算法

CosIdModShardingAlgorithm: 基于 CosId 的取模分片算法

CosIdIntervalShardingAlgorithm: 基于 CosId 的固定时间范围的分片算法

CosIdSnowflakeIntervalShardingAlgorithm: 基于 CosId 的雪花ID固定时间范围的分片算法

分布式主键生成算法

ShardingSphere也可以自定义实现主键生成策略,通过SPI,顶层接口为KeyGenerateAlgorithm,目前实现的算法有。

SnowflakeKeyGenerateAlgorithm 基于雪花算法的分布式主键生成算法

UUIDKeyGenerateAlgorithm: 基于 UUID 的分布式主键生成算法

CosIdKeyGenerateAlgorithm: 基于 CosId 的分布式主键生成算法

CosIdSnowflakeKeyGenerateAlgorithm: 基于 CosId 的雪花算法分布式主键生成算法

NanoIdKeyGenerateAlgorithm: 基于 NanoId 的分布式主键生成算法

总结

ShardingSphere能够方便的实现数据分片,但是数据分片本身就是一件迫不得已的事情,它会是我们的业务变得更加的复杂,在设计的时候需要经过严格的考量后再进行数据分片,防止出现一些不必要的麻烦。

关于ShardingSphere的数据分片,我们就说到这里,感谢你的观看,我们下期再见。

ShardingSphere数据分片的更多相关文章

  1. 【ShardingSphere】ShardingSphere学习(三)-数据分片-分片

    分片键 分片算法 分片策略 SQL Hint 分片键 用于分片的数据库字段,是将数据库(表)水平拆分的关键字段.例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段. SQL中如果无分片字段, ...

  2. sharding-jdbc数据分片配置

    数据分片 不使用Spring 引入Maven依赖 <dependency> <groupId>org.apache.shardingsphere</groupId> ...

  3. MyCat 学习笔记 第十二篇.数据分片 之 分片事务处理

    1 环境说明 VM 模拟3台MYSQL 5.6 服务器 VM1 192.168.31.187:3307 VM2 192.168.31.212:3307 VM3 192.168.31.150:  330 ...

  4. MyCat 学习笔记 第十篇.数据分片 之 ER分片

    1 应用场景 这篇来说下mycat中自带的er关系分片,所谓er关系分片即可以理解为有关联关系表之间数据分片.类似于订单主表与订单详情表间的分片存储规则. 本文所说的er分片分为两种: a. 依据主键 ...

  5. MyCat 学习笔记 第九篇.数据分片 之 数值分布

    1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值分片也是比较简单,其实这个和数据取摸是类似的实现. 优.缺点同上一篇 2 环境说明 参考  <MyCat 学习笔记>第六篇. ...

  6. MyCat 学习笔记 第八篇.数据分片 之 求摸运算分片

    1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值取摸应该是最简单的一种. 优点:数据离散概率较为平均,可以有效的提高应用的数据吞吐. 缺点:比较明显,后期数据运维与迁移比较困难.好在M ...

  7. MyCat 学习笔记 第七篇.数据分片 之 按数据范围分片

    1 应用场景 Mycat 其实自带了2个数据范围分片的方案,一个是纯数据范围的分片,比如 1至 10000 号的数据放到分片1 ,10001 至 20000号数据放到分片2里. 另一个是数据常量形式的 ...

  8. MyCat 学习笔记 第六篇.数据分片 之 按月数据分片

    1 应用场景 Mycat 有很多数据分库规则,接下来几篇就相关觉得常用的规则进行试用与总结. 一般来说,按自然月份来进行数据分片的规则比较适用于商城订单查询,类似最近1周.2周.3个月内的数据.或是报 ...

  9. ip协议的数据分片备忘

    总结: 不仅tcp协议能对数据段进行分割,ip协议也具备这个功能,之所以会这样是两者都受到底层MTU的限制(虽说tcp是根据MSS限制来分割数据包,由于MTU=tcp包头+ip包头+MSS,所以其实也 ...

随机推荐

  1. web渗透学习目录

    一,基础学习 01.基础学习 [[编码总结]] [[JSON三种数据解析方法]] [[js加密,解密]] [[Internet保留地址和非保留地址.内网和公网.VNC和UltraVN]] 代理 [[S ...

  2. 开源框架 WebFirst 一键生成项目,在线建表

    1.WebFirst框架描述 WebFirst  是果糖大数据团队开发的新一代 高性能 代码生成器&数据库设计工具,由.net core 3.1 + sqlsugar 开发 导入1000个表只 ...

  3. 溢出属性,定位,z-index,JS

    溢出属性 1.visible(默认值):使溢出内容展示 2.hidden:隐藏溢出内容且不出现滚动条 3.scroll:隐藏溢出容器的内容,溢出的内容可以通过滚动呈现 4.auto:与scroll没啥 ...

  4. Elasticsearch高级之-集群搭建,数据分片

    目录 Elasticsearch高级之-集群搭建,数据分片 一 广播方式 二 单播方式 三 选取主节点 四 什么是脑裂 五 错误识别 Elasticsearch高级之-集群搭建,数据分片 es使用两种 ...

  5. 使用NE555实现的延时开关电路

    NE555 的工作机制 先了解 NE555 的 Trigger(Pin2) 和 Threshold(Pin6) 如何检测电压并控制输出 如果 Trigger(Pin2) 检测到任何低于电源电压1/3的 ...

  6. nginx 源码安装配置详解(./configure)

    在"./configure"配置中,"--with"表示启用模块,也就是说这些模块在编译时不会自动构建,"--without"表示禁用模块, ...

  7. 用python解决打标签时将xml文件的标签名打错

    用python解决打标签时将xml文件的标签名打错 问题描述:再进行达标签时将magnetic_tile的标签名错误的打成了magnetic_title,又不想一张一张的修改 出现问题的xml文件 & ...

  8. 《Unix 网络编程》08:基本UDP套接字编程

    基本UDP套接字编程 系列文章导航:<Unix 网络编程>笔记 UDP 概述 流程图 recvfrom 和 sendto #include <sys/socket.h> ssi ...

  9. 文字轮播与图片轮播?CSS 不在话下

    今天,分享一个实际业务中能够用得上的动画技巧. 巧用逐帧动画,配合补间动画实现一个无限循环的轮播效果,像是这样: 看到上述示意图,有同学不禁会发问,这不是个非常简单的位移动画么? 我们来简单分析分析, ...

  10. CabloyJS的微信API对接模块:当前支持微信公众号和微信小程序

    Cabloy-微信是什么 Cabloy-微信是基于CabloyJS全栈业务开发框架开发的微信接口模块,当前整合了微信公众号和微信小程序的接口,达到开箱即用的使用效果.在Cabloy-微信的基础上,可以 ...