分库分表-ShardingSphere

news2024/11/17 16:03:59

分库分表拆常见分方法与特点

分片策略

数据分布

以后扩展

基于Hash:hash(分片键)%分片数

数据分布均匀

不易扩容,扩容需要数据迁移

范围分片:例如按年分,按月,按日

数据分表可能不均匀

易扩展,扩展不需要数据迁移

分库分表的常见问题与解决方式

如何确定最初需要多少张表?

一般考虑10年的数据量即可,如果是基于Hash,扩容需要再次迁移

分库之后Join如何处理?

如果是绑定表,即有关联的一组表,例如订单与订单详情表,使用同一个分库分表策略。

如果要join的表,是个字典表(表小,数据变动不大),建议做成广播表,所有的库都有存一份。

如果就是落在不同的库,例如订单,商品,可以采取 CQRS或者API Composition

用户分表了,某个用户手机号,找到用户信息?

加一张关联表, phone -> userId, 先根据phone 查找userId,之后根据userId ,查询订单表

分库分表后全局唯一ID如何生产?

  • UUID,无序,写入性能差
  • snowflake·: ShardingSphere提供这个算法, 有序,写入性能好,生成性能无上限。
  • 利用Redis作为发号器: String 类型 key:yyyyMMddHHmmssSSS value: 序号 防止时钟不准,key的有效时间为:30s,生产性能受到redis限制,一般业务够用

ShardingSphere 分片流程

分片流程:解析--> 路由->改写->执行->归并

解析 SQLParserEngine

1.解析成AST 语法树 官网图片如下:

 

2.提取SQLSegment

3.填充SQL语句 SQLStatement

路由SQLRouteEngine

获取SQLRouteExecutor 并执行

创建ShardingConditions

对SQLStatement进行校验。

调用链条

 

StandardShardingStrategy 内部doSharding方法 对精准和范围均有支持

PreciseShardingValue 处理精准分片 = ,in

RangeShardingValue 处理范围分片 >,>=,

从ShardingStrategy 的生命可以得出:分片 = 分片键+ 分片算法

public interface ShardingStrategy {
    // 分片键
    Collection<String> getShardingColumns();
    // 算法
    ShardingAlgorithm getShardingAlgorithm();
    //分片方式
   Collection<String> doSharding(
   Collection<String> availableTargetNames, 
   Collection<ShardingConditionValue> shardingConditionValues, 
   DataNodeInfo dataNodeInfo, 
   ConfigurationProperties props);
}

 改写SQLRewriteEntry

调用链条

 

扩展 - 装饰者模式

不改变对象结构,动态给该对象,添加额外的功能。

标准类图,ShardingSphere 改写部分的 略有不同。

 执行ExecutorEngine

官网图

 

 

连接模式说明

public enum ConnectionMode {

MEMORY_STRICTLY, CONNECTION_STRICTLY

}

MEMORY_STRICTLY 内存模式,适合OLAP,并行处理

  • Sharding Sphere 一次性获取所需的数据库连接。
  • 只需获取一个数据库的连接不加锁

CONNECTION_STRICTLY 连接模式,适合OLTP,串行处理。

配置项

props:

max-connections-size-per-query: 1

默认为1 ,标示使用CONNECTION_STRICTLY

自动控制算法

内部自动选择算法,位于AbstractExecutionPrepareEngine#prepare

ConnectionMode connectionMode = 
maxConnectionsSizePerQuery < sqlUnits.size()
 ? ConnectionMode.CONNECTION_STRICTLY 
 : ConnectionMode.MEMORY_STRICTLY;

maxConnectionsSizePerQuery 用户的配置

sqlUnits.size() 路由引擎产生的Sqlunits数,粗暴的理解:要查询的SQL语句数

归并MergeEngine

官网流程

流式归并:

每一次从结果集中获取的数据,都能通过逐条的方式返回正确的单条数据,就会流式归并

流式与内存互斥。

核心接口MergedResult 实现

分页LimitDecoratorMergedResult 是装饰者模式,在skipOffset(),跳过了不需要的数据,不会存在内存中。

 

public final class LimitDecoratorMergedResult extends DecoratorMergedResult {
    
    private final PaginationContext pagination;
    
    private final boolean skipAll;
    
    private int rowNumber;
    
    public LimitDecoratorMergedResult(final MergedResult mergedResult, final PaginationContext pagination) throws SQLException {
        super(mergedResult);
        this.pagination = pagination;
        skipAll = skipOffset();
    }
    
    private boolean skipOffset() throws SQLException {
        for (int i = 0; i < pagination.getActualOffset(); i++) {
            if (!getMergedResult().next()) {
                return true;
            }
        }
        rowNumber = 0;
        return false;
    }
    
