溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ShardingSphere數(shù)據(jù)分片算法及測試源碼分析

發(fā)布時(shí)間:2023-03-29 11:22:23 來源:億速云 閱讀:140 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“ShardingSphere數(shù)據(jù)分片算法及測試源碼分析”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“ShardingSphere數(shù)據(jù)分片算法及測試源碼分析”文章能幫助大家解決問題。

    垂直分片

    我們的一個(gè)數(shù)據(jù)庫中通常是有很多數(shù)據(jù)表的,不過可能由于我們的分類不到位,就會出現(xiàn)澇的澇死旱的旱死的局面,比如某些數(shù)據(jù)表的讀寫操作十分頻繁,而我的這個(gè)庫中大量的集中了這種 讀寫操作頻繁的表,那么整體的吞吐量就會降低,而某個(gè)庫中又集中了讀寫不頻繁的表,吞吐量十分的高(但是好像沒什么卵用),所以我們應(yīng)該合理的分配,以保證整理的吞吐量達(dá)到最大值, 下圖將數(shù)據(jù)表各分到了一個(gè)數(shù)據(jù)庫中。

    ShardingSphere數(shù)據(jù)分片算法及測試源碼分析

    不過垂直分片不能從根本上解決讀寫瓶頸,因?yàn)椴还苣阍僭趺捶?,所有的?shù)據(jù)始終都集中在一張表里面,就算數(shù)據(jù)庫的性能再好,也解決不了這個(gè)問題。所以我們需要進(jìn)行 更加細(xì)粒度的劃分,下面我們來講解水平分片。

    水平分片

    水平分片又可以叫做橫向拆分,就是將一張大表拆分為若干張小表,比如我一張表中有1億條數(shù)據(jù),那么我拆分為10張表,每張表中存1000萬條數(shù)據(jù),那么效率就會變高, 還有些數(shù)據(jù)需要進(jìn)行分類和歸檔,那么我們也需要進(jìn)行分表,之前我們系統(tǒng)中一個(gè)表用來存儲文檔信息,有十多年因?yàn)閿?shù)據(jù)量十分龐大,在業(yè)務(wù)中需要對文檔進(jìn)行排序等操作,本來查詢就比較 耗時(shí)了,再加上需要進(jìn)行邏輯上的處理,所以就更加耗時(shí),于是就進(jìn)行了分表,將每一年的數(shù)據(jù)存進(jìn)一個(gè)表,這樣就提高了查詢效率,并且更加容易對數(shù)據(jù)進(jìn)行追蹤和管理,如下就是水平 分片的圖例。

    ShardingSphere數(shù)據(jù)分片算法及測試源碼分析

    ShardingSphere數(shù)據(jù)分片實(shí)戰(zhàn)

    使用ShardingSphere數(shù)據(jù)分片,我們只需通過簡單的配置就能實(shí)現(xiàn),ShardingSphere幫我們屏蔽了底層邏輯,我們也可通過ShardingSphere預(yù)留的 接口和SPI進(jìn)行擴(kuò)展我們的需求,比如可以實(shí)現(xiàn)我們自己的分片算法,主鍵生成策略等等。

    下面演示將文檔按照年份進(jìn)行分表,將文檔數(shù)據(jù)分表至2013年至2022年來存,一般我們的配置文件都是配置在nacos上面,所以能夠靈活的進(jìn)行配置, 當(dāng)?shù)搅?023年,我們可以添加一個(gè)2023年的表,改下nacos的配置,當(dāng)然,一般會先預(yù)留出數(shù)據(jù)表,nacos上面也留出空間,我們的是預(yù)留到2032年, 留出了10年。

    yml文件

    我們重點(diǎn)關(guān)注下面的一些配置,actual-data-nodes代表進(jìn)行分片的表,使用表達(dá)式,document.document_$->{2013..2022}代表document數(shù)據(jù)庫 下面的document_前綴的表進(jìn)行分片,如document_2022document_2021,{2013..2022}代表2013到2022這個(gè)區(qū)間,sharding-column是分片列, 是我們數(shù)據(jù)表中的某個(gè)字段,就是根據(jù)它來進(jìn)行分片,sharding-algorithms是分片算法,我們可以通過SPI來實(shí)現(xiàn)自己的分片算法,接口是StandardShardingAlgorithm, 如下我們使用的是INLINE基于行表達(dá)式的分片算法,algorithm-expression是分片表達(dá)式,ShardingSphere底層會進(jìn)行解析表達(dá)式,然后分片到對應(yīng)的數(shù)據(jù)表上面, 我們的表達(dá)式是document_$->{year},也就是根據(jù)年進(jìn)行分片,當(dāng)然,我們可以根據(jù)自己的需求去寫表達(dá)式,比如根據(jù)主鍵取模進(jìn)行分片等,需要根據(jù)我們的實(shí)際場景去做, key-generate-strategy是主鍵生成策略,ShardingSphere支持自定義主鍵生成策略,我們只需要通過SPI就可以實(shí)現(xiàn),接口是KeyGenerateAlgorithm,已經(jīng) 實(shí)現(xiàn)了UUIDsnowflake雪花算法等主鍵生成策略。

    spring:
      shardingsphere:
        mode:
          type: Standalone
          repository:
            type: File
          overwrite: true
        datasource:
          names: document
          document:
            jdbc-url: jdbc:mysql://localhost:3306/document?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
            type: com.zaxxer.hikari.HikariDataSource
            driver-class-name: com.mysql.jdbc.Driver
            username: root
            password: qwer123@
        rules:
          sharding:
            tables:
              document:
                actual-data-nodes: document.document_$->{2013..2022}
                table-strategy:
                  standard:
                    sharding-column: year #分片列
                    sharding-algorithm-name: document-inline # 分片算法名稱
                key-generate-strategy:
                  column: id # 主鍵列
                  key-generator-name: timestamp #主鍵生成算法
            sharding-algorithms: #分片算法
              document-inline:
                type: INLINE
                props:
                  algorithm-expression: document_$->{year}
            key-generators:
              timestamp:
                type: SNOWFLAKE

    測試數(shù)據(jù)數(shù)據(jù)分片

    虛幻插入十次,每次都插入2013年到2022年的數(shù)據(jù)。

    void addDocSliceYear(){
        for (int i = 0; i < 10; i++) {
            for (int year = 2013; year <= 2022; year++) {
                Document document = new Document()
                    .setDocumentName("document year【" + year + "】")
                    .setDocumentDetail("year【" + year + "】")
                    .setYear(year);
                documentService.save(document);
            }
        }
    }

    ShardingSphere數(shù)據(jù)分片算法及測試源碼分析

    我們可以看出,數(shù)據(jù)分片成功,我們看一下分片的數(shù)據(jù)怎么查詢的(此處只是單表查詢),我們看一下ShardingSphere-SQL輸出的sql語句

    SELECT  id,document_name,document_detail,year  FROM document_2013 
    UNION ALL SELECT  id,document_name,document_detail,year  FROM document_2014 
    UNION ALL SELECT  id,document_name,document_detail,year  FROM document_2015 
    UNION ALL SELECT  id,document_name,document_detail,year  FROM document_2016 
    UNION ALL SELECT  id,document_name,document_detail,year  FROM document_2017 
    UNION ALL SELECT  id,document_name,document_detail,year  FROM document_2018 
    UNION ALL SELECT  id,document_name,document_detail,year  FROM document_2019 
    UNION ALL SELECT  id,document_name,document_detail,year  FROM document_2020 
    UNION ALL SELECT  id,document_name,document_detail,year  FROM document_2021 
    UNION ALL SELECT  id,document_name,document_detail,year  FROM document_2022

    從控制臺打印的SQL語句中看出,ShardingSphere分片查詢使用的是UNION ALL,UNION ALL實(shí)現(xiàn)把前后兩個(gè)SELECT集合的數(shù)據(jù)聯(lián)合起來,組成一個(gè)結(jié)果集查詢輸出, 聯(lián)合查詢需要每個(gè)表中的的字段相同,字段類型相同,數(shù)量相同,這也是分片的基本要求。

    上面我們只演示了單表的數(shù)據(jù)分片查詢,如果是多表查詢,我們需要配置binding-tables綁定表,這樣能夠減少查詢的笛卡爾積,從而提升查詢效率,我們就不做 詳細(xì)的介紹,可去官網(wǎng)自己查看。

    分片算法

    ShardingSphere的分片算法有多種,我們也可以自己實(shí)現(xiàn)一套分片算法,通過SPI,分片算法的頂層接口是ShardingAlgorithm,目前實(shí)現(xiàn)了多種算法。

    BoundaryBasedRangeShardingAlgorithm: 基于分片邊界的范圍分片算法

    VolumeBasedRangeShardingAlgorithm: 基于分片容量的范圍分片算法

    ComplexInlineShardingAlgorithm: 基于行表達(dá)式的復(fù)合分片算法

    AutoIntervalShardingAlgorithm: 基于可變時(shí)間范圍的分片算法

    ClassBasedShardingAlgorithm: 基于自定義類的分片算法

    HintInlineShardingAlgorithm: 基于行表達(dá)式的 Hint 分片算法

    IntervalShardingAlgorithm: 基于固定時(shí)間范圍的分片算法

    HashModShardingAlgorithm: 基于哈希取模的分片算法

    InlineShardingAlgorithm: 基于行表達(dá)式的分片算法

    ModShardingAlgorithm: 基于取模的分片算法

    CosIdModShardingAlgorithm: 基于 CosId 的取模分片算法

    CosIdIntervalShardingAlgorithm: 基于 CosId 的固定時(shí)間范圍的分片算法

    CosIdSnowflakeIntervalShardingAlgorithm: 基于 CosId 的雪花ID固定時(shí)間范圍的分片算法

    分布式主鍵生成算法

    ShardingSphere也可以自定義實(shí)現(xiàn)主鍵生成策略,通過SPI,頂層接口為KeyGenerateAlgorithm,目前實(shí)現(xiàn)的算法有。

    SnowflakeKeyGenerateAlgorithm 基于雪花算法的分布式主鍵生成算法

    UUIDKeyGenerateAlgorithm: 基于 UUID 的分布式主鍵生成算法

    CosIdKeyGenerateAlgorithm: 基于 CosId 的分布式主鍵生成算法

    CosIdSnowflakeKeyGenerateAlgorithm: 基于 CosId 的雪花算法分布式主鍵生成算法

    NanoIdKeyGenerateAlgorithm: 基于 NanoId 的分布式主鍵生成算法

    關(guān)于“ShardingSphere數(shù)據(jù)分片算法及測試源碼分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI