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

mysql+shardingSphere的分庫分表實現示例

 更新時間:2024年04月10日 09:41:25   作者:????????_BugMan  
分庫分表是一種場景解決方案,它的出現是為了解決一些場景問題的,本文主要介紹了mysql+shardingSphere的分庫分表實現示例,具有一定的參考價值,感興趣的可以

1.什么是分庫分表

分庫分表是一種場景解決方案,它的出現是為了解決一些場景問題的,哪些場景喃?

  • 單表過大的話,讀請求進來,查數據需要的時間會過長

  • 讀請求過多,單節(jié)點IO壓力太大,IO壓力太大會造成什么?可能會造成IO阻塞,造成響應速度變慢。

分庫分表是指的兩種維度,一種維度是分庫,另一種維度是分表。分的話有兩種分法,一種是水平分,另一種是垂直分。

水平分是指將數據分為多段,一個服務器節(jié)點上存放一段,讀寫的時候走自己要的那一段所在服務器上。一段也叫一個分片(sharding)

垂直分是指將一個庫或者一個表從一個整體拆成多個部分,不同服務器上存儲一部分:

2.分片方法

其實總的來說分庫都還好,垂直分庫對應著服務拆成微服務做到資源隔離各玩兒各的,問題都還不大,而且一般不會出現水平分庫,因為庫里面數據多的也就某一些表,我們面對更多的是水平分表。水平分表首先要面對的就是如何分片?

分片方法有如下幾種:

  • hash分片法

  • range分片法

hash分片法:

主鍵對服務器數量取余。

這種方式在擴容后數據需要重新散列一遍,重新散列一遍花時間嗎?當然花時間,但是不散列又不行,為什么喃?舉個例,原來id=12的數據散列到了0表,擴容后不遷移的話按照規(guī)則id=12的表會散列到4表,這就會導致id=12這條數據在查找的時候找不到:

當然hash算法可以用一致性hash算法來優(yōu)化,但其數據遷移肯定是無法規(guī)避的,且一致性hash算法本身也存在無法規(guī)避的缺點。博主之前有一篇一致性hash算法的文章,可移步:

一致性hash算法_一直hash算法-CSDN博客

range分片法:

按照編號順序均勻的分片,好處是擴容不用散列,但是新數據往往是使用頻率更高的數據,會導致壓力不均勻,而且現在一般唯一ID為了安全性都是無序的,比如采用UUID做主鍵的時候,所以range分片法的場景適用也很有限。

3.測試數據

用一張訂單表來做測試數據,根據主鍵來分庫分表:

create table order_(
id varchar(100) primary key,
productName VARCHAR(100),
productId VARCHAR(100),
createTime datetime,
statue INT
)ENGINE=INNODB;

準備了兩個庫,db01和db02都有這張訂單表:

依賴版本:

千萬注意版本的對齊!

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--prometheus -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>
?
        <!-- MySQL驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>
        <!-- MyBatis Plus Starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!--sharding-jdbc-->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
        </dependency>
        <!-- Alibaba Druid 數據源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
    </dependencies>
    
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.6.3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

4.shardingSphere

4.1.介紹

分片方法說起來容易,要自己去實現一個全過程的分片分表還是很繁瑣的,需要手動實現多數據源,然后實現散列算法來控制讀寫請求映射到哪一臺服務器,升級一點的功能還包括要與服務器進行心跳通信,獲取服務器的信息等等。所以說還是直接用"輪子"吧。

Apache ShardingSphere 是一個開源的分布式數據庫中間件解決方案,它由阿里巴巴集團開源,目前是 Apache 軟件基金會旗下的頂級項目。ShardingSphere 通過提供一組與數據庫交互的標準化接口(如JDBC驅動或代理服務),對上層應用隱藏了復雜的分布式數據庫處理邏輯,為開發(fā)者提供了易用且功能強大的分庫分表、讀寫分離、數據治理、彈性伸縮等功能。

ShardingSphere分為三部分:Sharding-JDBC、Sharding-Proxy、Sharding-Sidecar。

4.2.sharding jdbc

其中Sharding-JDBC,其會托管JDBC,然后支持實現分庫分表、讀寫分離。分庫分表和讀寫分離都是通過配置實現的,配置好數據源,然后配置好分庫規(guī)則即可。當然讀寫分離的前提是數據庫已經配置成了讀寫分離的模式。以下是配置示例:

spring:
  application:
    name: testDemo
  shardingsphere:
    datasource:
      names: ds0,ds1
      ds0:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://localhost:3306/db01?serverTimezone=UTC
        username: root
        password: admin
      ds1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://localhost:3306/db02?serverTimezone=UTC
        username: root
        password: admin
    sharding:
      default-database-strategy:
        inline:
          sharding-column: order_id
          algorithm-expression: ds$->{order_id % 2}
        tables:
          t_order:
            actual-data-nodes: ds$->{0..1}.t_order_$->{0..1}
            table-strategy:
              inline:
                sharding-column: order_id
                algorithm-expression: t_order_$->{order_id % 2}
      #讀寫分離
      master-slave-rules:
        ms_ds:
          master-data-source-name: ds0
          slave-data-source-names: ds1
          load-balance-algorithm-type: ROUND_ROBIN #負載均衡算法
    props:
      sql.show: true #是否打印sql

上述YAML配置已經使用了inline表達式實現了基于order_id字段的分庫和分表規(guī)則。當然還提供了接口,對于自定義分庫、分表規(guī)則,可以通過實現ShardingSphere提供的接口來自定義算法類,并在配置中引用這些類。

public class CustomDatabaseShardingAlgorithm implements PreciseShardingAlgorithm<Integer> {
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) {
        // 根據order_id和其他可能的業(yè)務邏輯計算數據庫名稱
        int orderId = shardingValue.getValue();
        return "ds" + (orderId % 2); // 這里僅作為示例,實際請根據業(yè)務需求編寫
    }
}
spring:
  application:
    name: testDemo
  shardingsphere:
    # ... 數據源配置 ...
    sharding:
      default-database-strategy:
        precise:
          sharding-column: order_id
          algorithm-class-name: com.example.CustomDatabaseShardingAlgorithm
      tables:
        t_order:
          actual-data-nodes: ds$->{0..1}.t_order_$->{0..1}
          table-strategy:
            precise:
              sharding-column: order_id
              # 同樣可以為表級別分片指定自定義算法類
              algorithm-class-name: com.example.CustomTableShardingAlgorithm
      # ... 讀寫分離配置 ...
    props:
      sql.show: true

同樣的,如果需要自定義分表規(guī)則,也需要創(chuàng)建一個實現相應接口(如PreciseShardingAlgorithm)的類,并在table-strategy部分通過algorithm-class-name屬性引用它。以上示例中的CustomTableShardingAlgorithm即是一個假設存在的自定義分表策略類。請確保實際應用中已正確創(chuàng)建并配置此類。

4.3.sharding proxy

sharding proxy是一個中間件,也能實現分庫分表和讀寫分離。不同于sharding jdbc需要侵入代碼中對JDBC進行一個托管,sharding

proxy是無侵入式的,一個獨立的組件。

sharding proxy需要先下載,然后解壓、配置。

配置示例:

配置數據庫的信息

然后需要導入mysql的驅動:

配置分庫分表:

這里要注意了databaseName指向的數據庫是一個總庫,應用都會往這個庫里面進行數據讀寫,然后由sharding proxy來向我們配置的不同數據源里進行分庫分表。給出一個配置文件,大家感受一下,該配置文件基于Apache ShardingSphere 5.x版本的語法編寫。不同版本可能配置項存在不同哈。

# config-sharding.yaml
?
schemaName: testDemo  # 指定邏輯庫名稱
?
rules:
  - !SHARDING
    dataSources:
      ds0:
        url: jdbc:mysql://localhost:3306/db01?serverTimezone=UTC
        username: root
        password: admin
        connectionTimeoutMilliseconds: 30000
        idleTimeoutMilliseconds: 60000
        maxLifetimeMilliseconds: 1800000
        type: com.alibaba.druid.pool.DruidDataSource
      ds1:
        url: jdbc:mysql://localhost:3306/db02?serverTimezone=UTC
        username: root
        password: admin
        # 其他連接池屬性...
?
    shardingRule:
      tables:
        t_order:
          actualDataNodes: ds$->{0..1}.t_order_$->{0..1}
          databaseStrategy:
            inline:
              shardingColumn: order_id
              algorithmExpression: ds$->{order_id % 2}
          tableStrategy:
            inline:
              shardingColumn: order_id
              algorithmExpression: t_order_$->{order_id % 2}
?
      masterSlaveRules:
        ms_ds:
          masterDataSourceName: ds0
          slaveDataSourceNames: [ds1]
          loadBalanceAlgorithmType: ROUND_ROBIN
?
props:
  sql.show: true

4.4.兩者之間的對比

sharding jdbc是侵入了應用,托管了JDBC,對代碼有侵入性。

sharding proxy是對數據庫下手,其并沒用侵入數據庫,也沒用上數據庫的bin log,而是去監(jiān)聽數據庫的端口從而來攔截下sql。

但是proxy明顯可以看到是中心化的,都在向一個點來寫數據,是會有性能瓶頸的。

5.留個尾巴

不管是水平拆還是垂直拆,分庫分表后一定會存在兩個核心問題:

  • 不好join,需要在程序層面進行join

  • 分布式事務

