中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

ShardingSphere數據分片算法及測試源碼分析

發布時間:2023-03-29 11:22:23 來源:億速云 閱讀:156 作者:iii 欄目:開發技術

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

    垂直分片

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

    ShardingSphere數據分片算法及測試源碼分析

    不過垂直分片不能從根本上解決讀寫瓶頸,因為不管你再怎么分,所有的數據始終都集中在一張表里面,就算數據庫的性能再好,也解決不了這個問題。所以我們需要進行 更加細粒度的劃分,下面我們來講解水平分片。

    水平分片

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

    ShardingSphere數據分片算法及測試源碼分析

    ShardingSphere數據分片實戰

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

    下面演示將文檔按照年份進行分表,將文檔數據分表至2013年至2022年來存,一般我們的配置文件都是配置在nacos上面,所以能夠靈活的進行配置, 當到了2023年,我們可以添加一個2023年的表,改下nacos的配置,當然,一般會先預留出數據表,nacos上面也留出空間,我們的是預留到2032年, 留出了10年。

    yml文件

    我們重點關注下面的一些配置,actual-data-nodes代表進行分片的表,使用表達式,document.document_$->{2013..2022}代表document數據庫 下面的document_前綴的表進行分片,如document_2022document_2021{2013..2022}代表2013到2022這個區間,sharding-column是分片列, 是我們數據表中的某個字段,就是根據它來進行分片,sharding-algorithms是分片算法,我們可以通過SPI來實現自己的分片算法,接口是StandardShardingAlgorithm, 如下我們使用的是INLINE基于行表達式的分片算法,algorithm-expression是分片表達式,ShardingSphere底層會進行解析表達式,然后分片到對應的數據表上面, 我們的表達式是document_$->{year},也就是根據年進行分片,當然,我們可以根據自己的需求去寫表達式,比如根據主鍵取模進行分片等,需要根據我們的實際場景去做, key-generate-strategy是主鍵生成策略,ShardingSphere支持自定義主鍵生成策略,我們只需要通過SPI就可以實現,接口是KeyGenerateAlgorithm,已經 實現了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

    測試數據數據分片

    虛幻插入十次,每次都插入2013年到2022年的數據。

    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數據分片算法及測試源碼分析

    我們可以看出,數據分片成功,我們看一下分片的數據怎么查詢的(此處只是單表查詢),我們看一下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實現把前后兩個SELECT集合的數據聯合起來,組成一個結果集查詢輸出, 聯合查詢需要每個表中的的字段相同,字段類型相同,數量相同,這也是分片的基本要求。

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

    分片算法

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

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

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

    ComplexInlineShardingAlgorithm: 基于行表達式的復合分片算法

    AutoIntervalShardingAlgorithm: 基于可變時間范圍的分片算法

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

    HintInlineShardingAlgorithm: 基于行表達式的 Hint 分片算法

    IntervalShardingAlgorithm: 基于固定時間范圍的分片算法

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

    InlineShardingAlgorithm: 基于行表達式的分片算法

    ModShardingAlgorithm: 基于取模的分片算法

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

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

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

    分布式主鍵生成算法

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

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

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

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

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

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

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

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    攀枝花市| 德兴市| 互助| 青龙| 依安县| 平定县| 凤山市| 新宾| 屏山县| 鱼台县| 百色市| 张家港市| 崇明县| 岚皋县| 岢岚县| 年辖:市辖区| 永新县| 武威市| 阜宁县| 阳朔县| 泊头市| 崇仁县| 新邵县| 巫山县| 金川县| 双柏县| 白银市| 丰城市| 太湖县| 延庆县| 漾濞| 蒙自县| 九寨沟县| 安仁县| 长岭县| 长丰县| 襄垣县| 彝良县| 连云港市| 南郑县| 盖州市|