数据库分布式架构:ShardingSphere 实践

一、数据库分布式架构概述

1.1 分布式架构概念

在当今数字化时代,随着业务的不断拓展和数据量的爆炸式增长,传统的单机数据库架构逐渐暴露出诸多局限性。例如,在电商大促期间,海量的订单数据和用户访问请求会让单机数据库不堪重负,出现响应缓慢甚至崩溃的情况。数据库的分布式架构应运而生,它将数据库的数据和操作分散到多个物理节点上,这些节点通过网络连接形成一个有机的分布式系统。其核心目标是显著提高数据库的性能、可用性和扩展性,以从容应对大规模数据存储和高并发访问的挑战。

1.2 常见实现方式

1.2.1 数据分片

数据分片是将数据库中的数据按照特定规则划分到多个数据库或表中的技术。常见的分片规则有以下几种:

  • 范围分片:按照数据的某个范围进行划分。以电商系统为例,可以按照订单创建时间将订单数据进行范围分片,如将 1 - 3 月的订单数据存储在数据库 A,4 - 6 月的订单数据存储在数据库 B。这种方式适用于数据具有明显范围特征的场景,如时间序列数据。
  • 哈希分片:通过哈希函数将数据映射到不同的数据库或表中。例如,对用户 ID 进行哈希运算,根据运算结果将用户数据分配到不同的数据库。哈希分片可以保证数据的均匀分布,但可能会导致数据的无序性。
  • 列表分片:根据预定义的列表将数据划分到不同的数据库或表中。比如,按照地区将用户数据划分到不同的数据库,将北京地区的用户数据存储在数据库 X,上海地区的用户数据存储在数据库 Y。
1.2.2 读写分离

读写分离是将数据库的读操作和写操作分离到不同的数据库节点上的策略。通常,写操作只在主数据库上执行,读操作可以在多个从数据库上执行。以新闻网站为例,大量的用户访问属于读操作,而新闻的发布属于写操作。通过读写分离,可以将读操作分散到多个从数据库上,从而提高系统的读性能,减轻主数据库的压力。这种方式适用于读多写少的场景,如新闻网站、博客系统等。

1.2.3 分布式事务处理

分布式事务是指涉及多个数据库节点的事务。在分布式架构中,由于数据分散在多个节点上,如何保证事务的一致性是一个极具挑战性的问题。常见的分布式事务处理方法包括:

  • 两阶段提交(2PC):是一种经典的分布式事务处理协议,它通过协调者和参与者之间的两次通信来保证事务的一致性。但 2PC 存在性能问题,容易出现阻塞和单点故障。例如,在一个涉及多个数据库的转账事务中,如果协调者出现故障,整个事务可能会陷入阻塞状态。
  • 三阶段提交(3PC):是在 2PC 的基础上进行改进的协议,它增加了一个预准备阶段,减少了阻塞的可能性。但 3PC 仍然存在一些问题,如消息丢失和网络分区等。
  • 柔性事务:通过补偿机制来保证事务的最终一致性,而不是强一致性。在电商系统的订单处理中,当用户下单后,系统会先记录订单信息,然后进行库存扣减等操作。如果库存扣减失败,系统会通过补偿机制取消订单,保证数据的最终一致性。柔性事务适用于对一致性要求不是非常高的场景。

二、ShardingSphere 框架介绍

2.1 ShardingSphere 简介

ShardingSphere 是一款开源的分布式数据库中间件,它宛如一个强大的“数据库魔法师”,提供了数据分片、读写分离、分布式事务和数据库治理等丰富功能。ShardingSphere 可以透明地将应用程序与底层的数据库集群进行解耦,使得应用程序可以像使用单机数据库一样使用分布式数据库。它具有以下显著特点:

  • 功能丰富:涵盖了分布式数据库所需的多种功能,能够满足不同场景的多样化需求。无论是电商系统的海量订单数据处理,还是金融系统的复杂交易事务,ShardingSphere 都能游刃有余地应对。
  • 易于集成:可以与 Spring Boot、MyBatis 等主流框架无缝集成,对现有应用程序的侵入性极小。开发人员无需对现有代码进行大规模修改,就能轻松引入 ShardingSphere 实现分布式数据库架构。
  • 开源免费:降低了企业的使用成本,使得更多的企业可以采用分布式数据库架构,提升自身的竞争力。

