基本概念
个人观点,数据库能不切分就不切分,在需要切分之前先采用缓存,读写分离,索引,SQL优化等方式尝试能不能将业务性能提高,实在不行了再考虑数据库切分。数据库切分会带来维护麻烦,找错麻烦等问题,建议能在不切分情况下解决问题就不要切分。
数据库切分就是将原来一个大量数据的数据库分散存放到不同主机或者不同的表上。
数据库切分分成垂直切分和水平切分
- 垂直切分:按照不同的表(或者Schema)切分到不同的数据库(主机)上。一个数据库由很多表构成,每张表对应不同的业务,垂直切分是按照业务将表进行分类,分布到不同数据库上。简单的说就是原来数据库中有很多表,将一些表单独出来放在另外一个新的数据库中。
- 水平切分: 根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上。简单的说就是原来一个表数据量太多,将这里表的某一部分数据比如每500W条记录存一个数据库。
ShardingSphere简介
摘自官网:
Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。 它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
-
ShardingSphere-JDBC
定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。
-
ShardingSphere-Proxy
定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前提供 MySQL 和 PostgreSQL 版本,它可以使用任何兼容 MySQL/PostgreSQL 协议的访问客户端(如:MySQL Command Client, MySQL Workbench, Navicat 等)操作数据,对 DBA 更加友好。
技术选型
demo采用SpringBoot + MybatisPlus + Druid + mysql 的方式
环境搭建
<?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 http://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.corn</groupId>
<artifactId>sharding-sphere-learn</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</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.3.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
// 主启动类
@SpringBootApplication
@MapperScan(basePackages = "com.corn.sharding.sphere.mapper")
public class CornShardingSphereDemo {
public static void main(String[] args) {
SpringApplication.run(CornShardingSphereDemo.class, args);
}
}
// entity
@Data
@Accessors(chain = true)
public class User {
// 注意我们约定 偶数主键存数据库1 和table0 则后面的分库分表策略需要计算这里就必须是一个数字类型 不然后面会报异常
@TableId
private Long id;
private String name;
private Integer age;
}
// Mapper
public interface UserMapper extends BaseMapper<User> {
}
创建数据库和数据库表
-- 创建ss1 数据库 和ss2数据库 分别创建user_1 和user_2表
CREATE TABLE `user_1` (
`id` bigint(20) NOT NULL,
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`age` int(5) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `user_2` (
`id` bigint(20) NOT NULL,
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`age` int(5) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;