Sharding-JDBC实现水平拆分-单库分表

参考资料:猿天地   https://mp.weixin.qq.com/s/901rNhc4WhLCQ023zujRVQ 作者:尹吉欢

  当单表的数量急剧上升,超过了1千万以上,这个时候就要对表进行水平拆分。

表的水平拆分是什么?

  就是将一个表拆分成N个表,就像一块大石头,搬不动,然后切割成10块,这样就能搬的动了。原理是一样的。 除了能够分担数量的压力,同时也能分散读写请求的压力,当然这个得看你的分片算法了,合理的算法才能够让数据分配均匀并提升性能。 今天我们主要讲单库中进行表的拆分,也就是不分库,只分表。

  user表由原来的一个被拆分成了4个,数据会均匀的分布在这3个表中,也就是原来的user = user0 + user1 + user2 + user3。

  技术选型:SpringBoot + Sharding-JDBC + MyBatis

1. 核心Jar包

  同 垂直拆分

2. yml文件配置

# 数据源名称集合,对应下面数据源配置的名称
spring:
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    datasource:
      names: db1
      # 主数据源
      db1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/db_user?characterEncoding=utf-8
        username: ****
        password: ****
    sharding:
      tables:
        user:
          # 分表配置
          actual-data-nodes.db1: user_${0..3}
          # inline 表达式
          table-strategy.inline.sharding-column: id
          table-strategy.inline.algorithm-expression: user_${id.longValue()%4}
    props:
      # 开启SQL显示,默认false
      sql:
        show: true
  • actual-data-nodes 配置分表信息,这边用的inline表达式,翻译过来就是db1.user0,db1.user1,db1.user2,db1.user3
  • inline.sharding-column 分表的字段,这边用id分表
  • inline.algorithm-expression 分表算法行表达式,需符合groovy语法,上面的配置就是用id进行取模分片

  如果我们有更复杂的分片需求,可以自定义分片算法来实现:

sharding:
      tables:
        user:
          # 分表字段
          table-strategy.standard.sharding-column: id
          # 自定义分表算法类
          table-strategy.standard.precise-algorithm-class-name: com.*.*.MyPreciseShardingAlgorithm

  算法类:

public class MyPreciseShardingAlgorithm implements PreciseShardingAlgorithm<Long> {

    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
        for (String tableName : availableTargetNames) {
            if (tableName.endsWith(shardingValue.getValue() % 4 + "")) {
                return tableName;
            }
        }
        throw new IllegalArgumentException();
    }

}

  在doSharding方法中你可以根据参数shardingValue做一些处理,最终返回这条数据需要分片的表名称即可。

  除了单列字段分片,还支持多字段分片,大家可以自己去看文档操作一下。

  需要分表的进行配置,不需要分表的无需配置,数据库操作代码一行都不用改变。

  如果我们要在单库分表的基础上,再做读写分离,同样很简单,只要多配置一个从数据源就可以了,配置如下:

spring.shardingsphere.datasource.names=master,slave

# 主数据源
spring.shardingsphere.datasource.master.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.url=jdbc:mysql://localhost:3306/ds_0?characterEncoding=utf-8
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=123456

# 从数据源
spring.shardingsphere.datasource.slave.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.slave.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave.url=jdbc:mysql://localhost:3306/ds_1?characterEncoding=utf-8
spring.shardingsphere.datasource.slave.username=root
spring.shardingsphere.datasource.slave.password=123456

# 分表配置
spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds0.user_${0..3}
spring.shardingsphere.sharding.tables.user.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.user.table-strategy.inline.algorithm-expression=user_${id.longValue()%4}

# 读写分离配置
spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=master
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=slave

原文地址:https://www.cnblogs.com/huanshilang/p/12095923.html

时间: 2024-10-21 19:33:02

Sharding-JDBC实现水平拆分-单库分表的相关文章

【转】MYSQL数据库数据拆分之分库分表总结

http://wentao365.iteye.com/blog/1740691 数据存储演进思路一:单库单表单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到.数据存储演进思路二:单库多表随着用户数量的增加,user表的数据量会越来越大,当数据量达到一定程度的时候对user表的查询会渐渐的变慢,从而影响整个DB的性能.如果使用MySQL, 还有一个更严重的问题是,当需要添加一列的时候,mysql会锁表,期间所有的读写操作只能

探秘Sharding JDBC----分库分表操作

熟悉sharding JDBC的同学都知道,分库分表的操作是使用sharding JDBC中非常重要的,可能还有很多初学者对此阶段的学习存在疑虑,因此,接下来我会帮助你逐渐深入分库分表的操作. 环境准备 pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <versio

数据库水平切分(拆库拆表)的实现原理解析(转)

第1章  引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当 高的负载.对于系统的稳定性和扩展性造成了极大的问题.通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式.水平切分数据库,可 以降低单台机器的负载,同时最大限度的降低了了宕机造成的损失.通过负载均衡策略,有效的降低了单台机器的访问负载,降低了宕机的可能性:通过集群方案, 解决了数据库宕机带来的单点数据库不能访问的问题:通过读

mongodb拆库分表脚本

脚本功能: 1. 将指定的报告文件按照指定的字段.切库切表策略切分 2. 将切分后的文件并发导入到对应的Mongodb中 3. 生成日志文件和done标识文件 使用手册: -h    打印帮助信息,并退出"; -f     需要切分的数据文件"; -g    清理昨日或历史全部数据: 1 昨日数据  2 历史全部数据"; -k     拆分字段在文件中列数,从1开始"; -o    需要切分的数据文件格式 tsv或csv "; -d    切分的库数目&q

架构师速成8.4-分库分表的关键点

我们还是由浅入深(这个词我喜欢,你呢?)的讨论一下,分库分表的关键点(本故事纯属虚构,仅为搞笑): 当你的系统很小的时候,只有一个数据库,每个表的主键都是自增的,你都不去关心主键变成了多少,反正db保证自增,小日子过的很是惬意.但惬意的日子总是短暂的,你因为DB宕机被老板fire 3次(见上一个故事). 进入第4个公司的时候,你发粪涂墙,将集群改成主备HA,结果顺利出任CTO,迎娶白富美,走向了人生巅峰.当然这中间也出过一些小插曲,比如:张三注册时,刚点击完注册,DB主机宕机了.张三发现刚注册的

msql-分库分表备份

#!/bin/sh TIME=`date -d '1 day ago' +%Y%m%d` PASSWORD="" USERNAME="root" ###mysql 路径 MYSQL="/usr/local/webserver/mysql/bin/mysql -u${USERNAME} -p${PASSWORD}" MYDUMP="/usr/local/webserver/mysql/bin/mysqldump  -u${USERNAME

浅谈sharding jdbc

定位为轻量级Java框架,在Java的JDBC层提供的额外服务. 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架. 适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC. 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等. 支持任意实现JDBC规范的数据库.目前

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

数据分片产生的背景,可以查看https://shardingsphere.apache.org/document/current/cn/features/sharding/,包括了垂直拆分和水平拆分的概念.还有这个框架的目标是什么,都写得很清楚 Sharding-JDBC与MyCat: 解决分库分表的中间件.但是定位不同,Sharding-JDBC定位是轻量级Java框架,以jar包的方式提供服务,未使用中间件,使用代码连接库.MyCat相当于代理,MyCat相当于数据库,直接访问MyCat就可

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

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