写点什么

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

用户头像
关注
发布于: 3 小时前

简介

在上篇文章中,在本地搭建了运行环境,本地来体验下 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-splittingspring.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.运行

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



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


---------------------------- 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@Primarypublic 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 相关的数据清理代码,我们看看数据库里面的字段张啥样的,大致如下,最后一个字段看的出来是加密了的


总结

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


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

发布于: 3 小时前阅读数: 3
用户头像

关注

还未添加个人签名 2018.09.09 加入

代码是门手艺活,也是门艺术活

评论

发布
暂无评论
ShardingSphere JDBC 分库分表 读写分离 数据加密