面试基础---高并发/高可用架构下的分库分表实战:基于 ShardingSphere 的深度解析
高并发/高可用架构下的分库分表实战:基于 ShardingSphere 的深度解析
引言
在高并发、高可用的分布式系统中,单库单表的性能瓶颈日益凸显。分库分表(Sharding)作为一种常见的数据库水平拆分方案,能够有效提升系统的扩展性和性能。本文将结合 ShardingSphere 的实际应用,深入探讨分库分表的核心技术点,并通过流程图、时序图、源码解析和工程案例,帮助读者全面掌握这一技术。
目录
- 分库分表的核心概念
- ShardingSphere 简介
- 分库分表的实现原理
- 数据分片策略
- 分布式主键生成
- 读写分离与负载均衡
- 实际项目中的应用
- 源码解析:ShardingSphere 的实现细节
- 大厂面试深度追问
- 总结
1. 分库分表的核心概念
1.1 什么是分库分表?
分库分表是将一个数据库中的数据按照某种规则拆分到多个数据库或表中,以解决单库单表的性能瓶颈问题。常见的拆分方式包括:
- 垂直拆分:按业务模块拆分数据库。
- 水平拆分:按数据行拆分表。
1.2 分库分表的优势
- 提升性能:分散单库单表的压力。
- 提高可用性:单点故障不影响全局。
- 扩展性强:支持动态扩容。
2. ShardingSphere 简介
ShardingSphere 是一款开源的分布式数据库中间件,提供了分库分表、读写分离、分布式事务等功能。其核心模块包括:
- Sharding-JDBC:轻量级的 JDBC 扩展。
- Sharding-Proxy:透明的数据库代理。
- Sharding-Sidecar:面向云原生的数据库治理方案。
3. 分库分表的实现原理
3.1 数据分片策略
数据分片是分库分表的核心,常见的分片策略包括:
- 哈希分片:根据某个字段的哈希值进行分片。
- 范围分片:根据某个字段的范围进行分片。
- 时间分片:根据时间字段进行分片。
流程图:数据分片流程
3.2 分布式主键生成
在分库分表场景下,传统的自增主键不再适用。常见的分布式主键生成方案包括:
- Snowflake 算法:基于时间戳、机器 ID 和序列号生成唯一 ID。
- UUID:生成全局唯一字符串。
- 数据库分段:预分配 ID 段,由应用层生成。
时序图:Snowflake 主键生成
3.3 读写分离与负载均衡
ShardingSphere 支持读写分离和负载均衡,通过配置主从数据库,将读请求分发到从库,写请求分发到主库。
4. 实际项目中的应用
4.1 项目背景
某电商平台的订单系统,单日订单量超过 1000 万,单库单表无法满足性能需求。通过 ShardingSphere 实现分库分表,将订单表按用户 ID 哈希分片到 16 个数据库中。
4.2 分片配置
sharding:tables:order:actualDataNodes: ds${0..15}.order${0..15}tableStrategy:standard:shardingColumn: user_idpreciseAlgorithmClassName: com.example.HashPreciseShardingAlgorithm
4.3 性能提升
- 写入性能:提升 10 倍。
- 查询性能:提升 8 倍。
5. 源码解析:ShardingSphere 的实现细节
5.1 分片路由
ShardingSphere 通过 ShardingRouter 实现分片路由,核心代码如下:
public final class ShardingRouter {public RoutingResult route(final SQLStatementContext sqlStatementContext) {// 解析 SQL 语句ShardingConditions shardingConditions = getShardingConditions(sqlStatementContext);// 计算分片结果return shardingRule.route(shardingConditions);}
}
5.2 分布式事务
ShardingSphere 支持 XA 和 BASE 事务,通过 TransactionManager 实现事务管理:
public interface TransactionManager {void begin();void commit();void rollback();
}
6. 大厂面试深度追问
6.1 深度追问 1:如何解决分库分表后的跨库查询问题?
问题描述:分库分表后,跨库查询(如 JOIN 操作)变得复杂,如何解决?
解决方案:
- 全局表:将小表复制到所有分库中。
- 冗余字段:在分片表中冗余常用字段,避免 JOIN。
- 异步聚合:通过消息队列异步聚合数据。
6.2 深度追问 2:分库分表后如何保证数据一致性?
问题描述:分库分表后,如何保证跨库事务的一致性?
解决方案:
- 分布式事务:使用 XA 或 Seata 实现强一致性。
- 最终一致性:通过消息队列实现异步补偿。
6.3 深度追问 3:如何动态扩容分库分表?
问题描述:业务增长后,如何动态扩容分库分表?
解决方案:
- 双写迁移:新老库同时写入,逐步迁移数据。
- 数据重分布:通过工具重新分布数据。
7. 总结
分库分表是解决高并发、高可用系统性能瓶颈的重要手段。通过 ShardingSphere 的灵活配置和强大功能,我们可以轻松实现分库分表、读写分离和分布式事务。希望本文的内容能够帮助读者深入理解分库分表的核心技术,并在实际项目中灵活应用。
作者:某大厂资深 Java 工程师
版权声明:本文为原创文章,转载请注明出处。
相关文章:
面试基础---高并发/高可用架构下的分库分表实战:基于 ShardingSphere 的深度解析
高并发/高可用架构下的分库分表实战:基于 ShardingSphere 的深度解析 引言 在高并发、高可用的分布式系统中,单库单表的性能瓶颈日益凸显。分库分表(Sharding)作为一种常见的数据库水平拆分方案,能够有效提升系统的扩…...
deepseek的regflow安装mac版本
deepseek的ragflow部署安装 一:ollama安装,自行完成,我本地已安装 二:查看大模型情况oll::命令ollama list,我本地无ragflow 三:docker安装:命令docker version ,自行完成,我本地已安装 四:安装知识库软件ragflow: 简单科普下Ragflow 是一个基于深度学习模型的问答生成工具&…...
Facebook 的框架及技术栈
一、前端框架与技术 React.js 及其生态系统 核心原理与特点 React.js 是 Facebook 开源的用于构建用户界面的 JavaScript 库。它的核心概念是组件化,将用户界面拆分成一个个独立的、可复用的组件。每个组件都有自己的状态(state)和属性&#…...
文献分享: 对ColBERT段落多向量的剪枝——基于学习的方法
原论文 1. 导论 & \textbf{\&} &方法 1️⃣要干啥:在 ColBERT \text{ColBERT} ColBERT方法中,限制每个段落要保留的 Token \text{Token} Token的数量,或者说对段落 Token \text{Token} Token进行剪枝 2️⃣怎么干:注…...
社交软件频繁更新,UI 设计在其中扮演什么角色?
在当今数字化时代,社交软件已成为人们日常生活中不可或缺的一部分。随着科技的飞速发展和用户需求的不断变化,社交软件更新频率日益加快。在这频繁更新的背后,UI 设计扮演着至关重要的角色,它如同社交软件的 “门面担当” 与 “交…...
Gemini Robotics:Google DeepMind 让 AI 机器人真正“动”起来!
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
概率论的基本知识
逆概率还不懂,改天再想想。 联合概率 联合概率(Joint Probability) 是概率论中的一个重要概念,用于描述多个随机变量同时取某些值的概率。联合概率可以帮助我们理解多个变量之间的关系。...
AI大数据挖掘的威力
通过AI挖掘大数据可以发现很多世界上用传统方法无法发现的潜在规律。 人类群体可以被精准的操控,这在AI发达的未来会越来越现实,甚至可以在社会动荡前夕精准清理权威节点。 基于AI与大数据的人类群体潜在规律发现 随着AI和大数据技术的深度结合…...
限流及熔断的场景?
限流(Rate Limiting)和熔断(Circuit Breaker)是高并发系统中常见的保护机制,用于防止系统过载和提高稳定性。它们适用于不同的场景: 限流(Rate Limiting)适用场景 限流主要用于控制…...
使用服务器如何DNS呢
莱卡云服务器 DNS 配置指南 一、配置云服务器本地 DNS 修改网络配置文件 Ubuntu/Debian: bashCopy Code sudo nano /etc/network/interfaces # 添加或修改 DNS 配置 dns-nameservers 8.8.8.8 8.8.4.4 *(保存后重启网络服务…...
【SpringBoot】实现登录功能
在上一篇博客中,我们讲解了注册页面的实现。在此基础上会跳转到登录页面,今天给大家带来的是使用 SpringBoot,MyBatis,Html,CSS,JavaScript,前后端交互实现一个登录功能。 目录 一、效果 二、…...
图论part3|101.孤岛的总面积、沉没孤岛、417. 太平洋大西洋水流问题
101. 孤岛的总面积 🔗:101. 孤岛的总面积思路:和昨天的岛的区别是:是否有挨着边的岛屿 所以可以先遍历四条边挨着的岛屿,把他们标记为非孤岛再计算其他岛屿当中的最大面积 代码:(深度搜索&…...
选型消息队列(MQ):ActiveMQ、RabbitMQ、RocketMQ、Kafka对比
选型消息队列(MQ):ActiveMQ、RabbitMQ、RocketMQ、Kafka对比 选型消息队列(MQ)1. 引言2. 消息队列核心指标3. MQ 技术对比分析4. 详细分析及案例4.1 ActiveMQ:传统企业级 MQ 方案4.2 RabbitMQ:高…...
常见FUZZ姿势与工具实战:从未知目录到备份文件漏洞挖掘
本文仅供学习交流使用,严禁用于非法用途。未经授权,禁止对任何网站或系统进行未授权的测试或攻击。因使用本文所述技术造成的任何后果,由使用者自行承担。请严格遵守《网络安全法》及相关法律法规! 目录 本文仅供学习交流使用&am…...
基于异构特征融合与轻量级集成学习的软件漏洞挖掘方案设计与Python实现
标题:基于异构特征融合与轻量级集成学习的软件漏洞挖掘方案设计与Python实现 一、方案设计原理 异构特征工程 静态特征:基于AST的代码属性图(CPG)解析(使用Joern+NetworkX)动态特征:内存访问模式分析(通过QEMU模拟执行)上下文特征:CWE漏洞模式匹配(集成Semgrep规则引…...
监控快手关注列表更新以及去视频水印视频
def printData(self):if len(self.UpdateDataList) > 0:self.UpdateDataList sorted(self.UpdateDataList, keylambda x: x[minutes]) # 先更新的在前sucess 0for index, video in enumerate(self.UpdateDataList):minutes video[minutes]if minutes > self.updateIn…...
【从零开始学习计算机科学】数据库系统(十一)云数据库、NoSQL 与 NewSQL
【从零开始学习计算机科学】数据库系统(十一)云数据库、NoSQL 与 NewSQL 云数据库云服务器的服务云数据库和传统的分布式数据库的异同NoSQLNoSQL数据库的特点CAP定理NoSQL的特性NoSQL数据库的分类NoSQL的适用场景Nosql数据库实例-RedisRedis的优势MongoDBMongoDB的特点NewSQL…...
江科大51单片机笔记【12】AT24C02(I2C总线)
写在前言 此为博主自学江科大51单片机(B站)的笔记,方便后续重温知识 在后面的章节中,为了防止篇幅过长和易于查找,我把一个小节分成两部分来发,上章节主要是关于本节课的硬件介绍、电路图、原理图等理论知识…...
【附JS、Python、C++题解】Leetcode面试150题(9)——三数之和
一、题目 15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足: i!j、i!k 且 j! k ,同时还满足:nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意…...
网络安全防护架构有哪些 网络安全防护措施包括
网络安全预防措施 网安措施 计算机网络安全措施主要包括保护网络安全、保护应用服务安全和保护系统安全三个方面,各个方面都要结合考虑安全防护的物理安全、防火墙、信息安全、Web安全、媒体安全等等。 (一)保护网络安全。 网络安全是为保护商务各方网络端系统之…...
多线程实现批量保存数据
首先注入 private final SqlSessionFactory sqlSessionFactory;private final static int BATCH_SIZE 200; //保存数据条数private final static int THREAD_POOL_SIZE 15; // 线程池大小然后把保存的数据根据BATCH_SIZE 切割成多个批次封装起来: /*** 将数据分成…...
ActiveMQ监听器在MQ重启后不再监听问题
应用的监听器注解 JmsListener(destination "TopicName",containerFactory "FactoryName")工厂代码 BeanJmsListenerContainerFactory<?> FactoryName(ConnectionFactory connectionFactory){SimpleJmsListenerContainerFactory factory new S…...
大模型架构记录5-向量数据库
一 倒排索引、KNN、PQ 1.1 基础版本 query -> requery 对问题做处理,处理上下文 对query 做 refined query 1.2 向量数据库 二 搜索逻辑 2.1 knn 2.2 近似KNN 先和N个空间的均值比较再和空间内部的所有点比较,计算最近值。 优化一: …...
Linux:基本指令与内涵理解
1.文件操作指令 1.1 ls ls指令用于查看指定层级文件夹下的文件或文件夹 基本格式:ls (选项) (查看层级) 其中选项处不写就默认是显示文件名,查看层级默认是当前层级 选项1: -l 作用:将查找文件的详细信息显示出来 我们…...
Android实现简易计算器
<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android" android:layout_width"match_parent" android:layout_height"match_parent" and…...
PHP 在 if 判断时由于运算符优先级导致 false 的问题
首先来看一段代码: $price 187.50;if (!is_numeric($price) || $price < 0 || ($price * 100 > 1000000)) {echo "价格错误:$price\n"; } else {echo "价格正确:$price\n"; }乍一看是不是认为并没有什么问题&…...
【分布式】如何使用RocketMQ实现下单-库存-支付这个场景的分布式事务问题
在 下单-库存-支付 场景中,通过消息队列实现最终一致性,需保证三个微服务的操作最终一致,且在支付失败或库存不足时触发回滚补偿。以下是具体实现方案: 1. 整体流程设计 正常流程(成功场景) 订单服务 创建…...
手写一些常见算法
手写一些常见算法 快速排序归并排序Dijkstra自定义排序交替打印0和1冒泡排序插入排序堆排序 快速排序 public class Main {public static void main(String[] args) {int nums[] {1,3,2,5,4,6,8,7,9};quickSort(nums,0,nums.length - 1);}private static void quickSort(int[…...
使用DeepSeek完成一个简单嵌入式开发
开启DeepSeek对话 请帮我使用Altium Designer设计原理图、PCB,使用keil完成代码编写;要求:使用stm32F103RCT6为主控芯片,控制3个流水灯的原理图 这里需要注意,每次DeepSeek的回答都不太一样。 DeepSeek回答 以下是使…...
每日一题之储存晶体
问题描述 威慑纪元 2230 年,人类联邦在与三体文明的对抗中,为了强化飞船的能源储备,决定收集能量晶体。飞船的储存空间呈矩形,边长分别为 a 和 b。对于一个能量晶体,只有当它的长度小于或等于存储空间的对角线长度时&…...