2.2 核心组件

  • Sharding - JDBC:轻量级的 Java 框架,以 JDBC 驱动的形式提供服务,无需额外部署和依赖,适合嵌入式开发。它就像一个小巧灵活的“精灵”,可以直接嵌入到应用程序中,对应用程序的代码改动较小。
  • Sharding - Proxy:独立的中间件,以 MySQL 或 PostgreSQL 协议的形式提供服务,适合对现有应用程序无侵入式改造。应用程序可以像连接单机数据库一样连接 Sharding - Proxy,而无需对代码进行修改,就像在使用传统数据库一样自然。
  • Sharding - Sidecar:以 Sidecar 模式运行的代理,适合云原生环境。它可以与应用程序容器一起部署,为应用程序提供分布式数据库服务,就像一个贴心的“小助手”,在云原生环境中为应用程序保驾护航。

三、使用 ShardingSphere 实现数据库分片和读写分离

3.1 实现数据库分片

3.1.1 环境准备

假设我们有两个数据库 db0db1,每个数据库中有两个表 t_order_0t_order_1。我们将使用 ShardingSphere - JDBC 来实现数据分片。首先,需要在项目中添加 ShardingSphere - JDBC 的依赖:

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere - jdbc - core - spring - boot - starter</artifactId><version>5.3.2</version>
</dependency>
3.1.2 配置文件

application.yml 中进行如下配置:

spring:shardingsphere:datasource:names: ds0,ds1ds0:type: com.zaxxer.hikari.HikariDataSourcedriver - class - name: com.mysql.cj.jdbc.Driverjdbc - url: jdbc:mysql://localhost:3306/db0username: rootpassword: rootds1:type: com.zaxxer.hikari.HikariDataSourcedriver - class - name: com.mysql.cj.jdbc.Driverjdbc - url: jdbc:mysql://localhost:3306/db1username: rootpassword: rootrules:sharding:tables:t_order:actual - data - nodes: ds$->{0..1}.t_order_$->{0..1}table - strategy:standard:sharding - column: order_idsharding - algorithm:type: inlineprops:algorithm - expression: t_order_$->{order_id % 2}database - strategy:standard:sharding - column: order_idsharding - algorithm:type: inlineprops:algorithm - expression: ds$->{order_id % 2}

上述配置中,actual - data - nodes 定义了逻辑表 t_order 对应的实际数据节点。table - strategydatabase - strategy 分别定义了表分片和数据库分片的策略,这里都以 order_id 作为分片键,通过取模运算将数据均匀分布到不同的数据库和表中。

3.1.3 代码示例
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;@Service
public class OrderService {@Autowiredprivate JdbcTemplate jdbcTemplate;public void createOrder(long orderId, String orderName) {String sql = "INSERT INTO t_order (order_id, order_name) VALUES (?,?)";jdbcTemplate.update(sql, orderId, orderName);}
}

在代码中,我们可以像操作单机数据库一样操作逻辑表 t_order,ShardingSphere 会自动根据配置的分片规则将数据插入到相应的数据库和表中。

3.2 实现读写分离

3.2.1 环境准备

假设我们有一个主数据库 master_db 和一个从数据库 slave_db。同样,需要在项目中添加 ShardingSphere - JDBC 的依赖。

3.2.2 配置文件

application.yml 中进行如下配置:

spring:shardingsphere:datasource:names: master,slavemaster:type: com.zaxxer.hikari.HikariDataSourcedriver - class - name: com.mysql.cj.jdbc.Driverjdbc - url: jdbc:mysql://localhost:3306/master_dbusername: rootpassword: rootslave:type: com.zaxxer.hikari.HikariDataSourcedriver - class - name: com.mysql.cj.jdbc.Driverjdbc - url: jdbc:mysql://localhost:3306/slave_dbusername: rootpassword: rootrules:readwrite - splitting:data - sources:rw - ds:write - data - source - name: masterread - data - source - names: slave

此配置定义了主从数据源,并指定写操作使用主数据库,读操作使用从数据库。

3.2.3 代码示例
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;@Service
public class ReadWriteService {@Autowiredprivate JdbcTemplate jdbcTemplate;public void writeData(String data) {String sql = "INSERT INTO test_table (data) VALUES (?)";jdbcTemplate.update(sql, data);}public String readData() {String sql = "SELECT data FROM test_table LIMIT 1";return jdbcTemplate.queryForObject(sql, String.class);}
}

