ShardingSphere JDBC 分库分表 读写分离 数据加密

深入解析Apache ShardingSphere JDBC YAML配置:从基础到高级实战 本文深入解析Apache ShardingSphere JDBC YAML配置,从基础到高级实战全面讲解。涵盖数据源配置、分片规则、读写分离、数据加密等核心功能,提供生产环境调优策略和问题排查技巧,帮助开发者高效构建分库分表系统。 阅读详情

简介

在上篇文章中,在本地搭建了运行环境,本地来体验下ShardingSphere JDBC的三个功能:分库分表、读写分离、数据加密

示例运行

首先把概念先捋一捋,参考下面的文档:

配置的参考说明也是要看一看的,参考下面的文档:

接下来就是运行示例了,简单点就运行官方源码中的示例:examples/shardingsphere-jdbc-example/sharding-example/sharding-spring-boot-mybatis-example

分库分表与读写分离

1.数据库初始化

首先把相关的数据分片和读写分离所需要的表在数据库中建好

数据库简单使用docker起一个,用户名和密码都是root:

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:latest

运行下面的SQL语句建立相关的数据库:

CREATE SCHEMA IF NOT EXISTS demo_write_ds_0;
CREATE SCHEMA IF NOT EXISTS demo_write_ds_0_read_0;
CREATE SCHEMA IF NOT EXISTS demo_write_ds_0_read_1;
CREATE SCHEMA IF NOT EXISTS demo_write_ds_1;
CREATE SCHEMA IF NOT EXISTS demo_write_ds_1_read_0;
CREATE SCHEMA IF NOT EXISTS demo_write_ds_1_read_1;
2.配置修改

先修改:examples/shardingsphere-jdbc-example/sharding-example/sharding-spring-boot-mybatis-example/src/main/resources/application.properties

mybatis.config-location=classpath:META-INF/mybatis-config.xml

#spring.profiles.active=sharding-databases
#spring.profiles.active=sharding-tables
#spring.profiles.active=sharding-databases-tables
#spring.profiles.active=readwrite-splitting
spring.profiles.active=sharding-readwrite-splittin

将其配置文件修改为执行读写分离加分片

再修改:examples/shardingsphere-jdbc-example/sharding-example/sharding-spring-boot-mybatis-example/src/main/resources/application-sharding-readwrite-splitting.properties

简单的修改下对应的数据库密码,然后在最后添加下面一个配置,用于打印SQL语句:

spring.shardingsphere.props.sql-show=true
3.运行

跑起来后大致如下图所示:

image.png

其中打印了插入语句和查询语句,示例如下:

---------------------------- Insert Data ----------------------------
Logic SQL: INSERT INTO t_order (user_id, address_id, status) VALUES (?, ?, ?); 
SQLStatement: MySQLInsertStatement(setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty) 
Actual SQL: write-ds-1 ::: INSERT INTO t_order_0 (user_id, address_id, status, order_id) VALUES (?, ?, ?, ?); ::: [1, 1, INSERT_TEST, 636678694781825024] 
Logic SQL: INSERT INTO t_order_item (order_id, user_id, status) VALUES (?, ?, ?); 
SQLStatement: MySQLInsertStatement(setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty) 
Actual SQL: write-ds-1 ::: INSERT INTO t_order_item_0 (order_id, user_id, status, order_item_id) VALUES (?, ?, ?, ?); ::: [636678694781825024, 1, INSERT_TEST, 636678695339667457] 
SQLStatement: MySQLInsertStatement(setAssignment=Optional.empty, onDuplicateKeyColumns=Optional.empty) 
Actual SQL: write-ds-0 ::: INSERT INTO t_order_0 (user_id, address_id, status, order_id) VALUES (?, ?, ?, ?); ::: [2, 2, INSERT_TEST, 636678695436136448] 
Logic SQL: INSERT INTO t_order_item (order_id, user_id, status) VALUES (?, ?, ?); 

插入的语句大致就如上面的,可以从Actual SQL看出,数据的生成插入确实是分片了的

但读写分离,就不太确定了:

