分库分表了解
数据切分根据其切分类型,可以分为两种方式:垂直(纵向)切分和水平(横向)切分
一:垂直(纵向)切分【基于表或字段划分,表结构不同】
1:垂直分库
根据业务的耦合度和数据的访问量等,进行数据的分离,存储在不同的数据库,比如按照按业务分类进行独立划分:会员服务(用户库),商品服务(商品库),订单服务(订单库),支付服务(账务库),营销服务(营销库)
2:垂直分表
垂直分表是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,比如订单表,基本信息在主表,商品信息单独存在订单商品明细表
垂直切分的优点:
1:解决业务系统层面的耦合,业务清晰
2:便于对不同的数据进行分级管理、维护、监控、扩展
3:高并发场景下,垂直切分一定程度的提升IO、数据库连接数、单机硬件资源的瓶颈
缺点:
1:部分表无法join,只能通过接口聚合方式解决,提升了开发的复杂度
2:分布式事务处理复杂
3:依然存在单表数据量过大的问题(需要水平切分)
二:水平(横向)切分【基于数据划分,表结构相同,数据不同】
当一个应用难以再细粒度的垂直切分,或切分后数据量行数巨大,存在单库读写、存储性能瓶颈,这时候就需要进行水平切分了
水平切分分为库内分表和分库分表(一个表的数据划分到不同的数据库,两个数据库的表结构一样),根据一定的规则,将同一个表按不同的条件分散到多个数据库或者多个表中。
库内分表:只解决了单一表数据量过大的问题,但没有将表分布到不同机器的库上,对于减轻数据库压力作用不是很大,但是单表查询会增加速度
库内分表案例:比如账务支付单表量比较大,且此表的查询操作比较频繁,就可以建一个历史表,超过当前时间一个月的数据,都保存至历史表(访问不频繁),以此减少支付单表的数据量,减轻支付单表的操作压力水平切分的优点:
1:不存在单库数据量过大、高并发的性能瓶颈,提升系统稳定性和负载能力
2:应用端改造较小,不需要拆分业务模块
缺点:
1:跨分片的事务一致性难以保证
2:跨库的join关联查询性能较差
3:数据多次扩展难度和维护量极大
水平切分常用方法:1:根据数值范围(比如id:0-100000,100001-20000进行表存储)
2:根据数值取模:比如分了20个表,根据id%20取余选择数据库进行存储
分布式事务常用的解决方案:基于可靠消息(MQ)的解决方案、两阶段事务提交、柔性事务三:常见问题:
1:全局主键避免重复问题
MySQL数据库里面字段有一个自增的属性,Oracle订单表也有 Sequence 序列。如果是一个数据库,那么可以保证 ID 是不重复的,但是水平分表以后,每个表都按照自己的规律自增,肯定会出现 ID 重复的问题,因此需要单独设计全局主键,以避免跨库主键重复问题。有一些常见的主键生成策略:
1、UUID
2、基于数据库自增单独维护一张 ID表
3、号段模式
4、Redis 缓存
5、雪花算法(Snowflake)
6、百度uid-generator
7、美团Leaf
8、滴滴Tinyid
2:多数据源和读写数据源的解决方案
常用的中间件:ShardingJdbc和Mycat
ShardingJdbc和MyCat的区别以及优缺点
相同点:
主流程都是SQL解析->SQL路由->SQL改写->SQL执行->结果归并
SQL 路由:实际查询中,数据不只保存在一台mysql服务器上,解析原生的sql确定使用哪些数据库,哪些数据表:目前支持分片路由和广播路由
SQL执行:通过多线程执行器异步执行SQL
结果归并:将多个执行结果集归并以便于通过统一的JDBC接口输出。结果归并包括流式归并、内存归并和使用装饰者模式的追加归并这几种方式。
区别:
架构设计不同,MyCat是基于Proxy,类似nginx,复写了MySql协议,将MycatServer伪装成一个Mysql数据库。优点是保证数据库的安全性,归并数据结果完全解耦,缺点是效率偏低。
Sharding-jdbc是基于jdbc的扩展,是以jar包的形式提供轻量级服务的。优点是效率较高,缺点是归并数据结果没有实现解耦,存在代码入侵性。还容易内存溢出,所以要做分页处理。
2.1 Sharding-jdbc 分片策略
sharding-jdbc 对于分片策略有2种维度
1:数据源分片策略(DatabaseSharingStrategy):数据被分配的目标数据源
2:表分片策略(TableShardingStrategy):数据被分配的目标表
两种分片策略API完全相同,但是表分片策略是依赖于数据源分片策略的(即:先分库然后才有分表)
1:StandardShardingStrategy
标准分片策略。提供对SQL语句中的=,IN和BETWEEN AND 的分片操作支持。
StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm(精准分片)和RangeShardingAlgorithm(范围分片)两个分片算法
PreciseShardingAlgorithm是必选的,用于处理=和IN的分片
RangeShardingAlgorithm是可选的,用于处理BETWEEN AND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND 将按照全库理由处理。
ComplexShardingStrategy
复合分片策略。提供对SQL语句中的=,IN,和BETWEEN AND的分片操作支持。
ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此Sharding-JDBC并未做过多的封装,而是直接将分片键值组合以及分片操作符交于算法接口,完全由应用开发者实现,提供最大的灵活度
InlineShardingStrategy
Inline表达式分片策略。使用Groovy的Inline表达式,提供对SQL语句中的=和IN的分片操作支持。
InlineShardingStrategy只支持单分片键,对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的JAVA代码开发。如:tuser${user_id%8}表示t_user表按照user_id按8取模分成8个表,表名称为t_user_0到t_user_7.
HintShardingStrategy
强制路由策略:
通过Hint而非SQL解析的方式分片的策略。对于分片字段非SQL决定,而由其他外置条件决定的场景,可使用sql hint灵活的注入分片字段
Hint分片策略是绕过SQL解析的,所以对于比较复杂的需要分片的查询,采用Hint分片策略性能可能会更好
在读写分离数据库中,Hint可以通过HintManager.setMasterRouteOnly()方法,强制读主库(主从复制存在一定延时,但在某些特定的业务场景中,可能更需要保证数据的实时性)
NoneShardingStrategy
不分片的策略
自定义分片算法
Sharding 提供了4种算法接口:
PreciseShardingAlgrorithm
RangeShardingAlgorithm
HintShardingAlgorithm
CompleKeysShardingAlgorithm
相关文章:
分库分表了解
数据切分根据其切分类型,可以分为两种方式:垂直(纵向)切分和水平(横向)切分一:垂直(纵向)切分【基于表或字段划分,表结构不同】1:垂直分库根据业务…...
docker中 gitlab 安装、配置和初始化
小笔记:gitlab配置文件 /etc/gitlab/gitlab.rb 配置项jcLee95 的CSDN博客:https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/1…...
有哪些好用的C++Json库?
文章目录RapidJSONJSON for Modern CBoost.PropertyTreeJanssonPicoJSONC REST SDKnlohmann json(ky用的这个)jsoncpp(cw用的这个)RapidJSON RapidJSON是一个快速、高效的C JSON解析器和生成器,支持SAX和DOM两种解析模…...
Docker 快速上手学习入门教程
目录 1、docker 的基础概念 2、怎样打包和运行一个应用程序? 3、如何对 docker 中的应用程序进行修改? 4、如何对创建的镜像进行共享? 5、如何使用 volumes 名称对容器中的数据进行存储?// 数据挂载 6、另一种挂载方式&…...
深度学习笔记:误差反向传播(1)
1 计算图 计算图使用图(由节点和边构成的图)来表达算式。 如图,我们用节点代表运算符号,用边代表传入的参数,即可算出购买苹果和橘子的总价格。 2 计算图的局部计算 局部计算意味着每个节点只处理和其相关的运算&…...
锁相环(1)
PLL代表相位锁定环。顾名思义,如下图所示,PLL是一种具有反馈循环的电路,可将反馈信号的相/频率保持与参考输入信号的相/频率相同(锁定)。 如下图所示,如果参考输入和反馈输入之间存在相位差,则…...
2023金三银四跳槽必会Java核心知识点笔记整理
现在互联网大环境不好,互联网公司纷纷裁员并缩减 HC,更多程序员去竞争更少的就业岗位,整的 IT 行业越来越卷。身为 Java 程序员的我们就更不用说了,上班 8 小时需要做好本职工作,下班后还要不断提升技能、技术栈&#…...
二十四节气—雨水,好雨知时节,当春乃发生。
雨水,是二十四节气之第2个节气。 雨水节气不仅表明降雨的开始及雨量增多,而且表示气温的升高,意味着进入气象意义的春天。 雨水节是一个非常富有想象力和人情味的节气,在这一天,不管下不下雨都充满着一种雨意蒙蒙的诗…...
为什么要使用数据库?
随着互联网技术的高速发展,预计2020 年底全世界网民的数量将达到 50 亿。网民数量的增加带动了网上购物、微博,网络视频等产业的发展。那么,随之而来的就是庞大的网络数据量。 大量的数据正在不断产生,那么如何安全有效地存储、检…...
【原创】java+swing+mysql图书管理系统设计与实现
图书管理系统是一个比较常见的系统,今天我们主要介绍如何使用javaswiingmysql去开发一个cs架构的图书管理系统,方便学生进行图书借阅。 功能分析: 宿舍报修管理系统的使用角色,一般分为管理员和学生,管理员主要进行学…...
图论 —— 强连通分量
概念 连通图 无向图 G G G 中,若对任意两点 V i , V j V_i, V_j V<...
计算机网络(二):物理层和链路层,通道复用,MAC地址,CSMA/CD协议,PPP点对点协议
文章目录一、物理层主机之间的通信方式通道复用技术常见的宽带接入技术二、链路层MAC地址和IP地址分别有什么作用为什么有了MAC地址之后还需要IP地址为什么有了IP地址还需要MAC地址以太网中的CSMA/CD协议数据链路层上的三个基本问题PPP协议一、物理层 主机之间的通信方式 单工…...
英语基础-定语从句的特殊用法及写作应用
1. 定语从句的引导词省略的情况 1. that 引导定语从句,从句中缺宾语/表语,that可省略; This is the book that he likes. I like the shirt that you gave me. We do not agree on the plan that you make. China is not the country th…...
[数据结构]---八大经典排序算法详解
🐧作者主页:king&南星 🏰专栏链接:c 文章目录一、八大排序算法复杂度对比二、基于比较的排序算法1.冒泡排序2.选择排序3.插入排序4.希尔排序5.直观感受四种算法的时间复杂度三、基于非比较的排序算法1.基数排序2.箱(桶)排序四…...
Go语言设计与实现 -- 反射
Go的反射有哪些应用? IDE中代码的自动补全对象序列化fmt函数的相关实现ORM框架 什么情况下需要使用反射? 不能明确函数调用哪个接口,需要根据传入的参数在运行时决定。不能明确传入函数的参数类型,需要在运行时处理任意对象。 …...
利用5G工业网关实现工业数字化的工业互联网解决方案
5G工业网关是一种用于将工业生产环境中的数据连接到工业互联网的解决方案。它可以利用高带宽、高速率、低时延的5G网络连接工业现场的PLC、传感器、工业设备和云端数据中心,从而实现工业数字化。 物通博联工业互联网解决方案 物通博联5G工业网关的使用步骤&#x…...
朋友当上项目测试组长了,我真的羡慕了
最近我发现一个神奇的事情,我一个朋友居然已经当上了测试项目组长,据我所知他去年还是在深圳的一家创业公司做苦逼的测试狗,短短8个月,到底发生了什么? 于是我立刻私聊他八卦一番。 原来他所在的公司最近正在裁员&am…...
element-ui实现动态添加表单项并实现事件触发验证验证
需求分析:点击新增后新增一个月度活动详情,提交时可同时提交多个月度活动详情。点击某一个月度活动信息的删除后可删除对应月度活动信息 H5部分: <el-dialog :title"title" :visible.sync"open" append-to-body>…...
ThreadLocal 内存泄漏问题
1. 认识ThreadLocal java中提高了threadlocal,为每个线程保存其独有的变量,threadlocal使用的一个小例子是: public class ThreadLocalTest {public static void main(String[] args) {ThreadLocal<String> threadIds new ThreadLoc…...
【算法】两道算法题根据提供字母解决解码方法和城市的天际线天际线问题
算法目录解码方法Java解答参考:天际线问题Java解答参考:大家好,我是小冷。 上一篇了解了项目相关的知识点 接下来看下两道算法题吧,用Java解答,可能更能激发一下大脑思考。 解码方法 题目要求: 一条包含…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
