Sharding-Sphere 学习笔记
Sharding-Sphere 是一个开源的分布式数据库中间件,提供了分库分表、读写分离、分布式事务等功能,支持 MySQL、Oracle、SQL Server 等主流数据库。本文将介绍 Sharding-Sphere 的使用方法和代码示例。
一、Sharding-Sphere 的核心组件
Sharding-Sphere 的核心组件包括三个部分:Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar。
- Sharding-JDBC
Sharding-JDBC 是 Sharding-Sphere 的核心组件,用于实现分库分表和读写分离。它是一个 JDBC 驱动,可以直接替换应用程序中原本使用的 JDBC 驱动,从而实现对数据库的透明访问。
- Sharding-Proxy
Sharding-Proxy 是一个基于 MySQL 协议的数据库代理,可以将请求路由到多个实际的数据库节点上。它可以实现分库分表、读写分离、分布式事务等功能。
- Sharding-Sidecar
Sharding-Sidecar 是一个基于 Envoy 的数据库代理,可以将请求路由到多个实际的数据库节点上。它可以实现分库分表、读写分离、分布式事务等功能。
二、Sharding-JDBC 的使用方法
- 引入依赖
在 Maven 中引入 Sharding-JDBC 的依赖:
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>4.2.2</version>
</dependency>
- 配置数据源
在 application.yml 中配置数据源:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test
username: root
password: root
- 配置分库分表规则
在 application.yml 中配置分库分表规则:
sharding:
tables:
order:
actualDataNodes: ds${0..1}.order_${0..1}
tableStrategy:
inline:
shardingColumn: order_id
algorithmExpression: order_${order_id % 2}
keyGenerateStrategy:
column: order_id
keyGeneratorName: snowflake
bindingTables:
- order
defaultDatabaseStrategy:
inline:
shardingColumn: user_id
algorithmExpression: ds${user_id % 2}
defaultTableStrategy:
none:
- 使用 Sharding-JDBC
在 Java 代码中使用 Sharding-JDBC:
@Autowired
DataSource dataSource;
public void example() {
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("insert into order (order_id, user_id) values (?, ?)")) {
ps.setLong(1, 1L);
ps.setLong(2, 1L);
ps.executeUpdate();
}
}
以上代码将会将数据插入到分布式的 order 表中,Sharding-JDBC 会自动将数据路由到对应的数据库节点。
三、Sharding-Proxy 的使用方法
- 引入依赖
在 Maven 中引入 Sharding-Proxy 的依赖:
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-proxy-backend</artifactId>
<version>4.2.2</version>
</dependency>
- 配置数据源
在 application.yml 中配置数据源:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test
username: root
password: root
- 配置分库分表规则
在 application.yml 中配置分库分表规则:
sharding:
tables:
order:
actualDataNodes: ds${0..1}.order_${0..1}
tableStrategy:
inline:
shardingColumn: order_id
algorithmExpression: order_${order_id % 2}
keyGenerateStrategy:
column: order_id
keyGeneratorName: snowflake
bindingTables:
- order
defaultDatabaseStrategy:
inline:
shardingColumn: user_id
algorithmExpression: ds${user_id % 2}
defaultTableStrategy:
none:
- 启动 Sharding-Proxy
在 Java 代码中启动 Sharding-Proxy:
public void startProxy() {
ProxyConfiguration proxyConfiguration = new ProxyConfiguration();
proxyConfiguration.setFrontendConfiguration(new FrontendConfiguration("jdbc", new InetSocketAddress("127.0.0.1", 3307)));
proxyConfiguration.setBackendConfiguration(new BackendConfiguration(Collections.singletonList(new DataSourceConfiguration(
"test", "com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/test", "root", "root")), new RuleConfiguration(Collections.singletonList(
new ShardingRuleConfiguration(Collections.singletonList(new TableRuleConfiguration("order", "ds${0..1}.order_${0..1}")), new ShardingStrategyConfiguration(
"user_id", "ds${user_id % 2}", "order_id", "order_${order_id % 2}", new StandardShardingAlgorithmConfiguration("MODULO")))))));
ShardingProxy shardingProxy = new ShardingProxy();
shardingProxy.start(proxyConfiguration);
}
以上代码将会在本地启动一个 Sharding-Proxy 服务,监听在 127.0.0.1:3307 上。应用程序可以通过 JDBC 连接到该地址,Sharding-Proxy 会将请求路由到对应的数据库节点。
四、Sharding-Sidecar 的使用方法
- 引入依赖
在 Maven 中引入 Sharding-Sidecar 的依赖:
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-sidecar</artifactId>
<version>4.2.2</version>
</dependency>
- 配置数据源
在 application.yml 中配置数据源:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test
username: root
password: root
- 配置分库分表规则
在 application.yml 中配置分库分表规则:
sharding:
tables:
order:
actualDataNodes: ds${0..1}.order_${0..1}
tableStrategy:
inline:
shardingColumn: order_id
algorithmExpression: order_${order_id % 2}
keyGenerateStrategy:
column: order_id
keyGeneratorName: snowflake
bindingTables:
- order
defaultDatabaseStrategy:
inline:
shardingColumn: user_id
algorithmExpression: ds${user_id % 2}
defaultTableStrategy:
none:
- 启动 Sharding-Sidecar
在 Java 代码中启动 Sharding-Sidecar:
public void startSidecar() {
SidecarConfiguration sidecarConfiguration = new SidecarConfiguration();
sidecarConfiguration.setServicePort(9090);
sidecarConfiguration.setAdminPort(9091);
sidecarConfiguration.setProxyConfiguration(new ProxyConfiguration(Collections.singletonList(new DataSourceConfiguration(
"test", "com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/test", "root", "root")), new RuleConfiguration(Collections.singletonList(
new ShardingRuleConfiguration(Collections.singletonList(new TableRuleConfiguration("order", "ds${0..1}.order_${0..1}")), new ShardingStrategyConfiguration(
"user_id", "ds${user_id % 2}", "order_id", "order_${order_id % 2}", new StandardShardingAlgorithmConfiguration("MODULO")))))));
ShardingSidecar shardingSidecar = new ShardingSidecar();
shardingSidecar.start(sidecarConfiguration);
}
以上代码将会在本地启动一个 Sharding-Sidecar 服务,监听在 9090 端口上。应用程序可以通过 Envoy 连接到该地址,Sharding-Sidecar 会将请求路由到对应的数据库节点。
五、总结
本文介绍了 Sharding-Sphere 的核心组件和使用方法,并提供了代码示例。Sharding-Sphere 是一个功能强大的分布式数据库中间件,可以大大简化数据库的管理和维护,提高系统的可扩展性和可靠性。如需了解更多信息,请参考官方文档。