日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

hash算法_数据库中间件分片算法之hash

發布時間:2024/9/3 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hash算法_数据库中间件分片算法之hash 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

夜深人靜的時候,打開云音樂,點上一曲攀登,帶上真無線藍牙耳機,瞬間燃到爆,鍵盤打字如飛倦意全無。

分片規則

這幾天有人問我,dble和MyCat到底有什么不同。其實dble作為MyCAT的同門,吸收了MyCat的精華,同時也相應的做了一些減法。只支持MySQL顯得更加的純粹。所以選擇對比學習兩者我覺得挺好。

前面我們學習了schema.xml文件的配置,我們能獨立的把邏輯庫和邏輯表搭建起來,讓數據表跟隨我們的定義規則(取模)進行分布。今天我們介紹具體的分片算法。dble相對于mycat來說,是做了一些減法的。比如一致hash算法就沒有,而是使用了jumpstringhash代替了一致性hash。具體原因可以參考文章dble 沿用 jumpstringhash,移除 Mycat 一致性 hash 原因

  • hash分區算法
  • stringhash分區算法
  • enum分區算法
  • numberrange分區算法
  • patternrange分區算法
  • date分區算法
  • jumpstringhash算法
  • HASH分區算法

    Hash分區算法是一種比較典型而且常用的算法。要使用HASH分區算法需要在rule.xml中定義兩個部分。

    分區規則定義

    如下所示,使用tableRule標簽定義,name對應的是規則的名字,而rule標簽中的columns則對應的分片字段,這個字段必須和表中的字段一致。algorithm則代表了執行分片函數的名字。

    <tableRule name="auto-sharding-long"> <rule> <columns>id</columns> <algorithm>rang-long</algorithm> </rule> </tableRule>

    分區算法定義

    如下所示,使用function標簽定義分區算法,name代表算法的名字,算法的名字要和上面的tableRule中的標簽相對應。class:指定分區算法實現類。property指定了對應分區算法的參數。不同的算法參數不同。

    <function name="rang-long"" class="com.actiontech.dble.route.function.AutoPartitionByLong"> <property name="mapFile">auto-sharding-long.txt</property> ... </function>

    先看一下hash分區的定義。function的中的class屬性需要設置為hash或者com.actiontech.dble.route.function.PartitionByLong規則。然后分區算法對應參數是partitionCount和partitionLength。

    <function name="hashLong" class="hash"> <property name="partitionCount">C1[,C2, ...Cn]</property> <property name="partitionLength">L1[,L2, ...Ln]</property> </function>
    • partitionCount:指定分區的區間數,具體為 C1 [+C2 + ... + Cn]
    • partitionLength:指定各區間長度,具體區間劃分為 [0, L1), [L1, 2L1), ..., [(C1-1)L1, C1L1), [C1L1, C1L1+L2), [C1L1+L2, C1L1+2L2), ... 其中,每一個區間對應一個數據節點。

    測試Hash分區算法

    1.在啟動的時候,兩個數組點乘做運算,得到取模數。

    2.兩個數組進行叉乘,得出物理分區表。

    3.根據where條件的值來落入實際分片

    select * from shareding_key = 999;

    先根據分片鍵取出999,按照公式1的計算結果除取摸,然后得到的值落到2計算出來的分片中。

    4.舉個簡單的例子:

    <property name="partitionCount">2,3</property> <property name="partitionLength">100,50</property>

    根據公式1:

    也就是傳進來的值需要對350取模。 根據公式2: 物理分區為

    999對350取模,正好是299。落在[250-300]這個區間里面。也就是第4個區間。 接下來我們實際來測試一下,我們在rule.xml中設置如下:

    <tableRule name="rule_hash"><rule><columns>id</columns><algorithm>func_hash_test</algorithm></rule> </tableRule><function name="func_hash_test" class="Hash"><property name="partitionCount">2,3</property><property name="partitionLength">100,50</property> </function>

    我們通過公式2算出有5個分片。所以在schema.xml中設置table屬性如下:

    <table name="hash_test" primaryKey="id" rule="rule_hash" dataNode="dn1,dn2,dn3,dn4,dn5"/>

    5.創建表測試

    我們先使用shell創建1000行數據,在創建表,通過load data語法將我們shell產生的文件進行導入。

    for i in {1..1000} do echo $i'|name'$[i]'' >>a1.txt done


    這里可以看到我們查詢999這個數據,會自動到dn4這個分片上進行查詢。再比如我們查500,500對350取模是150,150是落在第二個分區里面的。

    6.另一個例子

    <property name="partitionCount">2</property> <property name="partitionLength">1000</property>

    此時C* L=2*1000=2000,將對2000進行取模。 同時將劃分如下的分區:

    注意事項

  • M不能大于2880。2880的原因是這樣的:2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 30, 32, 36, 40, 45, 48, 60, 64, 72, 80, 90, 96, 120, 144, 160, 180, 192, 240, 288, 320, 360, 480, 576, 720, 960, 1440是2880的約數,這樣預分片擴容方便。
  • N必須要等于schema.xml中使用該分區算法的邏輯表的dataNode屬性指定的DataNode數量之和,比如我們上面這個算法是5個分區,但是如果你在邏輯表的dataNode屬性中設置分區個數小于5,dataNode="dn1,dn2,dn3,dn4",則dble就會報錯。 partition size : 5 > table datanode size : 4 please make sure table datanode size = function partition size
  • 和的個數必須相等。
  • 分區字段必須為整型字段,如果是其他類型,要求值可轉化為數字。
  • 當partitionLength為1時,hash分區算法退化為求模算法,M及N均為partitionCount的值。
  • NULL作為分片列的值的時候數據的結果恒落在0號節點(第一個節點上),建議最好不要讓這種情況出現,強制設置分片鍵為not null。
  • 最后:

    上面都是自己整理好的!我就把資料貢獻出來給有需要的人!順便求一波關注。

    學習我們是認真的,拿大廠offer是勢在必得的。java(想了解更多點一下哦)

    作者:Buddyyuan
    鏈接:https://juejin.im/post/5e0a2b16518825495a1e78f6

    總結

    以上是生活随笔為你收集整理的hash算法_数据库中间件分片算法之hash的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。