數據庫分布式架構: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
英文地址,請注明出處:http://en.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算法的設計充分考慮了安全性、高效性和實現簡便性…