在代码中,写操作会自动路由到主数据库,读操作会自动路由到从数据库,实现了读写分离。

四、使用 ShardingSphere 处理分布式事务

4.1 分布式事务概念

分布式事务是指涉及多个数据库节点的事务,需要保证事务的一致性、隔离性、原子性和持久性。在分布式架构中,由于数据分散在多个节点上,实现分布式事务的难度较大。例如,在一个跨多个数据库的转账事务中,需要确保从一个账户扣款和向另一个账户存款这两个操作要么都成功,要么都失败。

4.2 ShardingSphere 支持的分布式事务类型

  • XA 事务:基于两阶段提交协议,保证强一致性,但性能较低。在金融系统的资金交易中,对事务的一致性要求极高,此时可以使用 XA 事务。
  • 柔性事务:通过补偿机制保证最终一致性,性能较高。在电商系统的订单处理和库存管理中,对一致性要求不是非常高,柔性事务是一个不错的选择。

4.3 配置分布式事务

4.3.1 配置文件

application.yml 中进行如下配置:

spring:shardingsphere:rules:transaction:type: XAprovider - type: Atomikos

此配置指定使用 XA 事务,并使用 Atomikos 作为事务管理器。

4.3.2 代码示例
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class DistributedTransactionService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Transactionalpublic void transferMoney(long fromAccount, long toAccount, double amount) {// 从源账户扣款String sql1 = "UPDATE account SET balance = balance -? WHERE account_id =?";jdbcTemplate.update(sql1, amount, fromAccount);// 向目标账户存款String sql2 = "UPDATE account SET balance = balance +? WHERE account_id =?";jdbcTemplate.update(sql2, amount, toAccount);}
}

在代码中,使用 @Transactional 注解标记方法为事务方法,ShardingSphere 会自动管理分布式事务,确保事务的一致性。

五、ShardingSphere 的优缺点和适用场景

5.1 优点

  • 功能丰富:提供了数据分片、读写分离、分布式事务和数据库治理等多种功能,满足了分布式数据库的多样化需求。无论是处理海量数据存储,还是实现高并发读写和分布式事务,ShardingSphere 都能提供全面的解决方案。
  • 易于集成:可以与 Spring Boot、MyBatis 等主流框架集成,对现有应用程序的侵入性较小,降低了开发成本。开发人员可以在不改变现有代码架构的基础上,轻松引入 ShardingSphere 实现分布式数据库架构。
  • 开源免费:降低了企业的使用成本,使得更多的企业可以采用分布式数据库架构。企业无需支付高昂的授权费用,就可以享受到分布式数据库带来的性能提升和扩展性增强。
  • 社区活跃:有庞大的开源社区支持,能够及时获取更新和解决问题。开发人员在使用过程中遇到问题,可以在社区中寻求帮助,同时也可以参与社区的开发和贡献。

5.2 缺点

  • 性能开销:作为中间件,会引入一定的性能开销,尤其是在高并发场景下。在处理大量并发请求时,ShardingSphere 的中间件处理逻辑可能会成为性能瓶颈。
  • 学习成本:对于复杂的配置和功能,需要一定的学习成本,尤其是对于初学者来说。ShardingSphere 的配置项较多,功能复杂,初学者需要花费一定的时间和精力来学习和掌握。
  • 依赖网络:分布式架构依赖网络,网络故障可能会影响系统的可用性和性能。如果网络出现延迟、丢包等问题,会导致数据传输不及时,影响系统的正常运行。

5.3 适用场景

  • 数据量巨大:当单数据库无法存储大量数据时,可以使用 ShardingSphere 进行数据分片,将数据分散到多个数据库中。例如,在大数据分析场景中,海量的日志数据和业务数据可以通过 ShardingSphere 进行分片存储,提高数据处理效率。
  • 高并发读写:当系统需要处理高并发的读写请求时,可以使用 ShardingSphere 进行读写分离,提高系统的读性能。在电商大促、游戏开服等场景下,高并发的读写请求会对数据库造成巨大压力,ShardingSphere 的读写分离功能可以有效缓解这种压力。
  • 分布式事务需求:当系统需要处理分布式事务时,可以使用 ShardingSphere 提供的分布式事务支持,保证事务的一致性。在金融系统、供应链系统等对事务一致性要求较高的场景中,ShardingSphere 的分布式事务功能可以发挥重要作用。