sharding是如何解決第一個問題的喃?首先sharding會各個節(jié)點上進行全表掃描,用類似笛卡爾積的辦法聚合成最終的結果。

至于第二個問題,留在后文,我們將深入探究一下sharding生態(tài)圈是如何實現分布式事務的。除此之外還有一些尾巴要留在后文繼續(xù)展開,包括:

  • sharding jdbc是如何托管JDBC的
  • sharding proxy是否存在中心化架構帶來的性能問題?有沒有辦法規(guī)避?

到此這篇關于mysql+shardingSphere的分庫分表實現示例的文章就介紹到這了,更多相關mysql shardingSphere分庫分表內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • mysql 5.7.11 zip安裝配置方法圖文教程

    mysql 5.7.11 zip安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql 5.7.11 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 一文詳解如何在Mycat中配置多個Schema

    一文詳解如何在Mycat中配置多個Schema

    在分布式數據庫架構中,Mycat?作為一個中間件,提供了強大的數據分片和路由能力,本文將詳細介紹如何在?Mycat?中配置多個?Schema,以滿足不同業(yè)務模塊的數據隔離需求,希望對大家有所幫助
    2025-05-05
  • Mysql5.7.18版本(二進制包安裝)自定義安裝路徑教程詳解

    Mysql5.7.18版本(二進制包安裝)自定義安裝路徑教程詳解

    這篇文章主要介紹了Mysql5.7.18版本(二進制包安裝)自定義安裝路徑教程詳解,需要的朋友可以參考下
    2017-07-07
  • MySQL異常宕機無法啟動的處理過程

    MySQL異常宕機無法啟動的處理過程

    MySQL宕機是指MySQL數據庫服務突然停止運行,通??赡苁怯捎谟布收?、軟件錯誤、資源耗盡、網絡中斷、配置問題或是惡意攻擊等導致,當MySQL發(fā)生宕機時,系統(tǒng)可能無法提供數據訪問,本文給大家介紹了MySQL異常宕機無法啟動的處理過程,需要的朋友可以參考下
    2024-08-08
  • MySQL字段默認值為NULL時的避坑指南

    MySQL字段默認值為NULL時的避坑指南

    在 MySQL 中,字段默認值為 NULL 是一種常見設計,但如果你不小心,NULL 會成為你系統(tǒng)中最隱蔽的問題源頭之一,本文將通過真實 SQL 示例,帶你了解默認值為 NULL 時常見的“坑”,需要的朋友可以參考下
    2025-05-05
  • MySQL查看事務與鎖的操作示例小結

    MySQL查看事務與鎖的操作示例小結

    本文介紹了MySQL中事務和鎖的基本概念以及不同隔離級別下的鎖類型,并通過實際測試驗證了這些鎖的使用情況,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • MySQL筆記之觸發(fā)器的應用

    MySQL筆記之觸發(fā)器的應用

    觸發(fā)器是由事件來觸發(fā)某個操作,這些事件包括INSERT語句,UPDATE語句和DELETE語句
    2013-05-05
  • MySQL主鍵和外鍵詳細的解釋和操作步驟

    MySQL主鍵和外鍵詳細的解釋和操作步驟

    主鍵是表中的一列或一組列,用于唯一標識表中的每一行數據,每個表只能有一個主鍵,并且主鍵的值不能重復,這篇文章主要介紹了MySQL主鍵和外鍵詳細的解釋和操作步驟,需要的朋友可以參考下
    2025-12-12
  • mysql經典4張表問題詳細講解

    mysql經典4張表問題詳細講解

    MySQL是一種關系型數據庫管理系統(tǒng),可以通過連接不同的表將數據進行關聯查詢,下面這篇文章主要給大家介紹了關于mysql經典4張表問題的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • MySQL 如何連接對應的客戶端進程

    MySQL 如何連接對應的客戶端進程

    這篇文章主要介紹了MySQL 如何連接對應的客戶端進程,幫助大家更好的理解和學習MySQL,感興趣的朋友可以了解下
    2020-11-11

最新評論

茌平县| 舟曲县| 双鸭山市| 奇台县| 邢台市| 手游| 和林格尔县| 山西省| 平原县| 驻马店市| 缙云县| 阜城县| 杭锦后旗| 漾濞| 汕头市| 阜平县| 沾益县| 汨罗市| 太康县| 天祝| 兰考县| 宁武县| 宝鸡市| 荔波县| 山东省| 兴安县| 东港市| 安义县| 新宾| 温州市| 娄底市| 黄大仙区| 全州县| 乃东县| 珲春市| 鹿邑县| 忻城县| 新龙县| 镇雄县| 阿荣旗| 鲜城|