Sharding JDBC如何分库分表?看完你就会了

Sharding JDBC的操作分为配置使用、读写分离、分库分表以及应用等,今天我们主要来了解一下关于分库分表的操作,如果你对此感兴趣的话,那我们就开始吧。

环境准备

pom.xml

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.1.3.RELEASE</version></parent>

<properties>

<java.version>1.8</java.version>

<sharding.version>3.1.0</sharding.version></properties>

<dependencies>

<dependency>

<groupId>io.shardingsphere</groupId>

<artifactId>sharding-jdbc-core</artifactId>

<version>${sharding.version}</version>

</dependency>

<dependency>

<groupId>io.shardingsphere</groupId>

<artifactId>sharding-jdbc-spring-boot-starter</artifactId>

<version>${sharding.version}</version>

</dependency>

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid</artifactId>

<version>1.1.10</version>

</dependency>

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis</artifactId>

<version>3.4.5</version>

</dependency>

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

<version>1.3.1</version>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.46</version>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter</artifactId>

</dependency>

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

</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>

</plugin>

</plugins></build>

domain

// 建立[email protected]@[email protected]@[email protected] class Employee {

private Long id;

private String name;}

配置类

@[email protected]("cn.wolfcode.sharding.mapper")public class ShardingApplication { }

分库分表

案例模型

把数据分别存放在两台服务器的两个数据库中表,通过分片算法来决定当前的数据存放在哪个数据库的哪个表中,由于一个连接池只能连接一个特定的数据库,所以这里需要创建多个连接池对象

建表

