Sharding-jdbc

2023-11-09

一、概念理解
  1. 垂直切分:包含垂直分库和垂直分表

1.1、垂直分库 :专库专用(按照业务类型对表分类)

1.2、垂直分表:基于数据表的列(字段)为依据切分的,是一种大表拆小表的模式。

1.3、垂直切分优点:

·不同业务的数据进行独立维护,监控,扩展;

·在高并发场景下,一定程度上缓解了数据库的压力。

1.4、垂直切分的缺点:

·提高了开发的复杂度,由于业务的隔离性,很多表无法直接访问,必须通过接口方式聚合数据;

·分布式事务管理难度增加;

·数据库还是存在单表数据量过大问题。

  1. 水平切分

2.1、水平分库:把同一个表按一定规则拆分到不同的数据库中,每个库都可以位于不同的服务器上。

水平分库可以解决单库存储量以及性能瓶颈问题,但由于同一个表被分在不同数据库中,数据访问需要额外的路由工作,因此系统的复杂度也被提升。

2.2、水平分表:是在同一个数据库内,把一张大数据量的表按一定规则,切分成多个结构完全相同的表,而每个表只存原表的一部分数据。

只解决了单一表数据量过大的问题。

2.3、水平切分的优点:

·解决高并发时单库数据量过大的问题,提升系统稳定性与负载能力;

·业务系统改造的工作量不是很大。

2.4、水平切分的缺点:

·跨分片的事务一致性难以保证;

·垮库的join关联查询性能比较差;

·扩容的难度和维护量比较大。

  1. 一定规则:

·这个规则是一种路由算法,就是决定一条数据具体应该存在那个数据库那张表里。常见的有 取模算法 和 范围限定算法。

3.1、取模算法:按照字段取模(对hash结果取余数 (hash() mod N))n为数据库实例数或者子表数量,是最为常见的一种切分方式。

优点:数据分片相对比较均匀,不易出现请求都打到一个库上

缺点:这种算法存在问题当某台机器宕机,本应该落在该数据库的请求就无法得到正确的处理,这时候宕掉的实例会被踢出集群,姿势的算法变成hash(userId) mod N-1,用户信息可能就不再在同一个库中了。

3.2、范围限定算法:按照 时间区间 或者 ID区间 来切分。

优点:·单表数据量是可控的

·水平扩展简单只需增加节点即可,无需对其他分片数据进行迁移

·能快速定位要查询的数据在哪个库

缺点:由于连续分片可能存在数据热点,会存在默写数据频繁查询某些数据很少查询。

4.分库分表的难点

4.1、分布式事务

由于表分布在不同的库中,不可避免会带来垮库事务的问题。一般可使用“三阶段提交”和“两阶段提交”处理,但是这种方式性能很差,代码开发量也比较大。

·阿里的分布式事务框架Seata 来做分布式事务的管理

4.2、分页、排序、垮库联合查询

分页、排序、联合查询是开发中使用频率非常高的功能,但在分库分表后,这些看似普通的操作却是让人非常头疼的问题。将分散在不同库中表的数据查询出来,再将所有结果进行汇总整理后提供给用户。

4.3、分布式主键

分库分表后数据库的自增主键意义就不大了,因为我们不能依靠单个数据库实例上的自增主键来实现不同数据库之间的全局唯一主键,此时一个能够生成全局唯一ID的系统是非常必要的,那么这个全局唯一ID就叫 分布式ID。

4.4、读写分离

大部分主流的关系型数据库都提供了主从架构的高可用方案,而我们需要实现读写分离 + 分库分表,读库与写库都要做分库分表处理

4.5、数据脱敏

5、sharding-jdbc

·是一款轻量级的java框架,以jar包形式提供服务,是属于客户端产品不需要额外的部署,它相当于是个增强版的jdbc驱动。

·兼容性也非常强大,适用于任何基于jdbc的orm框架,如:JPA, Hibernate,Mybatis,Spring JDBC Template 或直接使用的 JDBC。

·完美兼容任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP,Druid, HikariCP 等,几乎对所有关系型数据库都支持。

