Sharding sphere分库分表

news2024/11/23 18:48:51

需要物理自己实现分表分库,然后通过配置文件配置。

配置文件:

需要配置多个数据源,主从表的关系【默认主表修改,从表读取】,定义分库的策略【比如User id】和分表【表Id】的策略

  • 分库和分表策略:分库策略定义了如何将数据分配到不同的数据库中,例如,可以根据用户ID的范围来进行分库。分表策略定义了如何将数据在表级别进行分片,例如,可以根据表ID来进行分表。

过程:

从解析sql到路由sql再到改写sql最后到sql执行然后将数据归并回来,改写过程中可能会增加列,因为路由的时候需要聚合或者分组需要带上某些id。

  • 解析SQL:当 ShardingSphere 接收到一个 SQL 语句时,它首先解析该语句以理解其结构和内容。

  • 路由SQL:根据解析后的信息和分库分表策略,ShardingSphere 决定这个 SQL 语句应该发送到哪个数据库实例和具体的表上执行。

  • 改写SQL:在路由决定后,ShardingSphere 可能需要修改原始的 SQL 语句以适应目标数据库实例和表,比如修改表名为实际的分片表名。

  • SQL执行:改写后的 SQL 语句被发送到目标数据库实例执行。

  • 归并数据:如果一个查询操作涉及到多个数据库实例或表,ShardingSphere 会收集所有返回的数据,然后将它们归并在一起返回给用户。归并过程中可能会涉及到排序、分组、聚合等操作。

改写过程中可能会增加列:在 SQL 改写的过程中,可能需要增加额外的信息,比如分片键列,以确保数据的一致性和正确的归并操作。

总体来讲,ShardingSphere 通过这个过程,对外提供了一个透明的数据库分库分表操作,对应用层来说,它就像访问单一数据库一样。这个架构能够在不更改应用程序代码的情况下,对数据库进行水平扩展,提升了系统的可扩展性和可用性。

举个例子

假设我们有一个 User 表,它非常大,包含数百万用户数据。为了提高查询性能和数据的可管理性,我们决定将这个 User 表进行分库分表。

分库策略

我们可以根据用户的地理位置(例如用户的国家码)来进行分库。假设我们有三个数据库实例,Database A、Database B 和 Database C,我们可以这样分配:

  • Database A 存储国家码为1的用户数据
  • Database B 存储国家码为2的用户数据
  • Database C 存储国家码为3的用户数据

这种策略可以通过配置 ShardingSphere 来实现。当一个请求进来时,ShardingSphere 查看用户的国家码,然后决定将请求路由到哪个数据库实例。

分表策略

对于每个数据库实例中的 User 表,我们还可以根据用户的 ID 进行分表。假设我们决定每张表存储10000条用户记录,我们可以有如下的分表:

  • User_0001 存储 ID 1 到 10000 的用户数据
  • User_0002 存储 ID 10001 到 20000 的用户数据
  • User_0003 存储 ID 20001 到 30000 的用户数据
  • 依此类推...

这样,当我们有一个查询请求来查找 ID 为 15000 的用户时,ShardingSphere 首先通过分库策略确定这个用户在哪个数据库实例,然后通过分表策略确定这个用户在哪张表中。如果 ID 15000 的用户属于国家码为2的范围,则 ShardingSphere 将查询路由到 Database B 的 User_0002 表中。

配置分库分表策略的关键是确定分片键(Sharding Key),它是用于分片的字段。在我们的例子中,国家码可以是分库的分片键,用户 ID 可以是分表的分片键。

通过以上方式,ShardingSphere 能够管理大规模分布式数据库系统,提升性能,降低单个数据库的压力。这是实现大规模数据库水平扩展的常用方法。

执行

执行有2种模式:内存限制【做分析的数据库,连接量不高,聚合运算和数据量比较多】和连接限制【事务型数据库 连接限制比较大】,

