Sharding-jdbc

news2024/11/18 16:23:44
一、概念理解
  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() 方法,只是配置稍有不同,而且它只是个空方法,得我们自行处理分库、分表逻辑。其他分片策略亦如此。

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

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

相关文章

【Python--torch(激活函数说明+代码讲解)】激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh)

【Python–torch】激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh) 文章目录【Python--torch】激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh)1. 介绍2. 常用激活函数说明2.1 Sigmoid2.1.1 公式2.1.2 图像2.1.3 代码解读2.2 Softmax2.2.1 公式2.2.2 代码解读2.3 ELU2.…

荧光探针Pyrene-PEG2-Propargyl,芘甲酰胺-二聚乙二醇-丙炔

Pyrene-PEG2-Propargyl物理参数&#xff1a; CAS号&#xff1a;N/A | 英文名&#xff1a;Pyrene-PEG2-Propargyl |中文名&#xff1a;芘甲酰胺-二聚乙二醇-丙炔分子式&#xff1a;C24H21NO3分子量&#xff1a;371.44纯度标准&#xff1a;95%外形颜色&#xff1a;淡黄色或白色固…

shell学习4

目录 一、统计文本中的词频 二、压缩javascript 三、打印文件的或行中的第n个单词或列---awk 3.1 利用awk打印文件中每行中的第五个单词。 3.2 利用awk打印当前目录下的文件的权限和文件名 3.3 利用awk打印从M行到N行这个范围内的所有文本 3.4 利用awk 部分提取文件中的内…

opencv复习

文章目录图像衡量结果&#xff08;损失函数&#xff09;预测的好坏前向传播 反向传播图像 实质是矩阵 长 宽 像素通道&#xff08;0-255 0 黑 255 亮&#xff09; 假设这里做一个10分类 行向量✖列向量是一个数 分类 最后的结果是一个各个分类的概率值 这里的b是偏置项&…

学校节能降耗减排方案——能耗监管平台的建设及效果剖析

摘要&#xff1a;作为崭新的校园能耗管理手段&#xff0c;能耗监测平台以传统管理方式无法企及的优势有力地提升了高校能源管理工作的水平&#xff0e;从而受到了相关管理者的青睐。本文梳理总结了高校能耗监测平台的基本组成和优势特点&#xff0c;同时对能耗平台建设和使用中…

nginx设置重定向跳转后ip:[端口]/abc变成ip/abc而报错404

nginx设置重定向跳转后 ip:[端口]/abc 变成 ip/abc 而报错404nginx配置&#xff1a;server {listen 80;server_name _;client_max_body_size 300m;absolute_redirect off;location / {root html;index index.html index.htm;proxy_set_header X-Real-IP $remote_a…

【nodejs-04】黑马nodejs学习笔记04-MySQL简介及安装

文章目录1.数据库的基本概念1.1什么是数据库1.2 常见的数据库及分类1.3 传统型数据库的数据组织结构2.安装并配置MySQL2.1 了解需要安装哪些MySQL相关的软件2.2 MySQL 在 Mac 环境下的安装2.3 MySQL 在 Windows 环境下的安装1.数据库的基本概念 1.1什么是数据库 数据库&#x…

JavaWeb学习

文章目录Tomcat 详解1 Tomcat 安装2 默认端口号3 面试题4 编写与发布一个网站Http 详解1 http 请求2 http 响应3 面试题Tomcat 详解 1 Tomcat 安装 进入Tomcat官网下载压缩包&#xff1a;https://tomcat.apache.org/ 将压缩包解压即可直接使用 启动Tomcat:bin目录下startup.b…

【软件测试】如何在测试团队中工作游刃有余?你的测试技巧......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 在测试团队中&#…

基于数据库实现分布式锁

分布式锁概述 前言 我们的系统都是分布式部署的&#xff0c;日常开发中&#xff0c;秒杀下单、抢购商品等等业务场景&#xff0c;为了防⽌库存超卖&#xff0c;都需要用到分布式锁。 分布式锁其实就是&#xff0c;控制分布式系统不同进程共同访问共享资源的一种锁的实现。如…