---------------------------- Print Order Data -----------------------
[INFO ] 2021-08-23 21:33:50,057 --main-- [ShardingSphere-SQL] Logic SQL: SELECT * FROM t_order; 
[INFO ] 2021-08-23 21:33:50,057 --main-- [ShardingSphere-SQL] SQLStatement: MySQLSelectStatement(limit=Optional.empty, lock=Optional.empty, window=Optional.empty) 
[INFO ] 2021-08-23 21:33:50,057 --main-- [ShardingSphere-SQL] Actual SQL: write-ds-0 ::: SELECT * FROM t_order_0 ORDER BY order_id ASC ; 
[INFO ] 2021-08-23 21:33:50,057 --main-- [ShardingSphere-SQL] Actual SQL: write-ds-0 ::: SELECT * FROM t_order_1 ORDER BY order_id ASC ; 
[INFO ] 2021-08-23 21:33:50,057 --main-- [ShardingSphere-SQL] Actual SQL: write-ds-1 ::: SELECT * FROM t_order_0 ORDER BY order_id ASC ; 
[INFO ] 2021-08-23 21:33:50,057 --main-- [ShardingSphere-SQL] Actual SQL: write-ds-1 ::: SELECT * FROM t_order_1 ORDER BY order_id ASC ; 

读的话,从语句上来看,还是读的write,不是预想中的:write-ds-0-read-0,write-ds-0-read-1,write-ds-1-read-0,write-ds-1-read-1,其中一个,这个有点疑惑

后面自己又运行了一次单独的读写分离的示例配置,但语句还是和上面的一样,从语句上没有看出明显的读从库

感觉可能有下面的几种情况:

  • 1.已经走的读库,只是打印的语句设置如此
  • 2.数据库需要额外的配置

这个后面再研究下…

数据加密

我们就简单使用这个示例工程进行尝试:examples/shardingsphere-jdbc-example/governance-example/governance-spring-boot-mybatis-example

1.数据库建立
CREATE SCHEMA IF NOT EXISTS demo_ds;
2.配置修改

修改配置:examples/shardingsphere-jdbc-example/governance-example/governance-spring-boot-mybatis-example/src/main/resources/application.properties

spring.profiles.active=local-zookeeper-encryp

修改配置:examples/shardingsphere-jdbc-example/governance-example/governance-spring-boot-mybatis-example/src/main/resources/application-local-zookeeper-encrypt.properties

修改数据库密码即可

3.运行

示例运行过后都会清理数据,先在代码中把相关的数据库清理给关掉:

examples/example-core/example-api/src/main/java/org/apache/shardingsphere/example/core/api/ExampleExecuteTemplate.java

public final class ExampleExecuteTemplate {
    
    public static void run(final ExampleService exampleService) throws SQLException {
        try {
            exampleService.initEnvironment();
            exampleService.processSuccess();
        } finally {
	    // 注释掉
//            exampleService.cleanEnvironment();
        }
    }
    
    public static void runFailure(final ExampleService exampleService) throws SQLException {
        try {
            exampleService.initEnvironment();
            exampleService.processFailure();
        } finally {
            exampleService.cleanEnvironment();
        }
    }
}

examples/example-core/example-spring-mybatis/src/main/java/org/apache/shardingsphere/example/core/mybatis/service/OrderServiceImpl.java

@Service
@Primary
public class OrderServiceImpl implements ExampleService {
    ......
    
    @Override
    @Transactional
    public void processSuccess() throws SQLException {
        System.out.println("-------------- Process Success Begin ---------------");
        List<Long> orderIds = insertData();
        printData();
	// 注释掉
//        deleteData(orderIds);
        printData();
        System.out.println("-------------- Process Success Finish --------------");
    }

    ......
}

跑来了,就看到了大量的日志,由上面提到的SQL之类的

上面我们关闭了order相关的数据清理代码,我们看看数据库里面的字段张啥样的,大致如下,最后一个字段看的出来是加密了的

image.png

总结

本篇文件运行了源码示例中的数据分片(分库分表)、读写分离、数据加密相关的

其中数据库分片和数据加密符合我们的初步预期,但读写分离有点怪,有点不太预期,这个后面要研究下