六、总结

ShardingSphere 是一款功能强大的分布式数据库中间件,它为实现数据库的分布式架构提供了便捷的解决方案。通过使用 ShardingSphere,我们可以轻松实现数据库的分片、读写分离和分布式事务处理,显著提高系统的性能、可用性和扩展性。在实际应用中,我们需要根据具体的需求和场景,权衡 ShardingSphere 的优缺点,选择合适的配置和功能。同时,我们也需要关注网络环境和系统性能,采取相应的措施确保分布式数据库系统的稳定运行。例如,通过优化网络配置、增加缓存等方式来提高系统的性能和可用性。

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

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

相关文章

【WRFDA教程第二期】运行WRFDA 3DVAR/4DVAR数据同化

目录 一、准备阶段&#xff1a;下载并解压测试数据二、运行 3DVAR 教学实验日志分析&#xff08;wrfda.log&#xff09;进阶实验建议&#xff1a;对比不同设置的影响输出文件说明 三、运行 4DVAR 教学实验步骤1&#xff1a;准备工作目录与环境变量步骤2&#xff1a;链接可执行文…

redis缓存三大问题分析与解决方案

什么是缓存&#xff1f; 缓存&#xff08;Cache&#xff09;是一种将热点数据缓存在内存中&#xff08;如 Redis&#xff09;以加快访问速度、减轻数据库压力的技术。 但引入缓存后可能出现 三大核心问题&#xff1a; 缓存穿透&#xff08;Cache Penetration&#xff09;缓存…

李宏毅机器学习笔记——梯度下降法

深度学习介绍 基于仿生学的一种自成体系的机器学习算法&#xff0c;包括但不限于图像识别、语音、文本领域。 梯度下降法 作为深度学习算法种常用的优化算法 梯度下降法&#xff0c;是一种基于搜索的最优化方法&#xff0c;最用是最小化一个损失函数。梯度下降是迭代法的一…

day50/60

浙大疏锦行 DAY 50 预训练模型CBAM模块 知识点回顾&#xff1a; resnet结构解析CBAM放置位置的思考针对预训练模型的训练策略 差异化学习率三阶段微调 ps&#xff1a;今日的代码训练时长较长&#xff0c;3080ti大概需要40min的训练时长 作业&#xff1a; 好好理解下resnet18的…

Vue3 之vite.config.js配置

一、示例 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path // https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],base: ./,build: {assetsDir: static, //指定静态资源目录rollupOptions: {input: {mai…

利用Gpu训练

方法一&#xff1a; 分别对网络模型&#xff0c;数据&#xff08;输入&#xff0c;标注&#xff09;&#xff0c;损失函数调用.cuda() 网络模型&#xff1a; if torch.cuda.is_available():netnet.cuda() 数据&#xff08;训练和测试&#xff09;&#xff1a; if torch.cud…

使用excel中的MATCH函数进行匹配数据

一、背景 在平日处理数据时&#xff0c;经常需要将给定数据按照制定的数据进行排序&#xff0c;数量比较大时&#xff0c;逐个处理有点费事费力且容易出错&#xff0c;这时可借助excel表格中match函数进行精确匹配。 二、使用match函数–精确排序操作步骤 主要工作步骤&#xf…

SpringCloud系列(41)--SpringCloud Config分布式配置中心简介

前言&#xff1a;微服务意味着要将单体应用中的业务拆分成一个个子服务&#xff0c;每个服务的粒度相对较小&#xff0c;因此系统中会出现大量的服务&#xff0c;但由于每个服务都需要必要的配置信息才能运行&#xff0c;所以—套集中式的、动态的配置管理设施是必不可少的&…

wireshark介绍和使用

Wireshark 介绍 Wireshark 是一款开源的 网络协议分析工具&#xff08;Packet Sniffer&#xff09;&#xff0c;用于捕获和分析网络数据包。它支持多种协议解析&#xff0c;适用于网络调试、安全分析、网络教学等场景。 官网&#xff1a;https://www.wireshark.org/ 特点&#…

【甲方安全建设】敏感数据检测工具 Earlybird 安装使用详细教程

