ShardingSphere 分库分表

news2024/9/25 10:46:52

中间件

常用中间件

MyCat

  • 是基于 Proxy,它复写了 MySQL 协议,将 Mycat Server 伪装成⼀个 MySQL 数据库
  • 客户端所有的jdbc请求都必须要先交给MyCat,再有 MyCat转发到具体的真实服务器
  • 缺点是效率偏低,中间包装了⼀层
  • 代码⽆侵⼊性

ShardingSphere下的Sharding-JDBC

  • 基于jdbc驱动,不⽤额外的proxy,在本地应⽤层重写Jdbc 原⽣的⽅法,实现数据库分⽚形式
  • 是基于 JDBC 接⼝的扩展,是以 jar 包的形式提供轻量级服务的,性能⾼
  • 代码有侵⼊性

两者的区别和相同点

相同点:
流程都是SQL解析–>SQL路由–>SQL改
写–>结果归并
区别:

ShardingSphere

简介

  • 是⼀套开源的分布式数据库解决⽅案组成的⽣态圈,定位为 Database Plus
  • 它由 JDBC、Proxy 和 Sidecar这 3款既能够独⽴部署,⼜⽀持混合部署配合使⽤的产品组成

三大构成

ShardingSphere-Sidecar
ShardingSphere-JDBC
ShardingSphere-Proxy

水平分表常见分片策略

  • ⾏表达式分⽚策略 InlineShardingStrategy
    只⽀持【单分⽚键】使⽤Groovy的表达式,提供对SQL语
    句中的 =和IN 的分⽚操作⽀持
  • 标准分⽚策略StandardShardingStrategy
    只⽀持【单分⽚键】
    • PreciseShardingAlgorithm 精准分⽚ 是必选的,⽤于处理
      =和IN的分⽚
    • RangeShardingAlgorithm 范围分配 是可选的,⽤于处理
      BETWEEN AND分⽚
  • 复合分⽚策略ComplexShardingStrategy
    ⽀持【多分⽚键】,提供对SQL语句中的=, IN和BETWEEN AND的分⽚操作⽀
  • Hint分⽚策略HintShardingStrategy

springboot整合sharding-jdbc

添加依赖

        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        </dependency>

配置文件

# 数据源 ds0 第一个数据库
  shardingsphere:
    datasource:
      #数据源名称
      names: ds0
      ds0:
        connectionTimeoutMilliseconds: 30000
        driver-class-name: com.mysql.cj.jdbc.Driver
        idleTimeoutMilliseconds: 60000
        jdbc-url: jdbc:mysql://120.79.150.146:3306/dcloud_account?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
        maintenanceIntervalMilliseconds: 30000
        maxLifetimeMilliseconds: 1800000
        maxPoolSize: 50
        minPoolSize: 50
        password: 123
        type: com.zaxxer.hikari.HikariDataSource
        username: root

    props:
    # 打印执行的数据库以及语句
      sql:
        show: true

    sharding:
      tables:
        traffic:
# 指定traffic表的数据分布情况,配置数据节点,行表达式标识符使用 ${...} 或 $->{...},但前者与 Spring 本身的文件占位符冲突,所以在 Spring 环境中建议使用 $->{...}
          actual-data-nodes: ds0.traffic_$->{0..1}
#水平分表策略+行表达式分片
          table-strategy:
            inline:
              algorithm-expression: traffic_$->{ account_no % 2 }
              sharding-column: account_no
#id生成策略
          key-generator:
            column: id
            props:
              worker:
                id: ${workId}
            #id生成策略
            type: SNOWFLAKE

分库分表暴露的问题-ID冲突

常见解决方案

数据库自增ID

设置不同的自增步长
auto_increment_offset、auto-increment-increment
缺点
依靠数据库系统的功能实现,但是未来扩容麻烦
主从切换时的不⼀致可能会导致重复发号
性能瓶颈存在单台sql上

UUID

性能⾮常⾼,没有⽹络消耗
缺点
⽆序的字符串,不具备趋势⾃增特性
UUID太⻓,不易于存储,浪费存储空间,很多场景不适⽤

Redis 发号器

利⽤Redis的INCR和INCRBY来实现,原⼦操作,线程安全,性能⽐Mysql强劲
缺点
需要占⽤⽹络资源,增加系统复杂度

SnowFlake雪花算法

twitter 开源的分布式 ID ⽣成算法,代码实现简单、不占⽤宽带、数据迁移不受影响
⽣成的 id 中包含有时间戳,所以⽣成的 id 按照时间递增
部署了多台服务器,需要保证系统时间⼀样,机器编号不⼀样
缺点
依赖系统时钟(多台服务器时间⼀定要⼀样)