分库分表ShardingSphere-jdbc 5.5.2 + spring boot 配置 shardingsphere 移除了sm4算法,两种方式解决:1、使用官方shardingpshere plugin,找到相关组件依赖引用即可,2、自己添加sm4算法代码SPI实现。本文使用方式2(因官方每个版本加密算法源码会变化,以下sm4算法的SPI代码仅适配增加spi扩展SM4算法代码/***/@Getter@Override@Override@Override@Override@Override/** 阅读详情

相关推荐

Label Studio保姆级教程:从零搭建医疗影像标注平台(DICOM格式支持)

本文提供基于Label Studio从零搭建医疗影像标注平台的保姆级教程。针对DICOM格式支持,详细阐述了环境部署、DICOM深度集成与预处理、团队协作权限管理以及质量审核闭环等核心环节,旨在构建一个高效、可落地的医疗AI数据标注解决方案,助力模型落地。

nft7creator的博客 302

ShardingSphere-mysql 垂直分库

垂直分库,将业务上不相关,即不需要join操作的表划分到不同的库。

qq_39093474的博客 206

同态加密与SEAL库实战:CKKS参数调优避坑指南

本文深入探讨了同态加密技术中CKKS方案的参数调优实践,重点解析了SEAL库中`poly_modulus_degree`、`coeff_modulus`和`scale`三大核心参数的配置技巧与避坑指南。通过实战案例展示了如何平衡计算深度、精度与性能,为开发者提供了一套完整的参数优化方法论,帮助避免常见的'scale out of bounds'等错误,显著提升同态加密应用的可靠性和效率。

weixin_29315569的博客 225

【mysql-6】mysql分库分表+读写分离(shardingJDBC)

一:Sharding-JDBC 分库分表 1、Sharding-JDBC 是一款轻量级java框架,以jar形式提供服务,增强版JDBC。主要功能: 数据分片: 分库分表; 读写分离; 分片策略; 分布式主键 分布式事务: 标准化事务接口; XA强一致性事务; 柔性事务 数据库治理: 配置动态化; 编排治理; 数据脱敏; 可视化链路追踪 2、Sharding-JDBC内部结构: 黄色部分:Sharding-JDBC的入口API,采用工厂方法的形式提供。目前两个工厂类: Shar.

growing_duck的博客 878

博途S7-1200与昆仑通态MCGS纯仿真联调实战指南

本文详细介绍了博途S7-1200与昆仑通态MCGS纯仿真联调的实战指南,包括环境搭建、配置步骤、通信桥接及故障排除。通过TIA Portal和MCGS Pro搭建的仿真环境,可实现80%以上的基础功能验证,适用于工业自动化学习和开发,大幅降低硬件投入成本。

weixin_26834815的博客 438

泛微OA E9文档管理优化:临时文件清理与存储配置指南

本文深入解析了泛微OA E9系统性能下降的常见原因——临时文件堆积,并提供了完整的优化配置指南。文章详细介绍了临时文件的产生机制,并手把手指导管理员如何通过修改存储路径、调整保留时间、设置白名单等关键配置,有效清理与管理系统临时文件,从而释放存储空间,提升系统运行效率与稳定性。

tree8的博客 428

spring boot使用sharding jdbc的配置

说明 要排除DataSourceAutoConfiguration,否则多数据源无法配置 @SpringBootApplication @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class Application { public s...

weixin_33785972的博客 890

Word | 简单可操作的快捷公式编号、右对齐和引用方法

在理工科论文的写作中,涉及到大量的公式输入,我们希望能够按照章节为公式进行编号,并且实现公式居中,编号右对齐的效果。网上有各种各样的方法来实现,操作繁琐和简单的混在一起,让没有接触过公式编号的人感觉比较混乱。笔者自己博览相关博客,亲身实践,总结出一套自认为比较简便的公式编号、对齐和引用方法,在这里分享给大家~

qq_43466146的博客 3万+

SpringBoot整合ShardingSphere5.x实现数据加解密功能

SpringBoot整合ShardingSphere5.x实现数据加解密功能

asoklove的专栏 2070

信号完整性分析学习--16--传输线效应

传输线效应 说到传输线效应,大多数人都会想到一个经验法则,那就是: “当互连线的长度大于1/6倍的信号上升时间的空间延伸时,互连线就体现出传输线效应。” 上升时间越小越容易体现传输线效应。 由此可见,同一根互连线,它是否体现传输线效应,要看它要传输什么样的信号。下图所示,一根延时为15ps的互连线,当它传输上升时间为60ps的信号时就会体现传输线效应;当它传输上升时间为180ps的信号时就不体现传输线效应。

qq_29476769的博客 7272

Realsense D435i运行ORB-SLAM3

【代码】Realsense D435i运行ORB-SLAM3。

MAX_Hope的博客 2563

ShardingSphere-JDBC 分库分表、读写分离、加密功能

环境准备 Docker 启动 Mysql 实例,并且配置主从关系 GitHub 拉取 shardingsphere 代码到本地,执行安装 主库创建数据库 test,创建两张表 create table t_order0 ( order_id bigint not null auto_increment primary key, user_id bigint not null, name varchar(100) ); create table t_order1 ( order_id

a710286171的博客 573

【第1章>第5节】SOM自组织映射网络的理论学习与MATLAB仿真

自组织映射网络(Self-Organizing Map,SOM)是一种无监督学习的人工神经网络,由芬兰学者Teuvo Kohonen于1981年提出,也被称为Kohonen网络。它的主要功能是将高维输入数据映射到低维(通常是二维)的离散网格上,同时保持输入数据的拓扑结构,即相邻的输入数据在映射后的网格上也相邻。

FPGA/MATLAB学习教程/源码/项目合作开发 400

SpringBoot框架简单整合ShardingSphere-JDBC实现MySQL分库分表和读写分离及加密混合

通过Docker-Compose启动3对IP不同的主从数据库,通过JPA和默认的HikariDataSource数据源结合MySQL将ShardingSphere-JDBC整合到SpringBoot框架,实现了读写分离,分库分片,以及加密和加密对特定的字段,仅供学习交流,不具备严谨性。

Logic-Driven Thought Engineering 1789

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ShardingSphere使用详解

先选好分片键:它决定你 80% 的性能上限。业务查询必须尽量带分片键:否则广播扫描就是慢。大分页别用 offset:用游标/时间/主键。JOIN 要么绑定表,要么别做。扩容要提前设计:不然重分片迁移会非常痛。强一致事务别上头:多数场景最终一致更稳。

zhiyuanIT的专栏 1827

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ShardingSphere-JDBC 开发手册

ShardingSphere-JDBC是轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。它使⽤客⼾端直连数据库,以 jar 包形式 提供服务,⽆需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。本文基于 ShardingSphere 5.1.0 版本编写测试,不同版本之间有些许差异,可参考官方文档进行调整。/*** 自定义分库策略* 根据 user_id 进行分库*/@Override。

weixin_39676699的博客 894

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

分布式专题——13 ShardingSphere-JDBC分库分表实战与讲解

分库分表案例、核心概念、ShardingSphere-JDBC常见数据分片策略(INLINE 简单分片、STANDARD 标准分片、COMPLEX_INLINE 复杂分片、CLASS_BASED 自定义分片、HINT_INLINE 强制分片)、数据加密功能、读写分离实现、广播表与绑定表、分片审计

念头通达 1420

ShardingSphere-JDBC 分库分表实战指南

在后端开发中,当业务数据量突破千万甚至亿级时,单库单表往往成为系统性能的瓶颈——查询越来越慢,写入延迟越来越高,索引维护成本也越来越大。面对这种情况,分库分表几乎成了绕不开的技术选型。Apache ShardingSphere 是目前 Java 生态中最成熟的分布式数据库中间件解决方案之一。其中是一款轻量级 Java 框架,它以jar包形式嵌入应用,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架(如 MyBatis、Hibernate、JPA 等),对业务代码几乎无侵入。

xiaoyu❅的博客 895

ShardingSphere多语言支持终极指南:5种非Java应用接入方案

Apache ShardingSphere作为业界领先的分布式数据库中间件,其强大的**多语言支持**能力让非Java应用也能轻松享受分库分表、读写分离、数据加密等高级功能。无论你是Python、Go、Node.js还是其他语言开发者,都能通过ShardingSphere实现高效的分布式数据库管理。 ## 🚀 为什么需要ShardingSphere多语言支持? 在微服务架构盛行的今天,单一技

gitblog_00842的博客 834

Sharding Sphere

字面意思,将一个数据库拆分为多个数据库,将一个表拆分为多个表。其中又有水平切分和垂直切分两种。分库分表的出现是为了解决1、Sharding-JDBC是一个开源的轻量级Java框架,在JDBC层提供服务,原先是当当网开发的,后来加入了Apache孵化器,成为了其中的顶级项目。2、Sharding-JDBC提供了数据分片和读写分离等功能,简化了对分库分表之后数据的相关操作。

太上问情的博客 1061

ShardingSphere-JDBC分库分表与分布式事务实战指南

数据库分片技术是解决单库性能瓶颈的核心方案,其原理是通过水平拆分将数据分布到多个物理节点。ShardingSphere-JDBC作为轻量级Java框架,在JDBC层实现了透明的分库分表能力,相比传统中间件减少40%网络开销。该技术特别适合电商订单、用户画像等海量数据场景,通过YAML配置可快速实现按user_id分库、按order_id分表等典型分片策略。在分布式事务方面,支持XA强一致和BASE柔性事务两种模式,配合Narayana事务管理器可优化22%的TPS性能。实践中需注意Snowflake主键冲突

weixin_34055787的博客 377

《系统掌握 ShardingSphere-JDBC:分库分表、读写分离、分布式事务一网打尽》

如今随着互联网的发展,数据的量级也是成指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统单体的关系性数据库已经无法满足快速查询与插入数据的需求。阿里数据中心内景( 阿里、百度、腾讯这样的互联网巨头,数据量据说已经接近EB级)事务安全性,NOSQL数据库对事务的支持不完善. MySQL不可替代.遇到的问题解决方案此时项目是一个单体应用架构 (一个归档包(可以是JAR、WAR、EAR或其它归档格式)包含所有功能的应用程序,通常称为单体应用)这个阶段是公司发展的早期阶段,系统架构如上图所示。我们

weixin_53818428的博客 1021

分库分表利器之Sharding Sphere(深度好文,看过的人都说好)

Sharding-Sphere Sharding-JDBC 最早是当当网内部使用的一款分库分表框架,到2017年的时候才开始对外开源,这几年在大量社区贡献者的不断迭代下,功能也逐渐完善,现已更名为 ShardingSphere,2020年4⽉16⽇正式成为 Apache 软件基⾦会的顶级项⽬。 随着版本的不断更迭 ShardingSphere 的核心功能也变得多元化起来。如图7-1,ShardingSphere生态包含三款开源分布式数据库中间件解决方案,Sharding-JDBC、Sharding-Prox

跟着Mic学架构 2038

ShardingSphere 介绍

Apache ShardingSphere 是一款开源的分布式数据库中间件生态系统,旨在将现有的数据库转变为分布式数据库解决方案。它通过数据分片、读写分离、分布式事务和数据加密 等功能,增强了原有数据库的能力。ShardingSphere 提供了 ShardingSphere-JDBC 和 ShardingSphere-Proxy 两种核心组件,分别适用于不同的应用场景。

qq_56947957的博客 407

ShardingSphere-JDBC分库分表实战与优化指南

分库分表是解决数据库水平扩展的核心技术,通过数据分散存储提升系统吞吐量。其实现原理主要基于路由算法,将数据按分片键分布到不同物理节点。ShardingSphere-JDBC作为轻量级Java框架,以JDBC驱动形式提供透明化的分库分表能力,支持标准分片、复合分片等多种策略,并能与读写分离、数据加密等功能组合使用。在电商、金融等高并发场景中,合理运用分库分表可使查询性能提升10倍以上。本文通过订单系统改造案例,详解如何配置分片算法、处理分布式ID及事务,并给出避免全路由、绑定表配置等实战优化技巧。

weixin_34050519的博客 427

SpringBoot 整合 ShardingSphere 分库分表(1)【含多数据源配置、全部示例依赖、代码、注释、讲解】

主要作用于分库分表,内含的功能有数据分片分布式事务读写分离数据加密等,这几个是使用的较为普遍,本文主要针对于分库、分表来进行描述,主要使用也就是数据分表,做一份开箱即用的 demo 示例,更为详细的可以访问官网来进行了解自己所需。ShardingSphere 官网。

Java.API的博客 4539
上一篇: ShardingSphere源码解析 初步准备
下一篇: ShardingSphere Proxy 初步体验
_萧_
博客等级 码龄10年 55粉丝 157原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值