-- 分别在2台服务器中建立数据库sharding,并且建表employee_0和employee_1CREATE TABLE `employee_0` (

`id` bigint(20) PRIMARY KEY AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ###################################CREATE TABLE `employee_1` (

`id` bigint(20) PRIMARY KEY AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;

application.properties

# 定义连接池

sharding.jdbc.datasource.names=db0,db1

# 格式sharding.jdbc.datasource.连接池名.xxx:设置4要素信息

sharding.jdbc.datasource.db0.type=com.alibaba.druid.pool.DruidDataSource

sharding.jdbc.datasource.db0.driver-class-name=com.mysql.jdbc.Driver

sharding.jdbc.datasource.db0.url=jdbc:mysql://db0Ip:port/sharing

sharding.jdbc.datasource.db0.username=xxx

sharding.jdbc.datasource.db0.password=xxx

sharding.jdbc.datasource.db1.type=com.alibaba.druid.pool.DruidDataSource

sharding.jdbc.datasource.db1.driver-class-name=com.mysql.jdbc.Driver

sharding.jdbc.datasource.db1.url=jdbc:mysql://db1Ip:port/sharing

sharding.jdbc.datasource.db1.username=xxx

sharding.jdbc.datasource.db1.password=xxx

# 设置分库规则

# sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column:分库列

# sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression:分库算法

sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=id

sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=db$->{id % 2}

# 绑定逻辑表

sharding.jdbc.config.sharding.binding-tables=employee

# 设置分表规则

# sharding.jdbc.config.sharding.tables.逻辑表.actual-data-nodes:逻辑表对应的真实表

# sharding.jdbc.config.sharding.tables.逻辑表.table-strategy.inline.sharding-column:分表列

# sharding.jdbc.config.sharding.tables.逻辑表.table-strategy.inline.algorithm-expression:分表算法

# sharding.jdbc.config.sharding.tables.逻辑表.key-generator-column-name:主键列

sharding.jdbc.config.sharding.tables.employee.actual-data-nodes=db$->{0..1}.employee_$->{0..1}

sharding.jdbc.config.sharding.tables.employee.table-strategy.inline.sharding-column=id

sharding.jdbc.config.sharding.tables.employee.table-strategy.inline.algorithm-expression=employee_$->{id % 2}

sharding.jdbc.config.sharding.tables.employee.key-generator-column-name=id

# 打印日志

sharding.jdbc.config.props.sql.show=true

mapper

/**

* 这里写的employee表是上面所配置的逻辑表

* 底层会根据分片规则,把我们写的逻辑表改写为数据库中的真实表

*/@Mapperpublic interface EmployeeMapper {

@Select("select * from employee")

List<Employee> selectAll();

@Insert("insert into employee (name) values (#{name})")

void inser(Employee entity);}

测试

@RunWith(SpringRunner.class)@SpringBootTest(classes=ShardingApplication.class)public class ShardingApplicationTests {

@Autowired

private EmployeeMapper employeeMapper;

@Test

public void save() {

for (int i = 0; i < 10; i++) {

Employee employee = new Employee();

employee.setName("xx"+i);

employeeMapper.inser(employee);

}

}

@Test

public void list() {

employeeMapper.selectAll().forEach(System.out::println);

}}

优缺点

  • 拆分后单表数据量比较小,单表大数据被拆分,解决了单表大数据访问问题
  • 分表以什么切分如果弄的不好,导致多次查询,而且有时候要跨库操作,甚至导致join无法使用,对排序分组等有性能影响
  • 之前的原子操作被拆分成多个操作,事务处理变得复杂
  • 多个DB维护成本增加

看完这些操作后不妨自己去试试,实践才能检验真知,如果遇到了问题,也可以及时向我询问,我也会尽我所力帮助你。

原文地址:https://www.cnblogs.com/a1231230/p/12107569.html

时间: 2024-08-05 09:09:19

Sharding JDBC如何分库分表?看完你就会了的相关文章

一小时读懂Sharding JDBC之分库分表

作为轻量级java框架,sharding JDBC在Java的jdbc层提供了额外的服务,可以理解为增强版的jdbc驱动.其中,分库分表的操作是其中的重要一环,接下来就跟随我来看一看,这一操作如何进行. 环境准备 pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <v

面试官:如何做到不停机分库分表迁移?

需求说明 类似订单表,用户表这种未来规模上亿甚至上十亿百亿的海量数据表,在项目初期为了快速上线,一般只是单表设计,不需要考虑分库分表.随着业务的发展,单表容量超过千万甚至达到亿级别以上,这时候就需要考虑分库分表这个问题了,而不停机分库分表迁移,这应该是分库分表最基本的需求,毕竟互联网项目不可能挂个广告牌"今晚10:00~次日10:00系统停机维护",这得多low呀,以后跳槽面试,你跟面试官说这个迁移方案,面试官怎么想呀? 借鉴codis 笔者正好曾经碰到过这个问题,并借鉴了codis一

数据库分库分表(sharding)系列(三) 关于使用框架还是自主开发以及sharding实现层面的考量

当团队对系统业务和数据库进行了细致的梳理,确定了切分方案后,接下来的问题就是如何去实现切分方案了,目前在sharding方面有不少的开源框架和产 品可供参考,同时很多团队也会选择自主开发实现,而不管是选择框架还是自主开发,都会面临一个在哪一层上实现sharding逻辑的问题,本文会对这一系 列的问题逐一进行分析和考量.本文原文连接: http://blog.csdn.net/bluishglc/article/details/7766508转载请注明出处! 一.sharding逻辑的实现层面 从

数据库分库分表(sharding)系列

数据库分库分表(sharding)系列     目录; (一) 拆分实施策略和示例演示 (二) 全局主键生成策略 (三) 关于使用框架还是自主开发以及sharding实现层面的考量 (四) 多数据源的事务处理 (五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案 (一) 拆分实施策略和示例演示 第一部分:实施策略 图1.数据库分库分表(sharding)实施策略图解 1.准备阶段 对数据库进行分库分表(Sharding化)前,需要开发人员充分了解系统业务逻辑和数据库sch

转数据库分库分表(sharding)系列(二) 全局主键生成策略

本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示 本文原文连接: http://blog.csdn.net/bluishglc/article/details/7710738 ,转载请注明出处! 第一部分:一些常见的主键生成策略 一旦数据库被切分到多个物理结点上,我们将不能再依赖数据库自身的主键

数据库分库分表(sharding)系列(二) 全局主键生成策略

本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示 本文原文连接: http://blog.csdn.net/bluishglc/article/details/7710738 ,转载请注明出处! 第一部分:一些常见的主键生成策略 一旦数据库被切分到多个物理结点上,我们将不能再依赖数据库自身的主键

分库分表 or NewSQL数据库?终于看懂应该怎么选!【转】

最近与同行科技交流,经常被问到分库分表与分布式数据库如何选择,网上也有很多关于中间件+传统关系数据库(分库分表)与NewSQL分布式数据库的文章,但有些观点与判断是我觉得是偏激的,脱离环境去评价方案好坏其实有失公允.本文通过对两种模式关键特性实现原理对比,希望可以尽可能客观.中立的阐明各自真实的优缺点以及适用场景. 一.NewSQL数据库先进在哪儿? 首先关于“中间件+关系数据库分库分表”算不算NewSQL分布式数据库问题,国外有篇论文pavlo-newsql-sigmodrec,如果根据该文中

oracle 分库分表(sharding)

以下文章转载博客:http://blog.csdn.net/bluishglc 讲的很深入透彻,转来分享下: 数据库Sharding的基本思想和切分策 http://blog.csdn.net/bluishglc/article/details/6161475 关于垂直切分Vertical Sharding的粒度 http://blog.csdn.net/bluishglc/article/details/6274841 数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示 ht

数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示

本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sharding缺少基本的了解,请参考我另一篇从基础理论全面介绍sharding的文章:数据库Sharding的基本思想和切分策略 第一部分:实施策略 图1.数据库分库分表(sharding)实施策略图解(点击查看大图) 1.准备阶段 对数据库进行分库分表(Sharding化)前,需要开发人员充分了解系