SnowFlake雪花算法

简介

twitter⽤scala语⾔编写的⾼效⽣成唯⼀ID的算法
优点
⽣成的ID不重复
算法性能⾼
基于时间戳,基本保证有序递增

雪花算法⽣成的数字

  • long类,所以就是8个byte,64bit
  • ⽣成的唯⼀值⽤于数据库主键,不能是负数,所以值为
    0~9223372036854775807(2的63次⽅-1)
    在这里插入图片描述

两个重要的点

保证workId不能重复

解决方法:
自定义workId

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;

@Configuration
@Slf4j
public class SnowFlakeWordIdConfig {
    /**
     * 动态指定sharding jdbc 的雪花算法中的属性work.id属性
     * 通过调用System.setProperty()的方式实现,可用容器的 id 或者机器标识位
     * workId最大值 1L << 100,就是1024,即 0<= workId < 1024
     * {@link SnowflakeShardingKeyGenerator#getWorkerId()}
     *
     */
    static {

        try {
            InetAddress inetAddress = Inet4Address.getLocalHost();

            String hostAddressIp = inetAddress.getHostAddress();

            String workId = Math.abs(hostAddressIp.hashCode()) % 1024+"";

            System.setProperty("workId",workId);

            log.info("workId:{}",workId);

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
  }

配置文件中

#id生成策略
          key-generator:
            column: id
            props:
              worker:
                id: ${workId}
            #id生成策略
            type: SNOWFLAKE
时钟回拨

org.apache.shardingsphere.core.strategy.keygen.SnowflakeShardingKeyGenerator 已经解决了时钟回拨问题,看下源码

核心流程:
最后一次生成主键的时间 lastTime,和当前系统时间比较 currTime ,如果 lastTime < currTime ,则正常,如果lastTime > currTIme ,如果时间差在容忍范围内,则线程休眠时间差值,如果时间差大于容忍范围,则直接报异常。

    public synchronized Comparable<?> generateKey() {
        long currentMilliseconds = timeService.getCurrentMillis();
        // 判断是否需要等待容忍时间差,如果需要,则等待时间差过去,再获取当前系统时间
        if (this.waitTolerateTimeDifferenceIfNeed(currentMilliseconds)) {
            currentMilliseconds = timeService.getCurrentMillis();
        }
       // 如果最后一次毫秒与当前系统时间毫秒相同,即还在同一毫秒内
        if (this.lastMilliseconds == currentMilliseconds) {
        /**
        &位与运算符:两个数都转为二进制,如果相对应位都是1,则结果为1,否则为0
		当序列为4095时,4095+1后的新序列与掩码进行位与运算结果是
		当序列为其他值时,位与运算结果都不会是0
		即本毫秒的序列已经用到最大值4096,此时要取下一个毫秒时间值*/
            if (0L == (this.sequence = this.sequence + 1L & 4095L)) {
                currentMilliseconds = this.waitUntilNextTime(currentMilliseconds);
            }
        } else {
        	// 上一毫秒已经过去,把序列值重置为1
            this.vibrateSequenceOffset();
            this.sequence = (long)this.sequenceOffset;
        }
        // 记录最新的时间戳
        this.lastMilliseconds = currentMilliseconds;
        /**
        XX......xxx000000000000000000000000时间差XX
		XXXXXXXXXX0000000000000 机器ID XX
		XXXXXXXXXX序列号×序列号 xx
		三部分进行|位或运算:如果相对应位都是0,则结果为0,否则为1
		*/
        return currentMilliseconds - EPOCH << 22 | this.getWorkerId() << 12 | this.sequence;
    }

    private boolean waitTolerateTimeDifferenceIfNeed(long currentMilliseconds) {
        try {
        // 如果获取ID时的最后一次时间毫秒数小于等于当前系统时间毫秒数,属于正常情况,则不需要等待
            if (this.lastMilliseconds <= currentMilliseconds) {
                return false;
            } else {
            // 时钟回拨的情况(生成序列的时间大于当前系统的时间),需要等等待时间差
                long timeDifferenceMilliseconds = this.lastMilliseconds - currentMilliseconds;
               // 获取ID时的最后一次毫秒数减去当前系统时间毫秒数的时间差
				// 时间差小于最大容忍时间差,即当前还在时钟回拨的时间差之内
                Preconditions.checkState(timeDifferenceMilliseconds < (long)this.getMaxTolerateTimeDifferenceMilliseconds(), "Clock is moving backwards, last time is %d milliseconds, current time is %d milliseconds", new Object[]{this.lastMilliseconds, currentMilliseconds});
                // 线程休眠时间差
                Thread.sleep(timeDifferenceMilliseconds);
                return true;
            }
        } catch (Throwable var5) {
            throw var5;
        }
    }

具体业务中,使用该方法生成唯一账号

import org.apache.shardingsphere.core.strategy.keygen.SnowflakeShardingKeyGenerator;
public class IDUtil {

	private static SnowflakeShardingKeyGenerator shardingKeyGenerator = new SnowflakeShardingKeyGenerator();

    /**
     * 雪花算法生成器
     * @return
     */
    public static   Comparable<?> geneSnowFlakeID(){

        return shardingKeyGenerator.generateKey();
    }
}
//生成唯一的账号
accountDO.setAccountNo(Long.valueOf(IDUtil.geneSnowFlakeID().toString()));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2163332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决Android Studio 右上角Gradle不显示task

解决Android Studio 右上角Gradle不显示task_gradle中没有build task-CSDN博客 不正常的情况下 正常的情况下 解决方案 依次点击&#xff1a;File -> Settings -> Experimental -> 取消勾选 “Do not build Gradle task list during Gradle sync” 同步项目即可

[数据集][目标检测]基于yolov5增强数据集算法mosaic来扩充自己的数据集自动生成增强图片和对应标注无需重新标注

【算法介绍】 YOLOv5最引人注目的增强技术之一是马赛克增强&#xff0c;它将四张不同的图像拼接成一张图像。 思路&#xff1a;首先&#xff0c;从数据集中随机选择四张图像&#xff0c;然后将它们缩放、随机裁剪&#xff0c;并按马赛克模式拼接在一起。这种方式允许模型看到…

【逐行注释】MATLAB的程序,对比EKF(扩展卡尔曼滤波)和PF(粒子滤波)的滤波效果,附下载链接

文章目录 总述部分源代码运行结果扩展性 总述 本代码使用 M A T L A B MATLAB MATLAB实现了扩展卡尔曼滤波&#xff08; E K F EKF EKF&#xff09;和粒子滤波&#xff08; P F PF PF&#xff09;在状态估计中的对比分析。 主要功能包括&#xff1a; 参数设置&#xff1a;初始…

Android Studio 开发快速获取开发版和发布版SHA1和MD5

本文讲解Android Studio 开发中如何快速获取开发版和发布版SHA1和MD5。 一、获取开发版: 点击Android Studio右上角Gradle按钮,打开Gradle视图 找到项目-Tasks-signingReport 双击即可AndroidStudio底部 Run面板获取开发版SHA1和MD5 二、获取发布版:

《深入解析 Java 中的 ThreadLocal》

ThreadLocal 1.概述 ThreadLocal被称为线程局部变量&#xff0c;用于在线程中保存数据。由于在ThreadLocal中保存的数据仅属于当前线程&#xff0c;所以该变量对其他线程而言是隔离的&#xff0c;也就是说该变量是当前线程独有的变量。 ThreadLocal用于在同一个线程间&#…

STM32CubeIDE | 使用HAL库的ADC读取内部传感器温度

1、cubemx配置 1.1、系统配置 1.2、GPIO配置 PB2设置为“GPIO_Output” user label设置为“LED” 1.3、串口配置 模式选择为“Asynchronous”&#xff0c;其他默认 1.4、时钟树配置 全部保持默认 2、ADC配置 通道选择“Temperature Sensor Channel”&#xff0c;其他默认 …

基于STM32的Zeta型数控电源设计

本设计基于STM32F103C6T6为主控芯片&#xff0c;基于Zeta型DC/DC电源的拓扑结构设计一种数控电源。系统包含单片机主控模块、Zeta型升降压模块、驱动模块、电流采样模块、电压采样模块、OLED显示模块、电源模块及按键模块。用电流采样模块采集电流&#xff0c;电压采样模块采集…

Skyvern:基于LLM和CV的开源RPA

Skyvern 使用 LLM 和计算机视觉来自动化基于浏览器的工作流程。它提供了一个简单的 API 端点&#xff0c;可以完全自动化大量网站上的手动工作流程&#xff0c;从而取代脆弱或不可靠的自动化解决方案。 传统的浏览器自动化方法需要为网站编写自定义脚本&#xff0c;通常依赖于…

基于小安派AiPi-Eyes-Rx的N合1触摸屏游戏

基于小安派AiPi-Eyes-Rx的N合1触摸屏游戏 目前存在的游戏&#xff1a; 植物大战僵尸&#xff1a;demos/pvz羊了个羊&#xff1a;demos/yang消消乐&#xff1a;demos/xiaoxiaole华容道&#xff1a;demos/huarongdao PVZ功能展示可见&#xff1a; 羊了个羊&#xff1a; 消消…

在多态的方法调用中为什么会出现“左边编译左边运行”的现象?多态创建的对象到底是谁属于父类还是子类?通过深扒集合remove方法调用理解其原理

目录 “左边编译左边运行”的两个原因&#xff1a; 什么是“编译看左边&#xff0c;运行看右边”&#xff1f; 为什么会出现“左边编译左边运行”现象&#xff1f; 1. 子类没有重写父类的方法 2. 重载与重写的混淆&#xff08;重难点&#xff09; 问题&#xff1a;编译器是…

JAVA开源项目 体育馆管理系统 计算机毕业设计

本文项目编号 T 048 &#xff0c;文末自助获取源码 \color{red}{T048&#xff0c;文末自助获取源码} T048&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

每日论文1——应用于65nm CMOS锁相环完全电流匹配的电荷泵

《A Charge Pump with Perfect Current Matching Applied to Phase-Locked Loop in 65nm CMOS》2021 IEEE 14th International Conference on ASIC 电荷泵PLL的结构框图如图&#xff0c;其中CP的充放电电流不匹配会引起PLL的频率误差和杂散。 传统的电荷泵结构在输出处的电平…

强烈推荐的10款企业文件加密软件|2024企业办公文件加密

随着信息安全威胁的不断增加&#xff0c;企业文件加密成为保护敏感数据的重要手段。在2024年&#xff0c;有多款文件加密软件可供选择&#xff0c;帮助企业提高数据安全性。以下是十款强烈推荐的企业文件加密软件。 1.安秉加密软件 安秉加密软件专为企业设计&#xff0c;主要用…

【Web】初识Web和Tomcat服务器

目录 前言 一、认识web 1. 软件架构模式 2. web资源 3. URL请求路径&#xff08;统一资源定位符&#xff09; 二、Tomcat服务器 1. 简介 2. tomcat服务器的目录结构 3.使用tomcat服务器启动失败的常见原因 3.1 端口冲突 3.2 jdk环境变量配置出错 三、使用Tomcat发布…

OpenSSH9.7升级至OpenSSH9.9(openssh7以后所有版本升级均可使用该方法)

1、查看当前openssh版本&#xff0c;使用命令ssh -V 2、开启当前主机的telnet和ftp service xinetd start #开启telnetservice vsftpd start #开启ftp 3、下载openssh最新版 下载地址: OPENSSH下载地址https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/ 4、开始安…

【Redis入门到精通五】Java如何像使用MySQL一样使用Redis(jedis安装及使用)

目录 Jedis 1.jedis是什么 2.jedis的安装配置 3.jedis的基础命令操作展示 1.set和get操作&#xff1a; 2.exists和del操作&#xff1a; 3.keys和type操作&#xff1a; 4. expire和ttl&#xff1a; Jedis Java 操作 redis 的客⼾端有很多&#xff0c;其中最知名的是 jedi…

大模型备案和互联网算法备案的区别?

最近&#xff0c;接到很多客户的电话咨询大模型备案和互联网算法备案&#xff0c;好多人搞不清楚这两个有什么关系&#xff1f;有什么区别&#xff1f;我们先来看下全国大模型备案和互联网算法备案通过的情况是怎么样的&#xff1f; 截至写稿之时&#xff0c;全国通过大模型备…

2024最新最全【Qubes Linux系统安装下载】零基础入门到精通!

Qubes Linux的安装和设置过程非常简单。它也是一个以安全为中心的桌面操作系统&#xff0c;旨在通过隔离提供安全性&#xff0c;这对于系统管理员、记者和有道德的黑客来说是一个很好的卖点。 Qubes是一个使用Xen的 Linux 发行版&#xff0c;这是一种虚拟化技术&#xff0c;它…

卫星图片地面目标识别检测数据集 1500张 yolo数据集 已增强

卫星图像地面目标识别数据集&#xff08;Satellite Image Ground Target Recognition Dataset, SIGTRD&#xff09; 摘要 SIGTRD 是一个专门为卫星图像中的地面目标识别而设计的数据集&#xff0c;它包含了一系列常见的基础设施和交通工具类型。该数据集提供了1500张卫星图像…

基于单片机的指纹打卡系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC&#xff0c;采用两个按键替代指纹&#xff0c;一个按键按下&#xff0c;LCD12864显示比对成功&#xff0c;则 采用ULN2003驱动步进电机转动&#xff0c;表示开门&#xff0c;另一个…