    @Override    public boolean next() throws SQLException {
        if (skipAll) {
            return false;
        }
        if (!pagination.getActualRowCount().isPresent()) {
            return getMergedResult().next();
        }
        return ++rowNumber <= pagination.getActualRowCount().get() && getMergedResult().next();
    }
}

AggregationUnitFactory 能查到对应的聚合函数

    public static AggregationUnit create(final AggregationType type, final boolean isDistinct) {
        switch (type) {
            case MAX:
                return new ComparableAggregationUnit(false);
            case MIN:
                return new ComparableAggregationUnit(true);
            case SUM:
                return isDistinct ? new DistinctSumAggregationUnit() : new AccumulationAggregationUnit();
            case COUNT:
                return isDistinct ? new DistinctCountAggregationUnit() : new AccumulationAggregationUnit();
            case AVG:
                return isDistinct ? new DistinctAverageAggregationUnit() : new AverageAggregationUnit();
            case BIT_XOR:
                return new BitXorAggregationUnit();
            default:
                throw new UnsupportedSQLOperationException(type.name());
        }
    }

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

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

相关文章

API自动化测试利器Postman,帮助你更好地进行 API 自动化测试

目录 前言&#xff1a; 一、基本功能 二、测试工具 三、示例 前言&#xff1a; Postman 是一个易于使用的 API 开发和测试工具&#xff0c;可以在其中快速构建、测试和文档化 Web API。Postman 提供了一个直观的用户界面&#xff0c;可以轻松地创建 HTTP 请求、测试响应、…

深入解析XMLHttpRequest:实现异步通信的利器

文章目录 介绍什么是XMLHttpRequest&#xff1f;XMLHttpRequest的基本用法1.创建XMLHttpRequest对象2.配置请求3.发送请求 XMLHttpRequest 属性sendreadyStatestatusstatusTextresponseresponseTextresponseTyperesponseURLtimeoutwithCredentials 异步请求与同步请求请求类型和…

淡季,老手买入的季节。

刚在刷抖音&#xff0c;刷到马云的视频。心里在想&#xff1a;这么大的企业家大富豪怎么会哽咽呢&#xff1f;他缺钱吗&#xff1f;他需要为生存奋斗吗&#xff1f; 他当然不缺钱&#xff0c;也不需要为生存去奋斗。如果以家庭生活支出来算&#xff0c;他的钱够几代儿孙挥霍了。…

漂亮国因一颗气球而疯狂给质量团队带来的启示

最近漂亮国因为我国的一颗漂洋过海的淘气的民用气球而疯狂。这颗气球成功躲过了号称全球最先进的防空系统&#xff0c;跨越大半个漂亮国&#xff0c;直到被一居民拍照无意间发现&#xff0c;漂亮国才反应过来。多次派战斗机拦截无果&#xff0c;在气球降到15km后&#xff0c;F2…

数据链路层之以太网协议基本知识总结分享

目录 1. 以太网协议报文格式 2. MTU是什么?它对哪些协议有影响? 1. 以太网协议报文格式 这里的目的地址不是ip地址,是Mac地址,mac地址是6个字节,比ipv4地址大了2个字节,当前的mac地址是可以让每个设备都是唯一的,且不需要动态分配,一般是网卡出厂就分配好了的.这就代表我们…

【他山之石】基于Echarts表格的时间线(轴)组件触发时间变化事件,带多种方案比较

【他山之石】基于Echarts表格的时间线组件触发时间变化事件 1 背景2 调整思路3 函数监听 1 背景 在开发中遇到一个场景&#xff1a;要展示的数据随着时间的变化发生改变&#xff0c;有以下几点要求的的时间线。 水平方向可以切换时间变化&#xff0c;带播放按钮时间节点背景图…

chatgpt赋能python:Python编程:如何删除前面的代码?

Python编程&#xff1a;如何删除前面的代码&#xff1f; 在Python编程中&#xff0c;我们有时会需要删除之前写的一些代码&#xff0c;以便更好地组织我们的代码结构和逻辑。那么&#xff0c;Python中如何删除前面的代码呢&#xff1f;在本文章中&#xff0c;我们将为您详细介…

python字符串格式化通过占位符拼接

我之前写了python字符串拼接 但我们会发现 它不太好用 第一个 当变量很多的时候 会写的很长 第二个 是python中字符串不能直接和其他类型的变量拼接 字符串格式化 也属于是字符串拼接的一种方法 语法上不是使用加号 我们打开编辑器 编写代码如下 weight 8.70; age 2; name…

Nvidia AGX Orin MAX9296 /MAX9295驱动寄存器配置

MAX9295 配置说明 1.Max9295 的功能及应用 MAX9295 是把 MIPI CSI-2 转化成 GMSL2 或者 GMSL1 信号&#xff0c;该信号是可以通过 15m 长的线缆发送或接受控制数据以及传递 video 数据和双向的控制数据。 GMSL2 有固定的速率&#xff0c;正向的速率为 3Gbps 或者 6Gbps &…

