最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用shardingsphere實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)分片方式

 更新時(shí)間:2025年08月19日 11:35:09   作者:陳震_  
本文介紹如何使用ShardingSphere-JDBC在SpringBoot中實(shí)現(xiàn)MySQL水平分庫(kù),涵蓋分片策略、路由算法及零侵入配置方法,適用于大數(shù)據(jù)場(chǎng)景下的數(shù)據(jù)庫(kù)擴(kuò)展

在大數(shù)據(jù)時(shí)代,隨著業(yè)務(wù)數(shù)據(jù)量的不斷增長(zhǎng),單一的數(shù)據(jù)庫(kù)往往難以承載大規(guī)模的數(shù)據(jù)處理需求。數(shù)據(jù)庫(kù)分片(Sharding)是一種有效的數(shù)據(jù)庫(kù)擴(kuò)展技術(shù),通過(guò)將數(shù)據(jù)分布到多個(gè)數(shù)據(jù)庫(kù)實(shí)例上,提高系統(tǒng)的性能和可擴(kuò)展性。

ShardingSphere 是一款開(kāi)源的分布式數(shù)據(jù)庫(kù)中間件,可以幫助我們輕松實(shí)現(xiàn)數(shù)據(jù)庫(kù)分片。

本文的目的是介紹如何快速上手使用 ShardingSphere 來(lái)實(shí)現(xiàn) MySQL 數(shù)據(jù)庫(kù)分片。

一、ShardingSphere 簡(jiǎn)介

ShardingSphereApache 基金會(huì)下的一個(gè)開(kāi)源項(xiàng)目,提供分布式數(shù)據(jù)庫(kù)中間件解決方案。ShardingSphere 已經(jīng)在2020年4月16日從 Apache 孵化器畢業(yè),成為 Apache 頂級(jí)項(xiàng)目。其主要功能包括數(shù)據(jù)分片(Sharding)、讀寫(xiě)分離、分布式事務(wù)以及數(shù)據(jù)加密等。ShardingSphere 主要由三個(gè)核心組件組成:

  1. Sharding-JDBC:輕量級(jí)的 Java 框架,直接集成在應(yīng)用程序中,提供數(shù)據(jù)庫(kù)分片、讀寫(xiě)分離等功能。需要在 spring boot 中集成,編寫(xiě)相關(guān)的配置。如果分片策略用默認(rèn)的4種,那可以只改配置就好了。如果分片策略很特殊,可以通過(guò)實(shí)現(xiàn)抽象類,寫(xiě)自定義的方法進(jìn)行分片分庫(kù)。
  2. Sharding-Proxy:獨(dú)立部署的數(shù)據(jù)庫(kù)代理,支持所有兼容 MySQL、PostgreSQL 協(xié)議的客戶端。原來(lái)程序連接到這個(gè)代理就可以實(shí)現(xiàn)分片和分庫(kù)。程序不需要任何改變。
  3. Sharding-Sidecar(Plan):云原生環(huán)境下的數(shù)據(jù)庫(kù)代理,與 Kubernetes 等平臺(tái)集成。

1.1 對(duì)比

Sharding-JDBCSharding-ProxySharding-Sidecar
數(shù)據(jù)庫(kù)任意MySQL/PostgreSQLMySQL/PostgreSQL
連接消耗數(shù)
異構(gòu)語(yǔ)言僅Java任意任意
性能損耗低損耗略高損耗低
無(wú)中心化
靜態(tài)入口無(wú)無(wú)

1.2 核心概念

分庫(kù)分表中最重要的核心概念有兩個(gè),即路由鍵分片算法,這兩個(gè)將決定數(shù)據(jù)分片的位置,先稍微解釋一下這兩個(gè)概念:

  • 路由鍵:也被稱為分片鍵,也就是作為數(shù)據(jù)分片的基準(zhǔn)字段,可以是一個(gè)或多個(gè)字段組成。
  • 分片算法:基于路由鍵做一定邏輯處理,從而計(jì)算出一個(gè)最終節(jié)點(diǎn)位置的算法。

舉個(gè)例子來(lái)感受一下,好比按 user_id 將用戶表數(shù)據(jù)分片,每八百萬(wàn)條數(shù)據(jù)劃分一張表,那在這里,user_id 就是路由鍵,而按user_id做范圍判斷則屬于分片算法,一張表中的所有數(shù)據(jù)都會(huì)依據(jù)這兩個(gè)基礎(chǔ),后續(xù)對(duì)所有的讀寫(xiě)SQL進(jìn)行改寫(xiě),從而定位到具體的庫(kù)、表位置。

