spring:
shardingsphere:
datasource:
names: ds_0, ds_1
ds_0:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_0
username: user
password: password
ds_1:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_1
username: user
password: password
sharding:
default-data-source-name: ds_0
tables:
user:
actual-data-nodes: ds_${0..1}.user_${0..3}
table-strategy:
standard:
sharding-column: id
precise-algorithm-class-name: com.example.ModuloShardingAlgorithm
key-generator:
column: id
type: SNOWFLAKE
worker-id: 1
max-tolerate-timeout-milliseconds: 300
binding-tables: user
default-database-strategy:
inline:
sharding-column: id
algorithm-expression: ds_${id % 2}
default-table-strategy:
inline:
sharding-column: id
algorithm-expression: user_${id % 4}
上述配置中,我们定义了两个数据源(ds_0和ds_1),并配置了它们的连接信息,包括驱动类名、URL、用户名、密码、连接超时时间、空闲超时时间、最大生命周期、最大连接池大小、最小空闲连接数和连接测试SQL。
接着,我们定义了一个表(user)的分片规则。该表的实际数据节点是由ds_0和ds_1组成的,使用取模算法(ModuloShardingAlgorithm)进行分片,分片键为id。同时,我们配置了Snowflake算法作为key-generator来生成唯一ID。
在default-database-strategy和default-table-strategy中,我们分别配置了默认的数据库策略和表策略。默认数据库策略使用了inline算法,根据id的值将数据路由到不同的数据源;默认表策略为none,表示不进行表分片。
最后,我们将user表绑定到了binding-tables中。
通过以上的YAML配置,Sharding JDBC会根据配置的分片规则将数据进行分片存储和查询,并根据配置的连接池参数进行连接管理。在使用Spring Boot时,只需将以上配置放入application.yml或application.properties文件中,Sharding JDBC会自动加载并创建数据源。
在上述示例中,我们使用的是基于取模算法(ModuloShardingAlgorithm)的分片策略,其中分片键为id。假设我们有8条数据,id分别为0到7。
根据配置的分片规则,数据会被分到不同的数据节点(ds_0和ds_1)和不同的表(user_0, user_1, user_2, user_3)中。具体分布如下:
数据id为0、1的数据会被路由到ds_0的user_0表中;
数据id为2、3的数据会被路由到ds_0的user_1表中;
数据id为4、5的数据会被路由到ds_1的user_2表中;
数据id为6、7的数据会被路由到ds_1的user_3表中。
通过将数据分散到多个表和数据库中,可以有效地提高数据库的负载能力和扩展性,同时避免单一数据库的性能瓶颈问题。