ShardingSphere详解(定义作用及原理使用)

ShardingSphere详解(定义作用及原理使用)-mikechen

分库分表中间件常用的有ShardingSphere,下面我就来详解ShardingSphere的原理与使用@mikechen

ShardingSphere定义

ShardingSphere是一个开源的分布式数据库中间件,旨在为分布式数据库应用提供数据分片、读写分离、分布式事务等功能,以满足大规模数据处理场景的需求。

 

ShardingSphere作用

ShardingSphere的作用主要有以下几个方面:

1.数据库水平拆分

ShardingSphere支持数据分片,即将数据水平拆分成多个片段,分别存储在不同的数据库实例中,提高数据库的扩展性和性能。

2.数据库读写分离

ShardingSphere支持将读和写操作分别路由到不同的数据库实例中,实现读写分离,提高数据库的读取性能和容量。

3.分布式事务

ShardingSphere支持分布式事务,可以在分片数据源之间协调事务,保证分布式事务的ACID特性。

4.跨数据源查询

ShardingSphere支持跨数据源查询,可以在多个数据库实例之间进行联合查询和数据分析,提高数据分析和决策的效率。

 

ShardingSphere架构原理

ShardingSphere架构,如下图所示:

ShardingSphere详解(定义作用及原理使用)-mikechen

ShardingSphere分为三个子项目:Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar,其中Sharding-JDBC是最为核心和成熟的项目@mikechen

 

1.Sharding-JDBC

Sharding-JDBC是一个基于JDBC的轻量级Java框架,定位为轻量级Java框架,在Java的JDBC层提供的额外服务。

支持任意实现JDBC规范的数据库:目前支持MySQL,Oracle,SQLServer和PostgreSQ等。

Sharding-JDBC 的主要功能:是将 SQL 语句按照分片策略分散到多个数据库中执行,从而实现分库分表。

日常工作中,大家使用 ShardingSphere-JDBC 进行分库分表的场景是比较多的。

 

2.Sharding-Proxy

Sharding-Proxy定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。

Sharding-Proxy是一个基于MySQL协议的代理服务,可以将原本单库的应用转变为分库分表的应用,提供了读写分离、分布式事务等功能。

 

3.Sharding-Sidecar

Sharding-Sidecar是一个基于Service Mesh的边车代理,可以通过Sidecar的方式将ShardingSphere集成到应用中。

Sharding-Sidecar支持Kubernetes和Istio等主流的Service Mesh平台,可以与容器化环境无缝集成,实现高可用和弹性扩展。

 

ShardingSphere使用

下面是一个简单的示例,演示了如何使用 ShardingSphere 对 MySQL 数据库进行分片。

1.引入 ShardingSphere 依赖

  1. <dependency>
  2. <groupId>org.apache.shardingsphere</groupId>
  3. <artifactId>sharding-jdbc-core</artifactId>
  4. <version>5.0.0-alpha</version>
  5. </dependency>

 

2.配置分片规则

  1. spring:
  2. shardingsphere:
  3. datasource:
  4. names: ds0, ds1
  5. ds0:
  6. url: jdbc:mysql://localhost:3306/db0?serverTimezone=UTC
  7. username: root
  8. password: root
  9. ds1:
  10. url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC
  11. username: root
  12. password: root
  13. rules:
  14. - !SHARDING
  15. tables:
  16. t_order:
  17. actualDataNodes: ds${0..1}.t_order_${0..1}
  18. tableStrategy:
  19. standard:
  20. shardingColumn: order_id
  21. preciseAlgorithmClassName: com.example.algorithm.PreciseShardingAlgorithm
  22. rangeAlgorithmClassName: com.example.algorithm.RangeShardingAlgorithm

其中:

  • actualDataNodes:表示数据表在物理数据库中的节点;
  • ${0..1} :表示数据表分布在两个数据源中;
  • tableStrategy :表示表分片策略
  • 其中 PreciseShardingAlgorithm 和 RangeShardingAlgorithm 分别表示精确分片和范围分片算法。

 

3.配置数据源

在上述配置文件中,我们定义了两个数据源 ds0 和 ds1,它们分别对应两个数据库 db0 和 db1。

  1. datasource:
  2. names: ds0, ds1
  3. ds0:
  4. url: jdbc:mysql://localhost:3306/db0?serverTimezone=UTC
  5. username: root
  6. password: root
  7. ds1:
  8. url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC
  9. username: root
  10. password: root

 

4.配置 Proxy 层

  1. ./sharding-proxy.sh conf/config-sharding.yaml

 

5.运行应用程序

最后,在应用程序中使用 JDBC 连接到 Sharding-Proxy,执行 SQL 语句。

  1. // 获取数据源
  2. DataSource dataSource = ShardingSphereDataSourceFactory.createDataSource(shardingSphereConfig);
  3.  
  4. // 获取连接
  5. Connection connection = dataSource.getConnection();
  6.  
  7. // 执行 SQL 语句
  8. Statement statement = connection.createStatement();
  9. ResultSet resultSet = statement.executeQuery("SELECT * FROM t_order WHERE user_id = 1");
  10.  
  11. // 处理查询结果
  12. while (resultSet.next()) {
  13. // do something
  14. }
  15.  
  16. // 关闭连接
  17. resultSet.close();
  18. statement.close();
  19. connection.close();

以上是一个简单的示例,演示了如何使用 ShardingSphere 对 MySQL 数据库进行分片。

以上就是ShardingSphere详解,更多内容请查看:分库分表中间件详解(6款主流分库分表)

评论交流
    说说你的看法
欢迎您,新朋友,感谢参与互动!