·对项目的侵入性很小,几乎不用做任何代码层的修改,也无需修改 SQL 语句,只需配置待分库分表的数据表即可。

二、分片规则

上边我们提到可以用分片健取模的规则分片,但这只是比较简单的一种,在实际开发中我们还希望用 >=、<=、>、<、BETWEEN 和 IN 等条件作为分片规则,自定义分片逻辑,这时就需要用到分片策略与分片算法。

从执行 SQL 的角度来看,分库分表可以看作是一种路由机制,把 SQL 语句路由到我们期望的数据库或数据表中并获取数据,分片算法可以理解成一种路由规则。

  1. 标准分片策略

使用场景:SQL 语句中有>,>=, <=,<,=,IN 和 BETWEEN AND 操作符,都可以应用此分片策略。

标准分片策略(StandardShardingStrategy),它只支持对单个分片健(字段)为依据的分库分表,并提供了两种分片算法 PreciseShardingAlgorithm(精准分片)和 RangeShardingAlgorithm(范围分片)。

一旦我们没配置范围分片算法,而 SQL 中又用到 BETWEEN AND 或者 like等,那么 SQL 将按全库、表路由的方式逐一执行,查询性能会很差需要特别注意。

  1. 精准分片算法

  1. 精准分库算法

实现自定义精准分库、分表算法的方式大致相同,都要实现PreciseShardingAlgorithm 接口,并重写 doSharding() 方法,只是配置稍有不同,而且它只是个空方法,得我们自行处理分库、分表逻辑。其他分片策略亦如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sharding-jdbc 的相关文章

  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch

随机推荐

  • MySQL生成千万测试数据

    目录 1 创建基础表结构 2 创建内存表 3 创建存储过程和函数 4 执行存储过程 5 遇到的问题 5 1 1449错误 5 2 1114错误 6 同步数据 1 创建基础表结构 CREATE TABLE t user id int 11 N
  • 自带浏览器_苹果手机自带浏览器下载的文件在哪里

    随着iOS13的发布 苹果在Safari浏览器中新增了 下载项 类似于Mac上的功能 可以帮助追踪当前正在下载的任何文件 并可以导航到下载的存储位置 苹果手机自带浏览器下载的文件在哪里 默认情况下 Safari浏览器的下载管理器将会把下载内
  • Ajax数据传递暨利用js进行表单数据回显

    问题一 Ajax传递整个表单数据 function createCustomer post pageContext request contextPath list add do new customer form serialize fu
  • PyQt5-布局

    布局 在qt里布局分四大类 QBoxLayout QGridLayout QFormLayout QStackedLayout QBoxLayout 直译为 盒子布局 一般使用它的两个子类QHBoxLayout 和 QVBoxLayout
  • AIX程序打包

    打包 首先需要安装打包工具mkinstallp 在AIX安装光盘中 安装bos adt insttools 安装过程中需要在放入光盘1 安装完成后 可以在 usr sbin 下找到mkinstallp AIX中一个package包含有多个f
  • 终于有人把 Docker 讲清楚了,别再说不会 Docker 了!(摘)

    富 Web 时代 应用变得越来越强大 与此同时也越来越复杂 集群部署 隔离环境 灰度发布以及动态扩容缺一不可 而容器化则成为中间的必要桥梁 本文我们就来探索一下 Docker 的神秘世界 从零到一掌握 Docker 的基本原理与实践操作 别
  • APT攻击是什么?面对APT攻击,我们应该怎么做?

    目录 一 概念 二 APT攻击特征 三 APT攻击技术 3 1 APT攻击方式 3 2 APT攻击诱饵种类 四 APT攻击模式 4 1 第一阶段 扫描探测 4 2 第二阶段 工具投送 4 3 第三阶段 漏洞利用 4 4 第四阶段 木马植入
  • 区块链学习笔记13——ETH以太坊概述

    区块链学习笔记13 ETH以太坊概述 学习视频 北京大学肖臻老师 区块链技术与应用 笔记参考 北京大学肖臻老师 区块链技术与应用 公开课系列笔记 目录导航页 比特币和以太坊是两种最主要的加密货币 比特币被称为区块链1 0 以太坊被称为区块链
  • 自动驾驶开发入门(三)---浅谈Apollo Cyber RT中的Transport

    Cyber的Transport为上层封装了底层数据传输的细节 上层主要使用Transport Transmitter Receiver三个类 其中Transport是工厂类 负责创建Transmitter Receiver以及Dispatc
  • pyspark作为生产者发送消息(推送数据)到kafka

    pyspark作为生产者发送消息到kafka 网上大部分的案例都是pyspark作为消费者消费kafka的消息 但是作为生产者生产消息发送给kafka的很少 下面把pyspark如何创建数据 或读取数据 作为生产者发送消息给kafka作为案
  • C++字节对齐

    系统让程序中的变量按字节对齐的目的 访问高效 字节是内存空间分配的最小单位 在程序中 我们定义的变量可以放在任何位置 但实际情况是访问特定类型变量的时候在特定的内存地址访问 这就需要各种类型数据按照一定的规则在空间排列 而不是顺序的一个接着
  • 两台文件服务器,负载均衡,用两台云服务器搭建一个负载均衡

    用两台云服务器搭建一个负载均衡 内容精选 换一换 弹性负载均衡 Elastic Load Balance 以下简称ELB 通过将访问流量自动分发到多台弹性云服务器 扩展应用系统对外的服务能力 实现更高水平的应用程序容错性能 用户通过基于浏览
  • 顺序表的C语言实现(静态/动态)

    目录 1 顺序表的定义 2 顺序表的实现 静态分配 3 顺序表的实现 动态分配 1 顺序表的定义 线性表的顺序存储又称顺序表 它是用一组地址连续的存储单元依次存储线性表中的数据元素 使得逻辑上相邻的两个元素在物理位置上也相邻 因此 顺序表的
  • C++基础知识 - 浮点类型

    需要精确计算的数学 工程应用 用整数类型不合适 float类型 单精度浮点类型 用来存储带小数部分的数据 在内存中占用4个字节 表示范围 3 4 1038 3 4 1038 不需记忆 精度 最长7位有效数字 是指7位10进制位 精度只能取值
  • 【Android】常用对话框大全(二)Material Dialog

    前言 上一篇文章中 谈到本系列的文章将讲解Android dialog Material dialog 为何要谈论Material呢 开发过Flutter的开发者也许就会明白 Material Design框架Flutter也在用 而在其官
  • MATLAB---获取图像中的指定像素点的值(RGB图像)

    输入 clear all RGB imread 图片名 格式 r x1 y1 z1 指定像素点的横坐标 c x2 y2 z2 指定像素点的纵坐标 p impixel RGB r c 用impixel 函数来返回RGB图像的横纵坐标对应的像素
  • Java 使用枚举消除if else

    1 功能需求 if else判断时写代码过程中非常常见的 但是有些相对比较固定格式的if else判断却是我们可以尽可能避免的 其中 枚举的作用在我们消除if else代码快的作用非常大 那么 我们该如何实现呢 2 代码实现 定义枚举变量
  • 【54-Sentinel熔断、降级、限流的基本概念-Sentinel实战上手应用-actuator实时监控-Docker安装部署Sentinel教程-熔断降级实战练习-Sentinel自定义资源】

    一 知识回顾 0 三高商城系统的专题专栏都帮你整理好了 请点击这里 1 系统架构演进过程 2 微服务系统架构需求 3 高性能 高并发 高可用的三高商城系统项目介绍 4 Linux云服务器上安装Docker 5 Docker安装部署MySQL
  • Redis复习笔记

    Redis 是一个高性能的key value数据库 支持多种数据类型 String 可以是字符串 整数 浮点数 List 列表 一个链表 链表上的每个节点都包含一个字符串 Set 集合 包含字符串的无序收集器 并且被包含的每个字符串都是独一
  • Sharding-jdbc

    一 概念理解 垂直切分 包含垂直分库和垂直分表 1 1 垂直分库 专库专用 按照业务类型对表分类 1 2 垂直分表 基于数据表的列 字段 为依据切分的 是一种大表拆小表的模式 1 3 垂直切分优点 不同业务的数据进行独立维护 监控 扩展 在