




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 MYcat 分片規(guī)則. 枚舉法: 通過在配置文件中配置可能的枚舉id,自己配置分片,使用規(guī)則: <tableRule name="sharding-by-intfile"> <rule> <columns>user_id</columns> <algorithm>hash-int</algorithm> </rule> </tableRule><function name="hash-int" class="org.
2、opencloudb.route.function.PartitionByFileMap"> <property name="mapFile">partition-hash-int.txt</property> <property name="type">0</property> <property name="defaultNode">0</property> </function>partition-hash-int.txt 配置:
3、10000=010010=1DEFAULT_NODE=1上面columns 標(biāo)識(shí)將要分片的表字段,algorithm 分片函數(shù), 其中分片函數(shù)配置中,mapFile標(biāo)識(shí)配置文件名稱,type默認(rèn)值為0,0表示Integer,非零表示String, 所有的節(jié)點(diǎn)配置都是從0開始,及0代表節(jié)點(diǎn)1 /* defaultNode 默認(rèn)節(jié)點(diǎn):小于0表示不設(shè)置默認(rèn)節(jié)點(diǎn),大于等于0表示設(shè)置默認(rèn)節(jié)點(diǎn)* 默認(rèn)節(jié)點(diǎn)的作用:枚舉分片時(shí),如果碰到不識(shí)別的枚舉值,就讓它路由到默認(rèn)節(jié)點(diǎn)* 如果
4、不配置默認(rèn)節(jié)點(diǎn)(defaultNode值小于0表示不配置默認(rèn)節(jié)點(diǎn)),碰到* 不識(shí)別的枚舉值就會(huì)報(bào)錯(cuò),* like this:can't find datanode for sharding column:column_name val:ffffffff */ 2.固定分片hash算法 <tableRule name="rule1
5、"> <rule> <columns>user_id</columns> <algorithm>func1</algorithm> </rule></tableRule> <function name="func1" class="org.opencloudb.route.function.PartitionByLong"> <property name="partitionCount">2,1</prop
6、erty> <property name="partitionLength">256,512</property> </function>配置說明: 上面columns 標(biāo)識(shí)將要分片的表字段,algorithm 分片函數(shù), partitionCount 分片個(gè)數(shù)列表,partitionLength 分片范圍列表分區(qū)長(zhǎng)度:默認(rèn)為最大2n=1024 ,即最大支持1024分區(qū) 約束 : count,length兩個(gè)數(shù)組的長(zhǎng)度必須是一致的。1024 = sum(counti*lengthi). count和length兩個(gè)向量的點(diǎn)積恒等于1
7、024 用法例子: 本例的分區(qū)策略:希望將數(shù)據(jù)水平分成3份,前兩份各占25%,第三份占50%。(故本例非均勻分區(qū)) / |<-1024->| / |<-256->|<-256->|<-512->| / | partition0 | partition1 | partition2 |
8、; / | 共2份,故count0=2 | 共1份,故count1=1 | int count = new int 2, 1 ; int length = new int 256, 512 ; PartitionUtil pu = new PartitionUtil(count, length); / 下面代碼演示分別以offerId字段或memberId字段根據(jù)上述分區(qū)策略拆分的
9、分配結(jié)果 int DEFAULT_STR_HEAD_LEN = 8; / cobar默認(rèn)會(huì)配置為此值 long offerId = 12345; String memberId = "qiushuo" / 若根據(jù)offerId分配,partNo1將等于0,即按照上述分區(qū)策略,offerId為12345時(shí)將會(huì)被分配到partition0中
10、 int partNo1 = pu.partition(offerId); / 若根據(jù)memberId分配,partNo2將等于2,即按照上述分區(qū)策略,memberId為qiushuo時(shí)將會(huì)被分到partition2中 int partNo2 = pu.partition(memberId, 0, DEFAULT_STR_HEAD_LEN); 如果需要平均分配設(shè)置: <function name=&
11、quot;func1" class="org.opencloudb.route.function.PartitionByLong"> <property name="partitionCount">2,1</property> <property name="partitionLength">256,512</property> </function>3.范圍約定 <tableRule name="auto-sharding-long"
12、;> <rule> <columns>user_id</columns> <algorithm>rang-long</algorithm> </rule> </tableRule><function name="rang-long" class="org.opencloudb.route.function.AutoPartitionByLong"> <property name="mapFile">autopartitio
13、n-long.txt</property> </function># range start-end ,data node index# K=1000,M=10000.0-500M=0500M-1000M=11000M-1500M=2或0-10000000=010000001-20000000=1配置說明: 上面columns 標(biāo)識(shí)將要分片的表字段,algorithm 分片函數(shù), rang-long 函數(shù)中mapFile代表配置文件路徑 所有的節(jié)點(diǎn)配置都是從0開始,及0代表節(jié)點(diǎn)1,此配置非常簡(jiǎn)單,即預(yù)先制定可能的id范圍到某個(gè)分片4.求模法 <tableRule
14、name="mod-long"> <rule> <columns>user_id</columns> <algorithm>mod-long</algorithm> </rule> </tableRule> <function name="mod-long" class="org.opencloudb.route.function.PartitionByMod"> <!- how many data nodes -> &l
15、t;property name="count">3</property> </function> 配置說明: 上面columns 標(biāo)識(shí)將要分片的表字段,algorithm 分片函數(shù), 此種配置非常明確即根據(jù)id進(jìn)行十進(jìn)制求模預(yù)算,相比方式1,此種在批量插入時(shí)需要切換數(shù)據(jù)源,id不連續(xù) 5.日期列分區(qū)法 <tableRule name="sharding-by-date"> <rule> <columns>create_time</columns> <algorithm&g
16、t;sharding-by-date</algorithm> </rule> </tableRule> <function name="sharding-by-date" class="org.opencloudb.route.function.PartitionByDate"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">
17、;2014-01-01</property> <property name="sPartionDay">10</property> </function>配置說明: 上面columns 標(biāo)識(shí)將要分片的表字段,algorithm 分片函數(shù), 配置中配置了開始日期,分區(qū)天數(shù),即默認(rèn)從開始日期算起,分隔10天一個(gè)分區(qū)Assert.assertEquals(true, 0 = partition.calculate("2014-01-01");Assert.assertEquals(true, 0 = partit
18、ion.calculate("2014-01-10");Assert.assertEquals(true, 1 = partition.calculate("2014-01-11");Assert.assertEquals(true, 12 = partition.calculate("2014-05-01");6.通配取模 <tableRule name="sharding-by-pattern"> <rule> <columns>user_id</columns>
19、 <algorithm>sharding-by-pattern</algorithm> </rule> </tableRule><function name="sharding-by-pattern" class="org.opencloudb.route.function.PartitionByPattern"> <property name="patternValue">256</property> <property name="
20、defaultNode">2</property> <property name="mapFile">partition-pattern.txt</property> </function>partition-pattern.txt # id partition range start-end ,data node index# first host configuration1-32=033-64=165-96=297-128=3# second host configuration129-160=4161-
21、192=5193-224=6225-256=70-0=7配置說明: 上面columns 標(biāo)識(shí)將要分片的表字段,algorithm 分片函數(shù),patternValue 即求模基數(shù),defaoultNode 默認(rèn)節(jié)點(diǎn),如果配置了默認(rèn),則不會(huì)按照求模運(yùn)算 mapFile 配置文件路徑 配置文件中,1-32 即代表id%256后分布的范圍,如果在1-32則在分區(qū)1,其他類推,如果id非數(shù)據(jù),則會(huì)分配在defaoultNode 默認(rèn)節(jié)點(diǎn) String idVal = "0"Assert.assertEquals(true, 7 = autoPartition.calculate(id
22、Val);idVal = "45a"Assert.assertEquals(true, 2 = autoPartition.calculate(idVal);7. ASCII碼求模通配 <tableRule name="sharding-by-prefixpattern"> <rule> <columns>user_id</columns> <algorithm>sharding-by-prefixpattern</algorithm> </rule> <
23、/tableRule><function name="sharding-by-pattern" class="org.opencloudb.route.function.PartitionByPattern"> <property name="patternValue">256</property> <property name="prefixLength">5</property> <property name="mapFile&q
24、uot;>partition-pattern.txt</property> </function>partition-pattern.txt# range start-end ,data node index# ASCII# 48-57=0-9# 64銆5-90=銆丄-Z# 97-122=a-z# first host configuration1-4=05-8=19-12=213-16=3# second host configuration17-20=421-24=525-28=629-32=70-0=7配置說明: 上面columns 標(biāo)識(shí)將要分片的表字段,a
25、lgorithm 分片函數(shù),patternValue 即求?;鶖?shù),prefixLength ASCII 截取的位數(shù) mapFile 配置文件路徑 配置文件中,1-32 即代表id%256后分布的范圍,如果在1-32則在分區(qū)1,其他類推 此種方式類似方式6只不過采取的是將列種獲取前prefixLength位列所有ASCII碼的和進(jìn)行求模sum%patternValue ,獲取的值,在通配范圍內(nèi)的 即 分片數(shù), /* ASCII編碼:* 48-57=0-9阿拉伯?dāng)?shù)字* 64、65-90=、A-Z* 97-122=a-z*/如 String idVal="gf89f
26、9a"Assert.assertEquals(true, 0=autoPartition.calculate(idVal);idVal="8df99a"Assert.assertEquals(true, 4=autoPartition.calculate(idVal);idVal="8dhdf99a"Assert.assertEquals(true, 3=autoPartition.calculate(idVal);8.編程指定 <tableRule name="sharding-by-substring"> &
27、lt;rule> <columns>user_id</columns> <algorithm>sharding-by-substring</algorithm> </rule> </tableRule><function name="sharding-by-substring" class="org.opencloudb.route.function.PartitionDirectBySubString"> <property name="start
28、Index">0</property> <!- zero-based -> <property name="size">2</property> <property name="partitionCount">8</property> <property name="defaultPartition">0</property> </function>配置說明: 上面columns 標(biāo)識(shí)將要分片的表字段,algor
29、ithm 分片函數(shù) 此方法為直接根據(jù)字符子串(必須是數(shù)字)計(jì)算分區(qū)號(hào)(由應(yīng)用傳遞參數(shù),顯式指定分區(qū)號(hào))。 例如id=05-100000002 在此配置中代表根據(jù)id中從startIndex=0,開始,截取siz=2位數(shù)字即05,05就是獲取的分區(qū),如果沒傳默認(rèn)分配到defaultPartition9.字符串hash解析 <tableRule name="sharding-by-stringhash"> <rule> <columns>user_id</columns> <algorithm>shardi
30、ng-by-stringhash</algorithm> </rule> </tableRule><function name="sharding-by-substring" class="org.opencloudb.route.function.PartitionDirectBySubString"> <property name=length>512</property> <!- zero-based -> <property name="count
31、">2</property> <property name="hashSlice">0:2</property> </function>配置說明: 上面columns 標(biāo)識(shí)將要分片的表字段,algorithm 分片函數(shù) 函數(shù)中l(wèi)ength代表字符串hash求?;鶖?shù),count分區(qū)數(shù),hashSlice hash預(yù)算位即根據(jù)子字符串 hash運(yùn)算 hashSlice : 0 means str.length(), -1 means str.length()-1/*
32、;* "2" -> (0,2)<br/> * "1:2" -> (1,2)<br/> * "1:" -> (1,0)<br/> * "-1:" -> (-1,0)<br/> * ":-1" -> (0,-1)<br/>
33、 * ":" -> (0,0)<br/> */例子: String idVal=null; rule.setPartitionLength("512"); rule.setPartitionCount("2"); rule.init(); rule.setHashSlice("0:2");/idVal = "0"/Assert.assertEquals(true, 0 = rule.calcul
34、ate(idVal);/idVal = "45a"/Assert.assertEquals(true, 1 = rule.calculate(idVal); /last 4 rule = new PartitionByString(); rule.setPartitionLength("512"); rule.setPartitionCount("2"); rule.init(); /last 4 characters rule.setHashSlice("-4:0"); idVal = "aaaabbb
35、0000" Assert.assertEquals(true, 0 = rule.calculate(idVal); idVal = "aaaabbb2359" Assert.assertEquals(true, 0 = rule.calculate(idVal);10,一致性hash <tableRule name="sharding-by-murmur"> <rule> <columns>user_id</columns> <algorithm>murmur</algorit
36、hm> </rule> </tableRule><function name="murmur" class="org.opencloudb.route.function.PartitionByMurmurHash"> <property name="seed">0</property><!- 默認(rèn)是0-> <property name="count">2</property><!- 要分片的數(shù)據(jù)庫(kù)節(jié)點(diǎn)數(shù)量,必
37、須指定,否則沒法分片-> <property name="virtualBucketTimes">160</property><!- 一個(gè)實(shí)際的數(shù)據(jù)庫(kù)節(jié)點(diǎn)被映射為這么多虛擬節(jié)點(diǎn),默認(rèn)是160倍,也就是虛擬節(jié)點(diǎn)數(shù)是物理節(jié)點(diǎn)數(shù)的160倍-> <!- <property name="weightMapFile">weightMapFile</property> 節(jié)點(diǎn)的權(quán)重,沒有指定權(quán)重的節(jié)點(diǎn)默認(rèn)是1。以properties文件的格式填寫,以從0開始到count-1的整數(shù)值也就是節(jié)點(diǎn)索引為k
38、ey,以節(jié)點(diǎn)權(quán)重值為值。所有權(quán)重值必須是正整數(shù),否則以1代替 -> <!- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 用于測(cè)試時(shí)觀察各物理節(jié)點(diǎn)與虛擬節(jié)點(diǎn)的分布情況,如果指定了這個(gè)屬性,會(huì)把虛擬節(jié)點(diǎn)的murmur hash值與物理節(jié)點(diǎn)的映射按行輸出到這個(gè)文件,沒有默認(rèn)值,如果不指定,就不會(huì)輸出任何東西 -> </function>一致性hash預(yù)算有效解決了分布式數(shù)據(jù)的擴(kuò)容問題,前1-9中id規(guī)則都多少存在數(shù)據(jù)擴(kuò)容難題,而10規(guī)則解
39、決了數(shù)據(jù)擴(kuò)容難點(diǎn) 關(guān)于一致性hash詳細(xì): 一致性哈希算法在1997年由麻省理工學(xué)院提出的一種分布式哈希(DHT)實(shí)現(xiàn)算法,設(shè)計(jì)目標(biāo)是為了解決因特網(wǎng)中的熱點(diǎn)(Hot spot)問題,初衷和CARP十分類似。一致性哈希修正了CARP使用的簡(jiǎn) 單哈希算法帶來的問題,使得分布式哈希(DHT)可以在P2P環(huán)境中真正得到應(yīng)用。 一致性hash算法提出了在動(dòng)態(tài)變化的Cache環(huán)境中,判定哈希算法好壞的四個(gè)定義: 1、平衡性(Balance):平衡性是指哈希的結(jié)果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。很多哈希算法都能夠滿足這一條件。 2
40、、單調(diào)性(Monotonicity):?jiǎn)握{(diào)性是指如果已經(jīng)有一些內(nèi)容通過哈希分派到了相應(yīng)的緩沖中,又有新的緩沖加入到系統(tǒng)中。哈希的結(jié)果應(yīng)能夠保證原有已分配的內(nèi)容可以被映射到原有的或者新的緩沖中去,而不會(huì)被映射到舊的緩沖集合中的其他緩沖區(qū)。 3、分散性(Spread):在分布式環(huán)境中,終端有可能看不到所有的緩沖,而是只能看到其中的一部分。當(dāng)終端希望通過哈希過程將內(nèi)容映射到緩沖上時(shí),由于不同終端所見的緩沖范圍有可能不同,從而導(dǎo)致哈希的結(jié)果不一致,最終的結(jié)果是相同的內(nèi)容被不同的終端映射到不同的緩沖區(qū)中。這種情況顯然是應(yīng)該避免的,因?yàn)樗鼘?dǎo)致相同內(nèi)容被存儲(chǔ)到不同緩沖中去,降低了系統(tǒng)存儲(chǔ)的效率。
41、分散性的定義就是上述情況發(fā)生的嚴(yán)重程度。好的哈希算法應(yīng)能夠盡量避免不一致的情況發(fā)生,也就是盡量降低分散性。 4、負(fù)載(Load):負(fù)載問題實(shí)際上是從另一個(gè)角度看待分散性問題。既然不同的終端可能將相同的內(nèi)容映射到不同的緩沖區(qū)中,那么對(duì)于一個(gè)特定的緩沖區(qū)而言,也可能被不同的用戶映射為不同 的內(nèi)容。與分散性一樣,這種情況也是應(yīng)當(dāng)避免的,因此好的哈希算法應(yīng)能夠盡量降低緩沖的負(fù)荷。 在分布式集群中,對(duì)機(jī)器的添加刪除,或者機(jī)器故障后自動(dòng)脫離集群這些操作是分布式集群管理最基本的功能。如果采用常用的hash(object)%N算法,那么在有機(jī)器添加或者刪除后,很多原有的
42、數(shù)據(jù)就無(wú)法找到了,這樣嚴(yán)重的違反了單調(diào)性原則。接下來主要講解一下一致性哈希算法是如何設(shè)計(jì)的: 環(huán)形Hash空間 按照常用的hash算法來將對(duì)應(yīng)的key哈希到一個(gè)具有232次方個(gè)桶的空間中,即0(232)-1的數(shù)字空間中。現(xiàn)在我們可以將這些數(shù)字頭尾相連,想象成一個(gè)閉合的環(huán)形。如下圖
43、; 把數(shù)據(jù)通過一定的hash算法處理后映射到環(huán)上 現(xiàn)在我們將object1、object2、object3、object4四個(gè)對(duì)象通過特定的Hash函數(shù)計(jì)算出對(duì)應(yīng)的key值,然后散列到Hash環(huán)上。如下圖: Hash(object1) = key1; Hash(object2) = key2; Hash(object3
44、) = key3; Hash(object4) = key4; 將機(jī)器通過hash算法映射到環(huán)上 在采用一致性哈希算法的分布式集群中將新的機(jī)器加入,其原理
45、是通過使用與對(duì)象存儲(chǔ)一樣的Hash算法將機(jī)器也映射到環(huán)中(一般情況下對(duì)機(jī)器的hash計(jì)算是采用機(jī)器的IP或者機(jī)器唯一的別名作為輸入值),然后以順時(shí)針的方向計(jì)算,將所有對(duì)象存儲(chǔ)到離自己最近的機(jī)器中。 假設(shè)現(xiàn)在有NODE1,NODE2,NODE3三臺(tái)機(jī)器,通過Hash算法得到對(duì)應(yīng)的KEY值,映射到環(huán)中,其示意圖如下: Hash(NODE1) = KEY1; Hash(NODE2) = KEY2; Hash(NODE3) = KEY3;
46、; 通過上圖可以看出對(duì)象與機(jī)器處于同一哈??臻g中,這樣按順時(shí)針轉(zhuǎn)動(dòng)object1存儲(chǔ)到了NODE1中,object3存儲(chǔ)到了NODE2中,object2、object4存儲(chǔ)到了NODE3中。在這樣的部署環(huán)境中,hash環(huán)是不會(huì)變更的,因此,通過算出對(duì)象的hash值就能快速的定位到對(duì)應(yīng)的機(jī)器中,這樣就能找到對(duì)象真正的存儲(chǔ)位置了。 機(jī)器的
47、刪除與添加 普通hash求余算法最為不妥的地方就是在有機(jī)器的添加或者刪除之后會(huì)照成大量的對(duì)象存儲(chǔ)位置失效,這樣就大大的不滿足單調(diào)性了。下面來分析一下一致性哈希算法是如何處理的。 1. 節(jié)點(diǎn)(機(jī)器)的刪除 以上面的分布為例,如果NODE2出現(xiàn)故障被刪除了,那么按照順時(shí)針遷移的方法,object3將會(huì)被遷移到NODE3中,這樣僅僅是object3的映射位置發(fā)生了變化,其它的對(duì)象沒有任何的改動(dòng)。如下圖: 2. 節(jié)點(diǎn)(機(jī)器)的添加 如果往集群中添加一個(gè)新的節(jié)點(diǎn)NODE4,通過對(duì)應(yīng)的哈希算法得到KEY4,并映射到環(huán)中,如下圖:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國(guó)電腦鼠標(biāo)行業(yè)深度研究及發(fā)展前景投資評(píng)估分析
- 2025至2030中國(guó)電機(jī)控制中心行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國(guó)現(xiàn)場(chǎng)服務(wù)管理(FSM)行業(yè)市場(chǎng)深度研究及發(fā)展前景投資可行性分析報(bào)告
- 教育文化傳承與實(shí)踐成效研究
- 牛類養(yǎng)殖培訓(xùn)課件
- 智慧城市背景下智能家居化學(xué)品的環(huán)境影響分析
- 新時(shí)代的情感智能培養(yǎng)策略研究
- 醫(yī)療教育中基于大數(shù)據(jù)的個(gè)性化培訓(xùn)模式研究
- 智慧醫(yī)療的崛起線上醫(yī)療咨詢的新趨勢(shì)
- 學(xué)習(xí)環(huán)境對(duì)學(xué)習(xí)動(dòng)機(jī)的塑造作用
- 中國(guó)石油天然氣集團(tuán)公司管理人員違紀(jì)違規(guī)行為處分規(guī)定
- CJJ2-2020城市橋梁工程施工與質(zhì)量驗(yàn)收標(biāo)準(zhǔn)
- 集團(tuán)公司集中采購(gòu)管理制度
- 第一步 SYB創(chuàng)業(yè)意識(shí)培訓(xùn):將你作為創(chuàng)業(yè)者來評(píng)價(jià)
- 安全事故應(yīng)急響應(yīng)程序流程圖
- 小學(xué)五年級(jí)數(shù)學(xué)列式計(jì)算
- LY/T 1812-2009林地分類
- GB/T 28874-2012空間科學(xué)實(shí)驗(yàn)數(shù)據(jù)產(chǎn)品分級(jí)規(guī)范
- GB/T 19808-2005塑料管材和管件公稱外徑大于或等于90mm的聚乙烯電熔組件的拉伸剝離試驗(yàn)
- GB/T 18379-2001建筑物電氣裝置的電壓區(qū)段
- GB/T 18204.26-2000公共場(chǎng)所空氣中甲醛測(cè)定方法
評(píng)論
0/150
提交評(píng)論