文章目录 背景工具介绍安装方法一、Linux 与 macOS 安装流程二、Windows 系统安装流程(一)三、Windows 系统安装流程(二)四、错误处理使用说明模块与规则机制集成与运维建议结语背景 随着源代码泄露、配置误提交、密码硬编码等风险频发,企业源代码库中潜在的敏感信息泄漏…

异步Websocket构建聊天室

目录 Websocket技术背景 Websockec简介 实现websocket通信程序 实验环境&#xff1a; 服务端&#xff08;阿里云ESC,VPC网络&#xff09;&#xff1a; 客户端1&#xff08;本机&#xff09;&#xff1a; 通信模型&#xff1a; 实现功能逻辑&#xff1a; 源代码&#xff1a; 服务…

OpenCV CUDA模块设备层-----反向二值化阈值处理函数thresh_binary_inv_func()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV CUDA 模块&#xff08;cudev&#xff09; 中的一个仿函数&#xff08;functor&#xff09;生成器&#xff0c;用于创建一个反向二值化阈值…

【实现一个时间MCP完整技术解析】

&#x1f552; MCP Time Server 完整技术解析&#xff1a;从核心实现到文件架构的深度剖析 目前已上传npm库&#xff0c;chan-mcp-time-server&#xff0c;有兴趣的可以下载试试 创建时间: 2025年7月2日 &#x1f3af; 项目概述与架构设计 核心问题定义 AI助手在处理时间相关…

类成员方法命名风格解析:动宾、纯动词与纯名词的选择之道

在软件开发的浩瀚代码海洋中&#xff0c;类成员方法的命名犹如指引开发者的灯塔&#xff0c;其重要性不言而喻。合理的命名不仅能让代码 “自我言说”&#xff0c;降低理解成本&#xff0c;还能提升开发效率&#xff0c;促进团队协作。常见的类成员方法命名风格可归纳为动宾结构…

自己电脑搭建本地服务器并实现公网访问,内网也能提供互联网连接使用

如何在本地自己计算机上自建服务器并开启公网地址提供互联网服务的详细教学&#xff0c;一步步操作流程&#xff0c;从本地部署到配置公网IP&#xff0c;最后并附无公网IP内网穿透公网访问的nat123方案。 要在自用的电脑上搭建本地服务器并实现公网地址的访问&#xff0c;需要…

如何使用AI改进论文写作 ---- 引言篇(2)

写在前面 本篇作为1.0版本的补充优化&#xff0c;记录本人的研究过程。 在分析了多本论文写作的相关的书籍之后&#xff0c;我明白了一点&#xff0c;关于论文写作&#xff0c;永远是一个熟能生巧的过程&#xff0c;对于人来说&#xff0c;必须多写才能够变得熟练&#xff0c;对…

【Java21】在spring boot中使用ScopedValue

文章目录 0.环境说明1.基础知识1.1 ScopedValue的特点 2.应用场景2.1 spring web项目中&#xff0c;使用ScopedValue传递上下文&#xff08;全局不可变量&#xff09;2.2 spring grpc项目中&#xff0c;使用ScopedValue传递上下文&#xff08;全局不可变量&#xff09; 3.Scope…

第10篇 图像语义分割和目标检测介绍

语义分割(Semantic Segmentation)是图像处理和机器视觉一个重要分支&#xff0c;其目标是精确理解图像场景与内容。语义分割是在像素级别上的分类&#xff0c;属于同一类的像素都要被归为一类&#xff0c;因此语义分割是从像素级别来理解图像的。如下如所示的照片&#xff0c;属…

微算法科技(NASDAQ MLGO)基于量子图像处理的边缘检测算法:开拓图像分析新视野

在当今数字化时代&#xff0c;图像数据海量增长&#xff0c;边缘检测作为图像处理的关键环节&#xff0c;在机器视觉、医学成像、安防监控等众多领域有着至关重要的作用。传统边缘检测算法在处理复杂图像时&#xff0c;面临计算效率低、精度不足等问题。量子计算的兴起&#xf…

SM4密码算法的C语言实现(带测试)

一、SM4算法原理 SM4是中国国家密码管理局于2012年发布的国家商用密码算法标准&#xff0c;也称为GB/T 32907-2016。它是一种分组对称加密算法&#xff0c;采用32轮非线性迭代结构&#xff0c;分组长度和密钥长度均为128位。SM4算法的设计充分考虑了安全性、高效性和实现简便性…