在Sharding-Sphere這套技術(shù)中,無(wú)論是JDBC還是Proxy產(chǎn)品,工作的流程都遵循上述這個(gè)原則,里面除開(kāi)上面介紹的路由鍵和分片算法的概念外,還有邏輯表、真實(shí)表、數(shù)據(jù)節(jié)點(diǎn)這三個(gè)概念:

  • 邏輯表:提供給應(yīng)用程序操作的表名,程序可以像操作原本的單表一樣,靈活的操作邏輯表。
  • 真實(shí)表:在各個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)上真實(shí)存在的物理表,但表名一般都會(huì)和邏輯表存在偏差。
  • 數(shù)據(jù)節(jié)點(diǎn):主要是用于定位具體真實(shí)表的庫(kù)表名稱,如DB1.tb_user1、DB2.tb_user2…
  • 均勻分布:指一張表的數(shù)量在每個(gè)數(shù)據(jù)源中都是一致的。
  • 自定義分布:指一張表在每個(gè)數(shù)據(jù)源中,具體的數(shù)量由自己來(lái)定義,上圖就是一種自定義分布。

以 Java 程序?yàn)槔?,編?xiě)業(yè)務(wù)代碼時(shí)寫(xiě)的 SQL 語(yǔ)句,會(huì)直接基于邏輯表進(jìn)行操作,邏輯表并不是一種真實(shí)存在的表結(jié)構(gòu),而是提供給 Sharding-Sphere 使用的,當(dāng) Sharding-Sphere 接收到一條操作某張邏輯表的 SQL語(yǔ)句時(shí),它會(huì)根據(jù)已配置好的路由鍵和分片算法,對(duì)相應(yīng)的 SQL語(yǔ)句進(jìn)行解析,然后計(jì)算出 SQL要落入的數(shù)據(jù)節(jié)點(diǎn),最后再將語(yǔ)句發(fā)給具體的真實(shí)表上處理即可。

1.3 Sharding-Sphere中的表概念

除開(kāi)上述的一些核心概念外,在Sharding-Sphere中為了解決某些問(wèn)題,同時(shí)還有一些表概念,如廣播表、綁定表、單表、動(dòng)態(tài)表等,接著簡(jiǎn)單介紹一下這些概念。

1.3.1 綁定表

一般的項(xiàng)目基本上都會(huì)存在主外鍵,雖然不會(huì)在表上添加主外鍵約束,但也會(huì)從邏輯上保障主外鍵關(guān)系,但經(jīng)過(guò)水平分庫(kù)后,所有的讀寫(xiě)操作會(huì)基于路由鍵去分片。

那此時(shí)以訂單表、訂單詳情表為例,假設(shè)用戶選擇了三個(gè)購(gòu)物車(chē)的商品提交訂單,此時(shí)會(huì)產(chǎn)生

  • 一條訂單記錄
  • 以及對(duì)應(yīng)的三條訂單詳情記錄。

假設(shè)商品庫(kù)有兩個(gè)水平節(jié)點(diǎn),兩個(gè)商品庫(kù)都具備訂單表、訂單詳情表,而訂單表的路由鍵是 order_id,訂單詳情表的路由鍵是 order_info_id ,數(shù)據(jù)分片的路由算法為取模,那此時(shí)數(shù)據(jù)的落庫(kù)情況為:

  • 訂單詳情2數(shù)據(jù)落入 DB0 商品庫(kù)中。
  • 訂單詳情1、詳情3數(shù)據(jù)落入 DB1 商品庫(kù)中。

但此時(shí)訂單表訂單詳情表的數(shù)據(jù)是存在外鍵關(guān)系的,如果按照上述的路由方式去對(duì)數(shù)據(jù)做分片,最終就會(huì)導(dǎo)致通過(guò) order_id=1 的訂單 ID 查詢訂單詳情時(shí),只能在 DB1 中查詢到兩條訂單詳情數(shù)據(jù),這個(gè)問(wèn)題顯然是業(yè)務(wù)上無(wú)法接受的。通常我們會(huì)將這兩張表配置為綁定表,以確保它們?cè)谕粋€(gè)分片中,從而優(yōu)化訂單相關(guān)的聯(lián)表查詢操作。

1.3.2 廣播表

