二分库分表_中间件Sharding-jdbc使用指南

Posted 上善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分库分表_中间件Sharding-jdbc使用指南相关的知识,希望对你有一定的参考价值。

一、ShardingSphere介绍

官方地址:https://shardingsphere.apache.org/index_zh.html

1.1、官网上的描述

定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

  • 适用于任何基于JDBC的ORM框架,如:JPA、Hibernate、Mybatis、Spring JDBC Template或直接使用JDBC。
  • 支持任何第三方的数据库连接池,如:DBCP、C3P0、BoneCP、Druid、HikariCP等。
  • 支持任意实现JDBC规范的数据库。目前支持mysql、Oracle、SQL server、PostgresSQL以及任何遵循SQL92标准的数据库。

1.2、自己的理解:

增强版的JDBC驱动,客户端使用的时候,就像正常使用JDBC驱动一样,引入Sharding-JDBC依赖包,连接好数据库,配置好分库分表规则,读写分离配置,然后客户端的SQL操作Sharding-JDBC会自动根据配置完成 分库分表读写分离操作。

1.3、目的:

主要目的:简化对分库分表读写分离之后数据相关操作。

二、Sharding-JDBC实现数据切分

2.1、搭建环境

  • 技术:SpringBoot + MyBatisPlus + Sharding-JDBC + Druid连接池
  • 创建SpringBoot工程
  • 引入需要的依赖
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core</artifactId>
    <version>$latest.release.version</version>
</dependency>

注意:请将 $latest.release.version 更改为实际的版本号。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.xbmu</groupId>
	<artifactId>shardingjdbcdemo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>shardingjdbcdemo</name>
	<description>ShardingJDBC project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.20</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.shardingsphere</groupId>
			<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
			<version>4.0.0-RC1</version>
		</dependency>
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.0.5</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

2.2、水平切分

2.2.1、水平分表

一、按照水平分表的方式,创建数据库和数据库表

  1. 创建数据库course_db
  2. 在数据库创建两张表course_1course_2
  3. 约定规则:如果添加课程id是偶数,则把数据添加到course_1 ;如果是奇数,则添加到course_2

二、编写代码实现对分库分表后数据的操作

创建实体类、Mapper接口

三、配置Sharding-JDBC分片策略
参考链接:https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/spring-boot-starter/

# sharding-jdbc分片策略
# 配置数据源、给数据源起名称
spring.shardingsphere.datasource.names=m1

# 配置数据源具体内容,包括连接池、驱动、地址、用户名和密码
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=root

# 指定course表分布情况,配置表在哪个数据库里面,表名称都是什么 m1.course_1 , m2.course_2
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.course_$->1..2

# 指定course表里面主键cid生成策略 SNOWFLAKE (雪花算法)
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE

# 指定分片策略:约定cid值偶数添加到course_1表,cid值是奇数添加到course_2表
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->cid % 2 + 1

# 打开sql输出日志
spring.shardingsphere.props.sql.show=true

四、编写测试代码

package com.xbmu;

import com.xbmu.entity.Course;
import com.xbmu.mapper.CourseMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ShardingjdbcdemoApplicationTests 

    @Autowired
    private CourseMapper courseMapper;

    @Test
    public void addCourse()
        for (int i = 0; i <= 10 ; i++) 
            Course course = new Course();
            course.setCname("java_"+i);
            course.setUserId(100L);
            course.setCstatus("Normal"+i);
            courseMapper.insert(course);
        
    

执行测试代码,运行报错

解决方案,根据报错提示,添加配置

# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true


再次运行

2.2.2、水平分库

一、创建两个数据库

二、在SpringBoot配置文件配置数据库分片规则

# sharding-jdbc分片策略
# 配置数据源、给数据源起名称
spring.shardingsphere.datasource.names=m1,m2

# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true

# 配置第一个数据源具体内容,包括连接池、驱动、地址、用户名和密码
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/edu_db_1?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=root

# 配置第二个数据源具体内容,包括连接池、驱动、地址、用户名和密码
spring.shardingsphere.datasource.m2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m2.url=jdbc:mysql://localhost:3306/edu_db_2?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m2.username=root
spring.shardingsphere.datasource.m2.password=root

# 指定数据库分布情况,数据库里面表分布情况
# m1 m2 course_1 course_2
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m$->1..2.course_$->1..2

# 指定course表里面主键cid生成策略 SNOWFLAKE (雪花算法)
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE

# 指定数据表分片策略:约定cid值偶数添加到course_1表,cid值是奇数添加到course_2表
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->cid % 2 + 1