在数据库管理和优化中,根据不同的使用场景,数据库系统可能会被配置为不同的执行模式,特别是在处理资源分配和性能优化时。这里描述的“内存限制”和“连接限制”模式反映了两种不同的资源管理策略:

  1. 内存限制模式: 在内存限制模式下,数据库系统的主要瓶颈是内存资源。这种模式适用于那些需要进行大量数据处理和复杂查询的数据库,如数据仓库、分析型数据库或报表系统。这些系统往往执行大规模的聚合和分析运算,需要缓存大量数据来计算结果。由于查询的复杂性和数据量的大小,数据库的内存使用变得非常关键。

    在内存限制模式下,数据库管理员可能需要精细地配置内存管理参数,例如缓存大小、查询执行内存限制等,以防止查询操作消耗过多的内存而影响到整个数据库系统的稳定性。

  2. 连接限制模式: 在连接限制模式下,数据库系统的主要瓶颈是并发连接数量,也就是同时连接到数据库的客户端数量。这种模式适用于那些以事务处理为主的数据库,如在线事务处理系统(OLTP),这类系统通常处理大量的短期交易。

    事务型数据库通常需要优化连接池,及时释放不活跃连接,并确保数据库能够高效地处理大量并发事务。在这种模式下,数据库管理员可能需要配置诸如最大连接数、连接超时时间、事务隔离级别等参数,以提高并发处理能力并保证数据的一致性。

在实际的生产环境中,选择合适的模式是根据应用的特性和需求来决定的。对数据库系统进行适当的配置和调优可以帮助达到最佳的性能表现和资源利用率。例如,对于一个分析型数据库,可能会分配较多的内存给数据处理和聚合计算;而对于一个高并发的Web应用,可能需要优化数据库的连接池和事务处理能力。

以下是在使用 ShardingSphere 时可以考虑的一些通用配置方向:

  1. 针对内存限制

    • 如果你的应用主要进行复杂查询和大量的数据聚合,你可能需要为每个数据库实例配置足够的内存,以支持这些操作。这可能包括调整数据库缓存大小、工作内存(比如 PostgreSQL 的 work_mem)和其他相关内存参数。
    • 在 ShardingSphere 配置中,你可能需要关注 SQL 执行的优化,确保复杂查询能够有效分发到合适的分片上执行。
  2. 针对连接限制

    • 对于需要处理高并发事务的应用,确保数据库连接池参数(如最大连接数、最小空闲连接数、连接超时时间等)得到适当配置非常关键。
    • ShardingSphere 可以配置读写分离规则,将读操作路由到从库从而减轻主库的压力。
    • 考虑使用数据库连接池(如 HikariCP、DBCP、C3P0 等)来管理数据库连接。
  3. 分片策略配置

    • 对于分库分表策略,合理地定制分片算法和分片键可以帮助平衡跨多个数据库实例和表的数据分布和查询负载。
  4. 监控和调试

    • 启用监控功能来跟踪数据库的性能和资源利用情况,这样你可以在出现性能瓶颈时快速定位问题并进行优化。

在配置 ShardingSphere 或任何数据库中间件时,重要的是要充分理解你的业务需求和数据库的负载特征,以便做出恰当的决策。建议在进行任何重大更改之前对配置进行测试,以确保它们能够达到预期的效果,并且不会对现有的系统产生负面影响。

最佳配置很大程度上取决于具体的应用场景,包括数据模式、访问模式、硬件资源和性能目标。因此,最好的做法是进行基准测试和监控来逐步调整和优化设置。

逻辑表:没有后缀的表,前缀一致的表,分表前的名字

真实表:分表后的完整名

绑定表:用同样的分片逻辑能保持一致,不会出现太多笛卡尔积的结果

广播表:每个库都有的表,就是字典表

建议:自研,适合自己的业务才是最合适的。