SpringBoot整合Flyway实现数据库的初始化和版本管理

文章目录 一、Flyway1、介绍2、业务痛点3、个人理解 二、SpringBoot整合flyway1、整合2、SQL文件命名3、版本号校验算法4、工作流程5、注意事项 一、Flyway 1、介绍 Flyway 是一款开源的数据库版本管理工具。它可以很方便的在命令行中使用&#xff0c;或者在Java应用程序中引入…

win10无法使用浏览器上网问题总结贴(附带解决办法)

现象 电脑连接WIFI之后&#xff0c;可以登录微信但是一直打不开网页&#xff0c;其它软件也无法联网。 解决办法 重启大法 遇到这种问题通常最简单有效的办法就是&#xff0c;重启电脑&#xff0c;然而在我重启完成之后还是这样无法使用浏览器上网疑难解答 使用win10的疑难解…

【EraAI智能写作助手】一键生成精准文案,让创作更高效

一键生成精准文案&#xff0c;让创作更高效&#xff01; 传送门【EraAI智能助手】&#xff1a; txt.eraai.cn 亲爱的文案创作者和营销人员&#xff0c;您是否常常为文案创作而烦恼&#xff1f;现在&#xff0c;有了EraAI智能助手&#xff0c;让您的创作事半功倍&#xff01;我…

Qt详解实现TCP文件传输例子(文件下载和上传)附源码

网络通信我们用的很频繁&#xff0c;如文字&#xff0c;语音&#xff0c;文件&#xff0c;图片等&#xff0c;这个些传输方式都差不多 QT文件传输主要考验对传输的控制&#xff0c;还是需要点逻辑的&#xff0c;文件传输的大致框架如下 先看一下简单例子实现的效果&#xff08…

【Python】使用pdf2docx库将.pdf转化为.docx

1、使用VS code搭建Python编译环境 2、安装pdf2doc库1 pip install pdf2docx3、编写代码 3.1 使用parse将pdf转化为docx 编写 pdf2docxParse.py from pdf2docx import parse # 文件名 pdf_file demo-image-overlap.pdf docx_file demo-image-overlap.docx# 将pdf转为doc…

vue 3 第三十六章:vite环境变量(.env文件的配置及使用)

文章目录 1. 环境变量使用场景2. 创建.env文件3. 在应用程序中使用环境变量3.1. 输出结果&#xff08;开发环境&#xff09;&#xff1a;3.2. 输出结果&#xff08;生产环境&#xff09;&#xff1a; 4. 在 vite 中使用环境变量 1. 环境变量使用场景 区分不同的环境。在Vite中…

【LeetCode】160. 相交链表

160. 相交链表&#xff08;简单&#xff09; 题解 对于这道题&#xff0c;首先要理解题意&#xff1a;如果两个单链表会相交&#xff0c;那么返回相交的起始节点&#xff1b;否则返回 null。 无需看“自定义评测”部分。 假设链表 A 的头节点到相交点的距离为 a&#xff0c;链…

S32K324芯片学习笔记-Clock

文章目录 Clock详解特征时钟生成MC_CGM mux 0时钟时钟输出概述其他时钟整体框图时钟源芯片时钟源芯片输入时钟芯片输出时钟FIRC快速内部RC振荡器待机模式下的FIRC_CLK行为 SIRC慢速内部RC振荡器待机模式下的SIRC行为 FXOSC快速外部晶振慢速外部晶振PLL锁相环配置PLL配置序列 芯…

QPushButton 基本使用

〇、PyQt 中的 Button 相关类介绍 PyQt 提供了多种按钮类&#xff0c;用于创建各种类型的按钮。这一部分将打算介绍一下 PyQt 各种 Button 及相关类&#xff0c;并扩展 Button 的功能用法&#xff0c;让你能够打造自己的个性化 Button 。在下面&#xff0c;我先来介绍 PyQt 中…

数据库系统理论 -- 关系查询处理和查询优化

本篇文章会先介绍数据库的查询处理&#xff0c;然后介绍数据库的查询优化。其中查询优化分为代数优化和物理优化。代数优化是指关系表达式的优化&#xff0c;物理优化是指通过存取路径和底层操作算法的选择进行优化。 查询处理 查询分析查询检查查询优化查询执行 查询分析 …

JNI开发Tips

异常的检测和打印&#xff1a; c中Native代码调用JNI的时候如果产生了异常不会展开原生堆栈&#xff1a; 所以在cJNI调用的时候构造一个FindClass时找不到类的异常&#xff0c;我们看到的实际的崩溃堆栈会是下面的样子&#xff0c;看不到c层代码的调用链路&#xff1a; 在JNI…