# 指定数据库分片策略:约定user_id是偶数添加m1,是奇数添加m2
spring.shardingsphere.sharding.tables.course.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.course.database-strategy.inline.algorithm-expression=m$->user_id % 2 + 1

# 打开sql输出日志
spring.shardingsphere.props.sql.show=true

三、运行测试

2.3、垂直切分

2.3.1、垂直分库

一、需求分析,创建数据库:

二、编写实体类和Mapper接口

package com.xbmu.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("t_user") // 指定表
public class User 
    private Long userId;
    private String userName;
    private String ustatus;

package com.xbmu.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xbmu.entity.User;
import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper extends BaseMapper<User> 

三、配置垂直分库策略:

# sharding-jdbc分片策略
# 配置数据源、给数据源起名称
spring.shardingsphere.datasource.names=m1,m2

# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true

# 配置数据源具体内容,包括连接池、驱动、地址、用户名和密码
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=root

spring.shardingsphere.datasource.m2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m2.url=jdbc:mysql://localhost:3306/user_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m2.username=root
spring.shardingsphere.datasource.m2.password=root

# 指定course表分布情况,配置表在哪个数据库里面,表名称都是什么 m1.course_1 , m2.course_2
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.course_$->1..2

# 指定user_db数据库里面t_user 专库专表
spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=m$->2.t_user

# 指定course表里面主键cid生成策略 SNOWFLAKE (雪花算法)
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE

# 指定user_db库中t_user表里面主键user_id生成策略 SNOWFLAKE (雪花算法)
spring.shardingsphere.sharding.tables.t_user.key-generator.column=user_id
spring.shardingsphere.sharding.tables.t_user.key-generator.type=SNOWFLAKE

# 指定分片策略:约定cid值偶数添加到course_1表,cid值是奇数添加到course_2表
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->cid % 2 + 1

spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.algorithm-expression=t_user

# 打开sql输出日志
spring.shardingsphere.props.sql.show=true

四、运行结果:

2.3.2、垂直分表

主要用于操作公共表

  1. 公共表
    存储固定数据的表,表数据很少发生变化,查询时候经常进行关联;
    在每个数据库中创建出相同结构公共表;
  2. 在多个数据库都创建相同结构公共表

一、在多个数据库中创建相同结构的公共表

二、在项目配置文件application.properties配置公共表

# sharding-jdbc分片策略
# 配置数据源、给数据源起名称
spring.shardingsphere.datasource.names=m1,m2

# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true

# 配置数据源具体内容,包括连接池、驱动、地址、用户名和密码
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=root

spring.shardingsphere.datasource.m2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m2.url=jdbc:mysql://localhost:3306/user_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m2.username=root
spring.shardingsphere.datasource.m2.password=root

# 指定course表分布情况,配置表在哪个数据库里面,表名称都是什么 m1.course_1 , m2.course_2
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.course_$->1..2

# 指定user_db数据库里面t_user 专库专表
spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=m$->2.t_user

# 指定course表里面主键cid生成策略 SNOWFLAKE (雪花算法)
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE

# 指定user_db库中t_user表里面主键user_id生成策略 SNOWFLAKE (雪花算法)
spring.shardingsphere.sharding.tables.t_user.key-generator.column=user_id
spring.shardingsphere.sharding.tables.t_user.key-generator.type=SNOWFLAKE

# 指定分片策略:约定cid值偶数添加到course_1表,cid值是奇数添加到course_2表
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->cid % 2 + 1

spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.algorithm-expression=t_user

# 配置公共表
spring.shardingsphere.sharding.broadcast-tables=t_udict
spring.shardingsphere.sharding.tables.t_udict.key-generator.column=dictid
spring.shardingsphere.sharding.tables.t_udict.key-generator.type=SNOWFLAKE
# 打开sql输出日志
spring.shardingsphere.props.sql.show=true

三、编写实体类和Mapper接口

package com.xbmu.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName(value = "t_udict")
public class Udict 
    private Long dictId;
    private String ustatus;
    private String uvalue;

package com.xbmu.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xbmu.entity.Udict;
import com.xbmu.entity.User;
import org.springframework.stereotype.Repository;

@Repository
public interface UdictMapper extends BaseMapper<Udict> 

四、 测试运行

以上是关于二分库分表_中间件Sharding-jdbc使用指南的主要内容,如果未能解决你的问题,请参考以下文章

解读分库分表中间件Sharding-JDBC

SpringBoot 2.0 整合sharding-jdbc中间件,实现数据分库分表

数据库分库分表中间件 Sharding-JDBC 源码分析 —— 分布式主键

数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 解析之删除SQL

分库分表中间件sharding-jdbc的使用

spring整合sharding-jdbc实现分库分表