之前已經介紹過了schema的作用了,這一篇會把rule和server一起介紹~
????????? ? 首先是rule,在這個文件里面會詳細的制定多種分片的規則,這次只抽出一些使用率比較高的方法,先上配置文件的內容
? ? ? ? ?
????????? ? 可以簡單看一下,在截圖的上半部分描述的是rule的定義,在下半部分,是rule對應的實際切分規則,這里總工介紹下面四種切分方式~murmur已坑~
——————————————————————————————-Hash-int———————————————————————————
????????? ? 先看hash-int,在這一條切分規則的下面,有一個mapfile,這代表著,這個切分規則是根據partition-hash-int的內容來決定的,那么看一下這個文本文件
? ? ? ? ?
????????? ? 很簡單的內容,這代表著切分使用的基準列里面,值為10000的時候,放在第一個DN里面(dn1),值為10010的時候,放在第二個DN里面(dn2)
????????? ? 可以看一下實際效果
? ? ? ? ?
? ? ? ? ?
????????? ? 看一下MyCAT的Debug日志,這兩條語句被分配到了dn1和dn2上面,數據庫里面也插入了相對應的數據
? ? ? ? ?
????????? ? 那么~問題來了(挖掘機滾粗~),如果插入的數據中,基準列的取值不是這個文件里面寫明的值,會是什么效果?
? ? ? ? ?
????????? ? 直截了當的報錯了~
????????? ? 好了,hash-int的這種切分規則,大體上可以理解為枚舉分區,會比較適合于取值固定的場合,比如說性別(0,1),省份(固定值,短時間不會收復日本省吧~),渠道商 or 各種平臺的ID
????????? ? 而且,用逗號分隔可以把多個值放在一個分區里面,所以可以根據實際的數據量/流量/訪問量來綜合制定切分策略;
????????? ? 缺點:畢竟不是全能戰士╮(╯_╰)╭
——————————————————————————————-range-long———————————————————————————
????????? ? 第二種切分方式,range-long,仔細一看的話,和hash-int是比較像的,也是由特定的文件來決定切分策略,所以還是去看一下文件的內容
? ? ? ? ?
????????? ? 從文件內容可以看出,這是一種范圍切分的方式,制定基準列的取值范圍,然后把這一范圍的所有數據都放到一個DN上面,這種方式和hash-int基本一致,就不截圖了(懶癌晚期,時間不夠了!)
????????? ? 這種切分策略,個人感覺在業務數據庫里面的使用場景會少一些,因為這種切分方式需要預定好整體的數量,這就決定了那種無限增長的數據不能用這個,畢竟要改動這個切分策略會很麻煩
????????? ? 真要用起來,感覺也就對自增主鍵用,然后按照一定的數量來均勻切分,比如那種一天固定X條數據的業務(溫度采集?數據采集?之類的情況),然后提前建好多個DN(庫)。
????????? ? 當然,也存在一種潛在的問題,如果在短時間發生海量的順序插入操作,而每一個DN(分庫)設定的數量比較高(比如說一個DN設定的放1000W條數據),那么在這個時候,會出現某一個DN(分庫)IO壓力非常高,而其他幾個DN(分庫)完全沒有IO操作,就會出現類似于DB中常見的熱塊/熱盤的現象,而MySQL經常用自增主鍵,所以使得MySQL的表出現大量“順序”插入的機會會多很多。
——————————————————————————————–mod-long———————————————————————————–
????????? ? mod-long,從mod來看這應該是一種取余數的方法,來看一下具體配置的信息
? ? ? ? ?
????????? ? count=4,這是代表著總共把數據切分成四份,一般是和具體的DN數量對應,從而達到把數據均勻的分布在四個DN上(當然,count
? ? ? ? ?
????????? ? 看一下MyCAT的Debug日志,看看MyCAT是如何處理的
? ? ? ? ?
????????? ? 采用這種取余數的方式時,這四條數據分別插入了四個DN(庫),而且可以看到,順序插入時,數據是被均勻的分散在多個DN(庫)上面
????????? ? 相比較于上面的range的方法,這種切分策略會更好的分散數據庫寫的壓力,但是問題也很明顯,一旦出現了范圍查詢,就需要MyCAT去合并結果,當數據量偏高的時候,這種跨庫查詢+合并結果消耗的時間有可能會增加很多,尤其是還出現了order by的時候。
????????? ? 所以這種切分策略會比較適合于單點查詢的情景,比如說…..我也不知道……真的不知道,也許在銀行,查詢個人賬戶信息的時候,一些和用戶信息的表可以做好冗余,然后利用這種方式來提供更為高效的查詢(畢竟銀行的用戶數量多,恩恩~)
——————————————————————————–partition-by-long———————————————————————————-
????????? ? partition-by-long,處于range-long和mod-long之間的一個略微折中的劃分策略,具體切分形勢依照如下描述:
????????? ? 以1024為一個單位,每個DN存放partitionLength數量的數據,且,partitionCount x partitionLength=1024
????????? ? 看起來有點難以理解,形象點描述的話,以partitionCount(4) x partitionLength(256)為例,sid%1024=0-255的放在DN1,256-511的放在DN2,以此類推
????????? ? 試著以128為偏移值插入了八條數據,直接看MyCAT的日志
? ? ? ? ?
????????? ? 可以看到,八條數據均勻的分布在這四個DN里面~
????????? ? 值得一提的是,這種切分策略也支持非均勻分布~實在是測不動了,盜圖兩張~
? ? ? ? ??
? ? ? ? ??
????????? ? 這兩張圖基本上也說明白了這種非均勻分布的劃分策略,重點還是在2×256+1×512=1024上面~
????????? ? 這種劃分策略在range-long和mod-long之間取了一個折中點,同時,也還算是比較靈活,可以根據不同的情況進行非均勻劃分,實際上能應用的場景會稍微多一點吧,或者說,不少場景都能用一用,相對減少了跨DN的情形,又把數據比較均勻的切分開來了,單點查詢也不會太慢。
———————————————————————————–寫在最后————————————————————————————-
其實MyCAT支持的切分方式還有不少,比如說按照時間的切分策略,可以按月,按天切分等,在這里也沒辦法把所有的策略都放上來,見諒了o( ̄ヘ ̄o#)
實際上從個人的觀點來看,時間的切分依照數據庫本身的分區策略來分也沒什么問題,半年度,季度的數據也還是會需要查詢的….PS: ??_(:з」∠)_真不是懶…
?可以說,MyCAT的分庫分表的重點,基本全部在這個rule里面體現了,表要不要分,表的數據怎么切分,都是需要根據實際業務來決定,充分根據業務的特點去決定最合適的劃分策略~
? ? ? ??