欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql+shardingSphere的分庫分表實現(xiàn)示例

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

1.什么是分庫分表

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

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

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

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

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

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

2.分片方法

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

分片方法有如下幾種:

  • hash分片法

  • range分片法

hash分片法:

主鍵對服務(wù)器數(shù)量取余。

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

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

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

range分片法:

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

3.測試數(shù)據(jù)

用一張訂單表來做測試數(shù)據(jù),根據(jù)主鍵來分庫分表:

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驅(qū)動 -->
        <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 數(shù)據(jù)源 -->
        <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.介紹

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

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

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

4.2.sharding jdbc

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

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配置已經(jīng)使用了inline表達式實現(xiàn)了基于order_id字段的分庫和分表規(guī)則。當然還提供了接口,對于自定義分庫、分表規(guī)則,可以通過實現(xiàn)ShardingSphere提供的接口來自定義算法類,并在配置中引用這些類。

public class CustomDatabaseShardingAlgorithm implements PreciseShardingAlgorithm<Integer> {
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) {
        // 根據(jù)order_id和其他可能的業(yè)務(wù)邏輯計算數(shù)據(jù)庫名稱
        int orderId = shardingValue.getValue();
        return "ds" + (orderId % 2); // 這里僅作為示例,實際請根據(jù)業(yè)務(wù)需求編寫
    }
}
spring:
  application:
    name: testDemo
  shardingsphere:
    # ... 數(shù)據(jù)源配置 ...
    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)建一個實現(xiàn)相應(yīng)接口(如PreciseShardingAlgorithm)的類,并在table-strategy部分通過algorithm-class-name屬性引用它。以上示例中的CustomTableShardingAlgorithm即是一個假設(shè)存在的自定義分表策略類。請確保實際應(yīng)用中已正確創(chuàng)建并配置此類。

4.3.sharding proxy

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

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

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

配置示例:

配置數(shù)據(jù)庫的信息

然后需要導(dǎo)入mysql的驅(qū)動:

配置分庫分表:

這里要注意了databaseName指向的數(shù)據(jù)庫是一個總庫,應(yīng)用都會往這個庫里面進行數(shù)據(jù)讀寫,然后由sharding proxy來向我們配置的不同數(shù)據(jù)源里進行分庫分表。給出一個配置文件,大家感受一下,該配置文件基于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是侵入了應(yīng)用,托管了JDBC,對代碼有侵入性。

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

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

5.留個尾巴

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

  • 不好join,需要在程序?qū)用孢M行join

  • 分布式事務(wù)

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

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

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

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

相關(guān)文章

  • zabbix監(jiān)控mysql的實例方法

    zabbix監(jiān)控mysql的實例方法

    在創(chuàng)建監(jiān)控項之前要盡量考慮清楚要監(jiān)控什么,怎么監(jiān)控,監(jiān)控數(shù)據(jù)如何存儲,監(jiān)控數(shù)據(jù)如何展現(xiàn),如何處理報警等。本文主要介紹了zabbix監(jiān)控mysql的實現(xiàn)方法,感興趣的可以了解一下
    2021-06-06
  • MYSQL本地安裝以及出現(xiàn)的問題解決

    MYSQL本地安裝以及出現(xiàn)的問題解決

    這篇文章主要給大家介紹了關(guān)于MYSQL本地安裝以及出現(xiàn)問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 一文搞懂mysql如何處理json格式的字段(解析json數(shù)據(jù))

    一文搞懂mysql如何處理json格式的字段(解析json數(shù)據(jù))

    這篇文章主要給大家介紹了關(guān)于mysql如何處理json格式的字段的相關(guān)資料,MySQL中的JSON類型是一種數(shù)據(jù)類型,用于存儲和處理JSON(JavaScript Object Notation)格式的數(shù)據(jù),需要的朋友可以參考下
    2023-12-12
  • Mysql查詢優(yōu)化的一些實用方法總結(jié)

    Mysql查詢優(yōu)化的一些實用方法總結(jié)

    對于MySQL查詢語句來說,效率是最重要的,下面這篇文章主要給大家介紹了關(guān)于Mysql查詢優(yōu)化的一些實用方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • Windows下Mysql啟動報1067的解決方法

    Windows下Mysql啟動報1067的解決方法

    這篇文章主要為大家詳細介紹了Windows下Mysql啟動報1067的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • MySQL?1130錯誤原因分析以及解決方案

    MySQL?1130錯誤原因分析以及解決方案

    這篇文章主要給大家介紹了關(guān)于MySQL?1130錯誤原因分析以及解決方案的相關(guān)資料,MySQL 1130錯誤通常是由于連接MySQL時使用的用戶名或密碼不正確所導(dǎo)致的,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • MySQL中case?when的兩種基本用法及區(qū)別總結(jié)

    MySQL中case?when的兩種基本用法及區(qū)別總結(jié)

    在mysql中case when用于計算條件列表并返回多個可能結(jié)果表達式之一,下面這篇文章主要給大家介紹了關(guān)于MySQL中case?when的兩種基本用法及區(qū)別的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • 詳解騰訊云CentOS7.0使用yum安裝mysql及使用遇到的問題

    詳解騰訊云CentOS7.0使用yum安裝mysql及使用遇到的問題

    本篇文章主要介紹了騰訊云CentOS7.0使用yum安裝mysql,詳細的介紹了使用yum安裝mysql及使用遇到的問題,有興趣的可以了解一下。
    2017-01-01
  • MySQL數(shù)據(jù)庫的23個注意事項

    MySQL數(shù)據(jù)庫的23個注意事項

    使用MySQL,安全問題不能不注意。以下是MySQL提示的23個注意事項
    2010-03-03
  • mysql中g(shù)roup by與having合用注意事項分享

    mysql中g(shù)roup by與having合用注意事項分享

    在mysql中g(shù)roup by分組查詢我們經(jīng)常會用到,并且還同時會與having合用,下面我介紹group by用法與having合用注意事項,希望此教程對各位朋友有所幫助
    2013-10-10

最新評論