在使用分库分表框架,如 Apache ShardingSphere 进行数据库设计时,你会遇到几个专有名词:逻辑表、真实表、绑定表和广播表。以下是它们的含义:

  1. 逻辑表 (Logical Table): 逻辑表是指用户在编写 SQL 时使用的表名。这个名称并不对应数据库中的实际物理表,而是一个虚拟的概念,代表了可能分散在多个真实表或分片表中的数据集合。在分库分表策略中,逻辑表通常由多个真实表组成,它们共同承载了逻辑表数据。

    例如,你有一个逻辑表 user,它由 user_0, user_1, user_2 等真实表组成。

  2. 真实表 (Actual Table): 真实表或物理表是指数据库中实际存在的表。这些表是根据分表策略从逻辑表中分出来的,每个真实表存储逻辑表的一部分数据。

    如果逻辑表 user 根据用户 ID 分为三个真实表,那么 user_0, user_1, user_2 就是具有特定后缀的真实表的名称。

  3. 绑定表 (Binding Table): 绑定表是指一组逻辑表,它们之间有着相同的分片策略。在进行关联查询时,绑定表之间的数据分布方式保证了关联查询可以在相同的数据节点上执行,从而避免跨节点的关联操作,这有助于减少不必要的数据笛卡尔积和网络开销。

    举例来说,如果 orderorder_item 是绑定表,并且它们按照相同的订单 ID 进行分片,当你根据订单 ID 关联这两个表时,查询会自然地在相同分片上执行。

  4. 广播表 (Broadcast Table): 广播表是一个特殊的表,它的数据在所有的数据库实例中都是一样的。通常用于那些数据量小但需要频繁访问的公共数据,例如配置数据、字典数据等。

    在分库的环境下,广播表会在每个数据库实例中都有一份完整的副本。例如,一个包含国家代码和名称的 country 表可能就是一个广播表,因为每个数据库实例都需要访问这些共享数据。

当你设计和实施分库分表策略时,理解这些概念是很重要的,因为它们会影响你的数据模型、查询性能和整体架构。ShardingSphere 和其他分库分表解决方案都依赖于这些概念来有效地管理和路由数据。

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

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

相关文章

K8S之持久化存储

持久化存储 支持的持久化存储类型EmptyDirHostPathNFS 在K8S中部署的应用都是以pod容器的形式运行的,假如部署数据库服务 例如:MySQL、Redis等,需要对产生的数据做备份。如果pod不挂载数据卷,那pod被删除或重启后这些数据会随之消…

双指针 | 移动零 | 复写零

1.移动零 题目描述: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]解题思路: right指针一直往后移动,当…

LAMP架构部署--yum安装方式

这里写目录标题 LAMP架构部署web服务器工作流程web工作流程 yum安装方式安装软件包配置apache启用代理模块 配置虚拟主机配置php验证 LAMP架构部署 web服务器工作流程 web服务器的资源分为两种,静态资源和动态资源 静态资源就是指静态内容,客户端从服…

MATLAB环境下基于可调Q因子小波变换的滚动轴承故障诊断(MATLAB R2021B)

小波变换是一种时频局域化方法,它的窗口面积固定但形状可以发生改变(时间窗与频率窗均可变化)。小波变换在时间域与频率域都能够表示信号的局部特征,并具有多分辨率分析的特点,是机械故障诊断中常用的方法。小波变换故…

【机器学习系列】M3DM工业缺陷检测部署与训练

一.基础资料 1.Git 地址 地址 2.issues issues 3.参考 参考 csdn 二.服务器信息 1.GPU 服务器 GPU 服务器自带 CUDA 安装(前提是需要勾选上)CUDA 需要选择大于 11.3 的版本登录服务器后会自动安装 GPU 驱动 2.CUDA 安装 GPU 服务器自带 CUDA CUDA 版本查看 3.登录信…

deepseek-coder模型量化

1 简介 DeepSeek-Coder在多种编程语言和各种基准测试中取得了开源代码模型中最先进的性能。 为尝试在开发板进行部署,首先利用llama.cpp对其进行量化。 2 llama.cpp安装 git clone之后进入文件夹make即可,再将依赖补全pip install -r requirements.tx…

蓝桥杯2023年省A(一波三折的)【买瓜】折半搜索+剪枝+排序

