关于个人学习ShardingSphere的一些记录

关于个人学习ShardingSphere的一些记录,第1张

关于个人学习ShardingSphere的一些记录 ShardingSphere :

1、一套开源的分部署数据中间件解决方案
2、有三个产品组成:Sharding-JDBC 、 Sharding-Proxy 和 Sharding-Sidecar(规划中)
3、定位为关系型数据库中间件,合理在分布式环境下使用关系型数据库

什么是分库分表:

1、数据库数据量是不可控的,随着时间和业务的发展,造成表里面数据越来越多,如果再去对表进行CRUD *** 作的时候,会造成性能的问题
方案1:从硬件上解决,加内存,加cpu,加硬盘(成本过高)
方案2:分库分表 * 为了解决由于数据量过大而造成数据库性能降低的问题

分库分表的方式:

1、垂直切分:
①垂直分表概念:(把单个表 拆分成两张表进行查询)
(1) *** 作数据库中的某张表,把这张表中的一部分字段数据存到另一张表中,再把这张表中的另一部分的字段的数据存到另外一张表中
例如 订单当中有些商品名称存储在 商品配置信息表中, 订单的信息存储在订单表中

②垂直分库:(把单一数据库按照业务进行划分,专库专表的 *** 作)
(1)按照每个业务,每个业务都需要建一个数据库,专门用于处理业务的数据
例如 订单 与 商品分表建议一个库来存储

小缺点:如果单个业务 数据量过大的话,那么单用垂直分库分表的话那么还是会造成系统性能降低

2、水平切分:
①水平分库:(将一模一样的数据库结构分为多个库存储)
*** 作方式 例如 判断课程Id为奇数的时候存进数据库A 课程Id为偶数的时候存进数据库B 根据业务可自行写算法进行塞值
例如 数据库A 数据库B 里面同样存储订单表当中数据 而表结构是一模一样的

单用缺陷:库中数据量达到一定数量得增加服务器或者另外的数据库 成本过高

②水平分表:(在同一个数据库中,同样表结构,以不同后缀区分表名进行拆分)
*** 作方式 例如在同一个数据库内, 表A 与 表B 结构一致,表名以年月区分 A_202101 A_202102

垂直:改变结构 水平:改变数据量

分库分表的应用与问题:

1、应用:
(1)在数据库设计阶段就需要考虑垂直分库和垂直分表
(2)随着数据库数据量的增加,不要马上考虑首先进行水平切分,首先考虑进行缓存、读写分离、使用索引等方法,如果这些方法都没办法解决的话,那么再考虑水平分库与分表

2、分库分表问题:
(1)跨节点连接查询 (分页、排序)
例如 数据库A 和数据库B 进行垂直划分 两个在不同的数据库中,现在想查询 数据库A 与数据库B中 包含的数据 需要进行汇总等 *** 作,数据库 *** 作次数过多
(2)多数据源管理问题

ShardingSphere-JDBC (并不是做分库分表,是用于数据分片和主从复制)

简介:
1、是一个轻量级的java框架,是个增强版的jdbc
2、主要的目的是:简化对分库分表之后数据的相关 *** 作

ShardingSphere-JDBC 实现水平分表:
1、引入Sharding-JDBC连接池 相关依赖

        
        
            org.apache.shardingsphere
            sharding-jdbc-spring-boot-starter
            4.1.1
        

2、创建相关数据库与表
3、约定相关匹配规则(举例-id为奇数或者偶数)或者日期
4、添加相关配置(根据文档进行配置)
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/yaml-config/
5、在application文件中添加配置

# 真实数据源名称,多个数据源用逗号区分
spring.shardingsphere.datasource.names=m1
#配置数据源具体内容
spring.shardingsphere.datasource.m1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.jdbc-url=jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=1234

#绑定course表分布情况,配置表在哪个数据库里面,表名称都是什么   tables后的为规则course    $->{1..2}为表达式,为表的拼接分布情况
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.course_$->{0..9}
spring.shardingsphere.sharding.tables.course.table-strategy.standard.sharding-column=id
spring.shardingsphere.sharding.tables.course.table-strategy.standard.precise-algorithm-class-name=com.example.demo.shardingutil.PreciseShardingConfig
spring.shardingsphere.sharding.tables.course.table-strategy.standard.range-algorithm-class-name=com.example.demo.shardingutil.RangeAlgorithmConfig

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

6、自定义分片算法

public class PreciseShardingConfig implements PreciseShardingAlgorithm {

    @Override
    public String doSharding(Collection shardingValue, PreciseShardingValue preciseShardingValue) {
        String tableName = preciseShardingValue.getLogicTableName();
        Long id = preciseShardingValue.getValue();

        tableName = String.join("_", tableName, String.valueOf(id % 10L));
        if (tableName.contains(tableName)) {
            return tableName;
        }
        throw new IllegalArgumentException("分片失败");
    }
}
public class RangeAlgorithmConfig implements RangeShardingAlgorithm {
    @Override
    public Collection doSharding(Collection shardingValue, RangeShardingValue rangeShardingValue) {
        Set setList = Sets.newHashSet();
        String logicTableName = rangeShardingValue.getLogicTableName();
        for (int i = 0; i < 10; i++) {
            String tableName = String.join("_",logicTableName,String.valueOf((int) (Math.random() * 10)));
            setList.add(tableName);
        }
        return setList;
    }
}
Sharding-Proxy

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5696582.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存