廣播表是指在所有分片數(shù)據(jù)源中都存在的一張表,且數(shù)據(jù)內(nèi)容完全相同。這種表通常用于存儲(chǔ)一些公共的、全局性的數(shù)據(jù),比如系統(tǒng)配置、國(guó)家代碼等。由于廣播表的數(shù)據(jù)是全局一致的,當(dāng)有更新操作時(shí),需要將變更同步到所有的分片數(shù)據(jù)源中。

  1. 在不同的庫(kù)需要數(shù)據(jù)的表中冗余字段,把常用的字段放到需要要數(shù)據(jù)的表中,避免跨庫(kù)連表。
  2. 選擇同步數(shù)據(jù),通過(guò)廣播表/網(wǎng)絡(luò)表/全局表將對(duì)應(yīng)的表數(shù)據(jù)直接完全同步一份到相應(yīng)庫(kù)中。
  3. 在設(shè)計(jì)庫(kù)表拆分時(shí)創(chuàng)建 ER 綁定表,具備主外鍵的表放在一個(gè)庫(kù),保證數(shù)據(jù)落到同一數(shù)據(jù)庫(kù)
  4. Java 系統(tǒng)中組裝數(shù)據(jù),通過(guò)調(diào)用對(duì)方服務(wù)接口的形式獲取數(shù)據(jù),然后在程序中組裝后返回

這四種方案都能夠解決需要跨庫(kù) Join 的問(wèn)題,但第二種方案提到了廣播表/網(wǎng)絡(luò)表/全局表似乎之前沒(méi)聽(tīng)說(shuō)過(guò)對(duì)嘛,這其實(shí)是分庫(kù)分表中的名詞。場(chǎng)景:假設(shè)有一個(gè) t_country 表,存儲(chǔ)國(guó)家和地區(qū)的信息,這些信息在整個(gè)系統(tǒng)中是統(tǒng)一的,因此可以將 t_country 作為廣播表,在所有數(shù)據(jù)庫(kù)實(shí)例中都保存一份副本。

但往往垂直分庫(kù)的場(chǎng)景中,第四種方案是最常用的,因?yàn)榉謳?kù)分表的項(xiàng)目中,Java 業(yè)務(wù)系統(tǒng)那邊也絕對(duì)采用了分布式架構(gòu),因此通過(guò)調(diào)用對(duì)端 API 接口來(lái)獲取數(shù)據(jù),是分布式系統(tǒng)最為常見(jiàn)的一種現(xiàn)象。

1.3.3 單表

單表的含義比較簡(jiǎn)單,并非所有的表都需要做分庫(kù)分表操作,所以當(dāng)一張表的數(shù)據(jù)無(wú)需分片到多個(gè)數(shù)據(jù)源中時(shí),就可將其配置為單表,這樣所有的讀寫(xiě)操作最終都會(huì)落入這一張單表中處理。

二、ShardingSphere-JDBC

Sharding-JDBCShardingSphere 的第一個(gè)產(chǎn)品,也是 ShardingSphere 的前身。 它定位為輕量級(jí) Java 框架,在 JavaJDBC層提供的額外服務(wù)。它使用客戶端直連數(shù)據(jù)庫(kù),以 jar 包形式提供服務(wù),無(wú)需額外部署和依賴,可理解為增強(qiáng)版的 JDBC 驅(qū)動(dòng),完全兼容 JDBC 和各種 ORM 框架。

Apache ShardingSphere-JDBC 可以通過(guò)Java 和 YAML 這 2 種方式進(jìn)行配置,開(kāi)發(fā)者可根據(jù)場(chǎng)景選擇適合的配置方式。

原理

Sharding-JDBC 中的路由結(jié)果是通過(guò)分片字段和分片方法來(lái)確定的,如果查詢條件中有 id 字段的情況還好,查詢將會(huì)落到某個(gè)具體的分片

如果查詢沒(méi)有分片的字段,會(huì)向所有的db或者是表都會(huì)查詢一遍,讓后封裝結(jié)果集給客戶端。

接下來(lái)會(huì)搭建一個(gè)簡(jiǎn)單的SpringBoot+MyBatis項(xiàng)目,結(jié)合Sharding-Sphere-JDBC實(shí)現(xiàn)水平分庫(kù)~

spring boot整合

<!-- 分表分庫(kù)依賴 -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
    <version>5.2.1</version>
</dependency>
 

數(shù)據(jù)庫(kù)

接著先在數(shù)據(jù)庫(kù)中創(chuàng)建db_sharding_01、db_sharding_02兩個(gè)庫(kù),我這里用偽集群的方式搭建水平庫(kù),畢竟線上只需要把數(shù)據(jù)庫(kù)地址改為不同的機(jī)器IP即可

接著分別再在兩個(gè)水平庫(kù)中,創(chuàng)建用戶表、訂單表、訂單詳情表、商品表(兩張),這四張表是接下來(lái)用于測(cè)試的表,SQL如下:

drop table if exists `user_info`;
create table `user_info`  (
  `user_id` bigint not null comment '用戶id',
  `user_name` varchar(255) comment '用戶姓名',
  `user_sex` varchar(255) comment '用戶性別',
  `user_age` int(8) not null comment '用戶年齡',
  primary key (`user_id`) using btree
)
engine = InnoDB
character set = utf8
collate = utf8_general_ci 
row_format = compact;
 
 
drop table if exists `shoping_00`;
create table `shoping_00`  (
  `shoping_id` bigint not null comment '商品id',
  `shoping_name` varchar(255) comment '商品名稱',
  `shoping_price` int(8) not null comment '商品價(jià)格',
  primary key (`shoping_id`) using btree
)
engine = InnoDB
character set = utf8
collate = utf8_general_ci 
row_format = compact;
 
 
drop table if exists `shoping_01`;
create table `shoping_01`  (
  `shoping_id` bigint not null comment '商品id',
  `shoping_name` varchar(255) comment '商品名稱',
  `shoping_price` int(8) not null comment '商品價(jià)格',
  primary key (`shoping_id`) using btree
)
engine = InnoDB
character set = utf8
collate = utf8_general_ci 
row_format = compact;
 
 
drop table if exists `order`;
create table `order`  (
  `order_id` bigint not null comment  '訂單號(hào)',
  `order_price` int(8) not null comment '訂單總金額',
  `user_id` bigint not null comment '用戶id',
  primary key (`order_id`) using btree
) 
engine = InnoDB
character set = utf8
collate = utf8_general_ci 
row_format = compact;
 
 
drop table if exists `order_info`;
create table `order_info`  (
  `order_info_id` bigint not null comment  '訂單詳情號(hào)',
  `order_id`  bigint not null comment '訂單號(hào)',
  `shoping_name` varchar(255)  comment '商品名稱',
  `shoping_price` int(8) not null comment '商品價(jià)格',
  primary key (`order_info_id`) using btree,
  index `key_order_id`(`order_id`) using btree
)
engine = InnoDB
character set = utf8
collate = utf8_general_ci 
row_format = compact;
 

分庫(kù)分表的核心配置

Sharding-Sphere的所有產(chǎn)品對(duì)業(yè)務(wù)代碼都是零侵入的,無(wú)論是Sharding-JDBC也好,Sharding-Proxy也罷,都不需要更改業(yè)務(wù)代碼,這也就意味著大家在分庫(kù)分表環(huán)境下做業(yè)務(wù)開(kāi)發(fā)時(shí),可以像傳統(tǒng)的單庫(kù)開(kāi)發(fā)一樣輕松,Sharding-Sphere中最主要的是對(duì)配置文件的更改,Sharding-JDBC主要修改application.properties/yml文件,Sharding-Proxy主要修改自身的配置文件。

多數(shù)據(jù)源配置

spring:
  shardingsphere:
    mode:
      type: Standalone
      repository:
        type: JDBC
    datasource:
      names: ds0,ds1
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: 「數(shù)據(jù)庫(kù)節(jié)點(diǎn)1的地址」
        username: 「數(shù)據(jù)庫(kù)節(jié)點(diǎn)1的賬號(hào)」
        password: 「數(shù)據(jù)庫(kù)節(jié)點(diǎn)1的密碼」
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: 「數(shù)據(jù)庫(kù)節(jié)點(diǎn)2的地址」
        username: 「數(shù)據(jù)庫(kù)節(jié)點(diǎn)1的賬號(hào)」
        password: 「數(shù)據(jù)庫(kù)節(jié)點(diǎn)1的密碼」
 

上述這組配置中,需要通過(guò)names配置多個(gè)數(shù)據(jù)源的別名,接著需要為每個(gè)別名配置對(duì)應(yīng)的數(shù)據(jù)源信息,按照上述方式編寫(xiě)好配置文件后,則表示完成了多數(shù)據(jù)源的配置。

多數(shù)據(jù)源可用性測(cè)試

為了確保多數(shù)據(jù)源的可用性,接著先簡(jiǎn)單配置一張表:

spring:
  shardingsphere:
    
    props:
      
      sql-show: true
 
    
    rules:
      
      sharding:
        
        tables:
          
          shoping:
            
            actual-data-nodes: ds0.shoping_00

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MyEclipse連接MySQL數(shù)據(jù)庫(kù)報(bào)錯(cuò)解決辦法

    MyEclipse連接MySQL數(shù)據(jù)庫(kù)報(bào)錯(cuò)解決辦法

    我們現(xiàn)在一般網(wǎng)站都是利用的MySQL數(shù)據(jù)庫(kù)搭建網(wǎng)站的,但是在網(wǎng)上看到很多網(wǎng)友吐槽數(shù)據(jù)庫(kù)連接不上的問(wèn)題,現(xiàn)在我就結(jié)合相關(guān)資料向提出一些我個(gè)人的見(jiàn)解,希望對(duì)大家解決問(wèn)題有幫助
    2014-01-01
  • MySQL使用binlog2sql工具實(shí)現(xiàn)在線恢復(fù)數(shù)據(jù)功能

    MySQL使用binlog2sql工具實(shí)現(xiàn)在線恢復(fù)數(shù)據(jù)功能

    binlog2sql 是大眾點(diǎn)評(píng)開(kāi)源的一款用于解析 MySQL binlog 的工具,根據(jù)不同選項(xiàng),可以得到原始SQL、回滾SQL等,下面我們就來(lái)看看如何使用binlog2sql實(shí)現(xiàn)在線恢復(fù)數(shù)據(jù)功能吧
    2025-03-03
  • mysql 8.0.22 winx64安裝配置圖文教程

    mysql 8.0.22 winx64安裝配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.22 winx64安裝配置圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Mysql導(dǎo)出數(shù)據(jù)的正確方法

    Mysql導(dǎo)出數(shù)據(jù)的正確方法

    想在Mysql命令行下導(dǎo)出數(shù)據(jù)庫(kù),但就是每天提示不那個(gè)錯(cuò)誤,后來(lái)才知道其實(shí)mysqldump不是mysql命令,因此不能在Mysql命令行下導(dǎo)出。
    2011-05-05
  • Win10系統(tǒng)下MySQL8.0.16 壓縮版下載與安裝教程圖解

    Win10系統(tǒng)下MySQL8.0.16 壓縮版下載與安裝教程圖解

    這篇文章主要介紹了Win10系統(tǒng)下MySQL8.0.16 壓縮版下載與安裝教程圖解,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考解決價(jià)值,需要的朋友可以參考下
    2019-06-06
  • MySql約束超詳細(xì)介紹

    MySql約束超詳細(xì)介紹

    MySQL唯一約束(Unique?Key)是指所有記錄中字段的值不能重復(fù)出現(xiàn)。例如,為?id?字段加上唯一性約束后,每條記錄的?id?值都是唯一的,不能出現(xiàn)重復(fù)的情況
    2022-09-09
  • MySQL存儲(chǔ)引擎的實(shí)現(xiàn)要素分析

    MySQL存儲(chǔ)引擎的實(shí)現(xiàn)要素分析

    這篇文章主要為大家介紹了MySQL存儲(chǔ)引擎的實(shí)現(xiàn)要素分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • MySQL刪除表數(shù)據(jù)、清空表命令詳解(truncate、drop、delete區(qū)別)

    MySQL刪除表數(shù)據(jù)、清空表命令詳解(truncate、drop、delete區(qū)別)

    介紹了MySQL中清空或刪除表數(shù)據(jù)的三種方法:truncate、delete和drop,以及它們的特點(diǎn)、使用場(chǎng)景和注意事項(xiàng),Truncate用于快速刪除表中所有數(shù)據(jù)并釋放空間,但不保留表結(jié)構(gòu);delete用于刪除表中特定行或所有數(shù)據(jù),保留表結(jié)構(gòu)且操作可回滾
    2024-10-10
  • MySQL全文索引like模糊匹配查詢慢解決方法

    MySQL全文索引like模糊匹配查詢慢解決方法

    這篇文章主要為大家介紹了MySQL全文索引like模糊匹配查詢慢解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • MySQL中SHOW DATABASES語(yǔ)句查看或顯示數(shù)據(jù)庫(kù)

    MySQL中SHOW DATABASES語(yǔ)句查看或顯示數(shù)據(jù)庫(kù)

    在MySQL中,可使用SHOW DATABASES語(yǔ)句來(lái)查看或顯示當(dāng)前用戶權(quán)限范圍以內(nèi)的數(shù)據(jù)庫(kù),下面就來(lái)介紹一下如何使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02

最新評(píng)論

新源县| 阿克苏市| 滕州市| 清河县| 墨江| 清镇市| 丰台区| 平阴县| 边坝县| 宜良县| 景泰县| 屯留县| 思南县| 靖西县| 隆昌县| 正安县| 阜新市| 合阳县| 改则县| 马尔康县| 南雄市| 贵州省| 怀安县| 平果县| 方山县| 巨野县| 友谊县| 吉木萨尔县| 玉溪市| 白城市| 碌曲县| 长治市| 仙游县| 安阳市| 汶上县| 梁河县| 龙陵县| 巨野县| 嵊州市| 同德县| 乃东县|