xshell6运行报错:由于找不到mfc110u.dll、MSVCR110.dll无法继续执行代码

今天给大家分享一下我刚装完系统遇到得问题,由于新盟的罗建雨【胡巴】老师帮我给电脑加了固态,又重装了系统,因此电脑里面得所有软件需要重装,在我重装的过程中遇到了一个小问题给大家分享一下,如果大家以后遇到也方便解决。 问题: 安装Xshell时电脑系统报错:“由于找…

一、微服务架构介绍

目录 一、微服务架构介绍 二、出现和发展 三、传统开发模式和微服务的区别 四、微服务的具体特征 五、SOA和微服务的区别 1、SOA喜欢重用&#xff0c;微服务喜欢重写 2、SOA喜欢水平服务&#xff0c;微服务喜欢垂直服务 3、SOA喜欢自上而下&#xff0c;微服务喜欢自下…

为什么项目的时间跟踪管理很重要 ?

项目通常被分解为需要完成的任务&#xff0c;以实现项目目标。时间跟踪可以帮助你了解每项任务需要多长时间&#xff0c;从而使你更准确地估计未来的项目。 除此以外&#xff0c;跟踪项目时间还有以下令人难以置信的好处&#xff1a; 1、提高生产力 通过记录在每项任务上花…

项目经理为什么要做时间管理?

对于时间的管理&#xff0c;有人做不到&#xff0c;有人不知道&#xff0c;对每一个成功的人来说&#xff0c;时间管理是很重要的一环。 对于项目经理而言&#xff0c;由于项目经理每天要在项目上花费大量的时间&#xff0c;所以个人时间比较少&#xff0c;因此项目经理就需要安…

小半年被裁掉30多人,大厂“开猿节流”太狠了

今年9月&#xff0c;我前同事的小公司辞退了30多个程序员&#xff0c;当然包括做测试的他。 近3月过去了&#xff0c;大部分人都找不到合适工作。大家聊起时都在感慨这两年好多行业都不景气。 这次暂停了大部分业务&#xff0c;团队里最终只留下4个比较厉害的程序员合并到另外…

内网渗透(二十九)之Windows协议认证和密码抓取-Windows-2012R2之后抓取密码的方式和抓取密码的防范措施

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

Jdk19 动态编译 Java源码为 Class 文件

动态编译 Java 源码为 Class一.背景1.Jdk 版本2.需求二.Java 源码动态编译实现1.Maven 依赖2.源码包装类3.Java 文件对象封装类4.文件管理器封装类5.类加载器6.类编译器三.动态编译测试1.普通测试类2.接口实现类3.测试四.用动态编译 Class 替换 SpringBoot 的 Bean&#xff08;…

Hexo博客搭建部署GitHub

Hexo博客 Hexo是一个简洁的静态博客页面&#xff0c;使用markdown渲染文件&#xff0c;在本地生产静态文件后可以部署到GitHub上&#xff0c;这样不需要占用自己的域名和服务器&#xff0c;其实我在很早之前就换用了hexo&#xff0c;原来的博客在csdn&#xff0c;oceansec.blo…

康耐视智能相机Insight-选择型号方式

一&#xff1a;了解仿真中每种型号。 1.首先需要知道每种仿真代表的是多少万像素的相机&#xff0c;然后根据具体的分辨率去选择相应的型号&#xff0c;具体型号如下。 IS2000 30万相机 分辨率&#xff1a;640480 IS5000 30万相机 分辨率&#xff1a;640480 IS5001 130万相机 分…

[数据结构] 深入理解什么是跳表及其模拟实现

跳表定义优化实现基本框架定义跳表结点实现基础结构构造函数实现基本操作查找操作插入数据删除某结点打印跳表跳表与平衡搜索树和哈希表的对比定义 每相邻两个节点升高一层&#xff0c;增加一个指针&#xff0c;让指针指向下下个节点&#xff1b;上面每一层链表的节点个数&…