题目:洛谷 P9234 [蓝桥杯 2023 省 A] 买瓜 折半搜索 一开始觉得像dp,试着写了,显然过不了,但我实在觉得搜索也过不了啊,去看题解,发现使用了折半搜索(每天都觉得啥都不会捏 折半搜索就是先搜一…

Elasticsearch 主副分片切换过程中对业务写入有影响吗

🍊🍉🍋 先说下结论,只要集群中的工作节点过半,有候选的master节点,挂掉的节点中不同时包含索引的主分片和副分片,那么ES是可以做到让业务无感知的进行主副分片切换的。 蓝胖子会先讲解下ES集群写…

Oracle P6 Professional 配置连接数据库总结

前言 P6 Professional作为Oracle P6计划管理系统的重要套件之一,其操作出色,体检佳,是非常多的计划工程师跟踪项目进度计划的辅助工具。自20年前,Professional一直在不断的演变更新,以适应当前的新技术,从…

从零开始搭建游戏服务器 第三节 Protobuf的引入并使用

目录 上一节问题答案公布本节内容Protobuf介绍正文在build.gradle引入protobuf编写proto并生成使用生成的proto来进行数据传输 总结 上一节问题答案公布 上一节我们创建了ConnectActor,并且使用ConnectActorManager和connectId将其管理起来。 并且我们在收到客户端…

掌握C#: 从基础到精通 - 中级实战练习集

文章目录 异常处理尝试-捕获结构 文件 I/O 练习追加而不覆盖处理目录 LINQ 查询练习筛选集合中的对象排序复杂对象 类与对象练习继承与多态性 你是否已经掌握了C#的基础知识,正在寻找更多挑战来提升你的能力?那么,这篇文章就是为你准备的。我…

实锤!北大学者证实富钾盐代替食盐可安全降低高血压风险,发文顶刊JACC

编者 “要注意饮食,减少食盐摄入”这是高血压患者就诊时,医生说的最多的一句话。虽然低盐可以预防高血压,但国人食盐摄入量还是高于世界卫生组织(成人每天摄入盐不超过5克)的建议。 好在“天无绝人之路”,一…

人脸检测的5种实现方法

众所周知,人脸识别是计算机视觉应用的一个重大领域,在学习人脸识别之前,我们先来简单学习下人脸检测的几种用法。 常见的人脸检测方法大致有5种,Haar、Hog、CNN、SSD、MTCNN: 相关构造检测器的文件:opencv…

Java实现简单的通讯录

每日一言 泪眼问花花不语,乱红飞过秋千去。 —欧阳修- 简单的通讯录实现,跟写Java实现图书管理系统差不多,用到的知识也差不多,就当个小练习,练习一下写Java程序的手感。 Java实现图书管理系统 关于通讯录的代码都写…

P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值:做题笔记

目录 思路 代码 注意点 题目链接: P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值 (可跳) 这道题刚看到的时候想着主要就是算出每层2的次方个节点的权值和。 我的思路经过了很多次缝缝补补。创建一个sum数组,下标表示深度,每个元素代表…

Unity游戏项目接广告

Unity游戏项目中接入GoogleAdMob 先看效果图 接入测试横幅广告,代码如下: using System.Collections; using System.Collections.Generic; using UnityEngine; using GoogleMobileAds.Api; using System;public class GoogleAdMobManager : MonoBehaviour {private static …

C语言初学12:强制类型转换

一、强制数据类型转换举例 1.1 double赋值给int #include<stdio.h> int main() {double sum 18, count 5;int mean;mean sum / count;printf("Value of mean : %d\n", mean);} 执行结果&#xff1a; double赋值给int&#xff0c;小数部分会删除&#xff…

存内领域前沿,基于忆阻器的存内计算----浅析忆阻存内计算

目录 一.概念浅析 1.存内计算 2.忆阻器 3.基于忆阻器的存内计算 二.忆阻器的分类 1.磁效应忆阻器 2 .相变效应忆阻器 3 .阻变效应忆阻器 三.基于忆阻器的存内计算原理 1. 利用二值忆阻器的布尔计算 3.1R-R 逻辑运算 3.2V-R 逻辑运算 3.3V-V 逻辑运算 2. 利用模拟…

旋转中心 机械手抓料方式

一、为什么要计算旋转中心&#xff1f; 机器视觉——旋转中心的标定_旋转标定-CSDN博客 在机械手抓料的时候传送带上过来的料可能是各个角度的&#xff0c;不同的位置&#xff0c;这样如果我们没有做好机械手标定的话很难抓取&#xff0c;因此我们要做旋转中和和机械手TCP标定…

Oracle19c静默部署

Oracle19c静默部署文档 下载地址 https://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_free 一、系统基础配置 1、创建用户和用户组 # 创建oinstall和dba用户组 groupadd oinstall groupadd dba# 创建Oracle用户 useradd -g oinstall…