使用ShardingSphere-Proxy实现分表分库的攻略可以分为以下步骤:
1. 引入ShardingSphere-Proxy
在pom.xml中添加以下依赖:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-proxy-frontend</artifactId>
<version>${latest.version}</version>
</dependency>
2. 编写配置文件
在src/main/resources下添加sharding.yaml文件,内容如下:
authentication:
users:
root:
password: root
test:
password: test
# 配置数据源
dataSources:
ds0:
url: jdbc:mysql://127.0.0.1:3306/ds0?useSSL=false
username: root
password: root
driverClassName: com.mysql.jdbc.Driver
ds1:
url: jdbc:mysql://127.0.0.1:3306/ds1?useSSL=false
username: root
password: root
driverClassName: com.mysql.jdbc.Driver
rules:
- !SHARDING
tables:
user_info:
actualDataNodes: ds$->{0..1}.user_info_$->{0..2}
tableStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: t_modulo
keyGenerateStrategy:
column: order_id
keyGeneratorName: snowflake
- !SHARDING
tables:
order_info:
actualDataNodes: ds$->{0..1}.order_info_$->{0..2}
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: t_modulo
keyGenerateStrategy:
column: order_id
keyGeneratorName: snowflake
bindingTables:
- user_info
- order_info
broadcasting:
tables:
- config
# 分表算法
- !SHARDING
tables:
config:
actualDataNodes: ds0.config_$->{0..1}
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: t_modulo
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
defaultDataSourceName: ds0
props:
max.connections.size.per.query: 1
executor.size: 16
sql.show: true
# 配置分库算法
shardingAlgorithms:
t_modulo:
type: INLINE
props:
algorithm-expression: user_info_$->{user_id % 3}
我们可以在配置文件中定义多个数据源,这里定义了两个数据源ds0和ds1。其中,dataSources配置项设置了每个数据源的JDBC连接信息。
同时,我们可以定义多个表的分库分表规则。在本例中,我们定义了user_info和order_info两个表。在这两个表的定义中,我们使用了t_modulo算法对表数据进行分片。
3. 编写入口类
在入口类中,我们需要通过加载配置文件的方式启动ShardingSphere-Proxy。
public class ProxyServer {
public static void main(String[] args) {
Bootstrap.start("src/main/resources/sharding.yaml");
}
}
4. 测试
启动入口类后,我们可以连接到它提供的端口进行测试。比如我们可以使用以下方式连接到测试数据库:
mysql -h 127.0.0.1 -P 3307 -u root -p
连接到数据库后就可以进行数据操作。这里我们给出一个简单的示例:
CREATE TABLE user_info (
user_id bigint(20) NOT NULL AUTO_INCREMENT,
user_name varchar(50) NOT NULL,
password varchar(50) NOT NULL,
PRIMARY KEY (user_id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO user_info(user_name, password) VALUES ('test', 'test123');
5. 示例
为了更好的理解该攻略,我们这里通过两个示例来说明如何使用ShardingSphere-Proxy实现分表分库。
示例一: 分库
在该示例中,我们可以定义两个数据库ds0和ds1,让他们分别负责订单数据和用户数据。用户表和订单表数据都被分成两部分,分别存放在ds0和ds1两个库中。在分库中,我们可以使用sharding.yaml这样的配置:
authentication:
users:
root:
password: root
test:
password: test
# 配置数据源
dataSources:{
ds0:
url: jdbc:mysql://127.0.0.1:3306/ds0?useSSL=false
username: root
password: root
driverClassName: com.mysql.jdbc.Driver
ds1:
url: jdbc:mysql://127.0.0.1:3306/ds1?useSSL=false
username: root
password: root
driverClassName: com.mysql.jdbc.Driver}
rules:
# 分库算法
- !SHARDING
defaultDataSourceName: ds0
tables:
u_user:
actualDataNodes: ds$->{0..1}.u_user_$->{0..2}
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: t_modulo
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
shardingAlgorithms:
t_modulo:
type: INLINE
props:
algorithm-expression: u_user_$->{id % 3}
# 分库算法
- !SHARDING
defaultDataSourceName: ds1
tables:
o_order:
actualDataNodes: ds$->{0..1}.o_order_$->{0..2}
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: t_modulo
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
shardingAlgorithms:
t_modulo:
type: INLINE
props:
algorithm-expression: o_order_$->{id % 3}
在该配置中,我们通过添加两个数据源ds0和ds1来实现分库。我们定义两张表u_user和o_order来分别存放用户信息和订单信息。在数据分片中,其中的u_user表数据被分片存储在ds0中,而o_order表数据被分片存储在ds1中。在ShardingSphere-Proxy的运行过程中,应该会在数据库中生成u_user_0、u_user_1、u_user_2、o_order_0、o_order_1、o_order_2等六个表来存放数据。
示例二: 分表
在这个示例中,我们使用分表算法将数据表分成多个小表来存储数据,最终可以通过这些小表来实现大数据存储分布式。
authentication:
users:
root:
password: root
test:
password: test
# 配置数据源
dataSources:{
ds0:
url: jdbc:mysql://127.0.0.1:3306/ds0?useSSL=false
username: root
password: root
driverClassName: com.mysql.jdbc.Driver
ds1:
url: jdbc:mysql://127.0.0.1:3306/ds1?useSSL=false
username: root
password: root
driverClassName: com.mysql.jdbc.Driver}
rules:
# 分布式表
- !SHARDING
tables:
order_info:
actualDataNodes: ds$->{0..1}.order_info_$->{0..2}
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: t_modulo
keyGenerateStrategy:
column: order_id
keyGeneratorName: snowflake
bindingTables:
- user_info
- order_info
# 分布式表
- !SHARDING
tables:
config:
actualDataNodes: ds0.config_$->{0..1}
tableStrategy:
standard:
shardingColumn: id
shardingAlgorithmName: t_modulo
keyGenerateStrategy:
column: id
keyGeneratorName: snowflake
defaultDataSourceName: ds0
props:
max.connections.size.per.query: 1
executor.size: 16
sql.show: true
shardingAlgorithms:
t_modulo:
type: INLINE
props:
algorithm-expression: order_info_$->{order_id % 3}
在本例中,我们使用分表算法将数据表order_info分成三个小表存储,而config表则按照分库的方式存储。在进行表的分片时,其中的order_info表数据被分片存储在ds0和ds1中,数据被分成了三部分,分别存储在ds0、ds1中的order_info_0、order_info_1、order_info_2中。ShardingSphere-Proxy运行过程中,应该会在数据库中生成5个表order_info_0、order_info_1、order_info_2、config_0、config_1来存放数据。
通过以上两个示例,我们可以看到,使用ShardingSphere-Proxy来实现分库分表是非常方便的。只要我们熟悉相关配置规则,就可以快速地实现分布式存储。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用ShardingSphere-Proxy实现分表分库 - Python技术站