上一篇 <<<MyCat實現(xiàn)讀寫分離與動態(tài)數(shù)據(jù)源切換
下一篇 >>>MyCat的分片查詢原理
分表分庫與分區(qū)的區(qū)別
相同目的:解決并發(fā)能力、I/O 性能提升、將一張大表分成若干小表许起,業(yè)務(wù)同時訪問多個表。
(物理)分表:一張表分成N多個小表
(物理/邏輯)分區(qū):把一張表的數(shù)據(jù)分成N多個區(qū)塊弊决,這些區(qū)塊可以在同一個磁盤上,也可以在不同的磁盤上。
分區(qū)并不是生成新的數(shù)據(jù)表,而是將表的數(shù)據(jù)均衡分攤到不同的硬盤切揭,系統(tǒng)或是不同服務(wù)器存儲介子中,實際上還是一張表锁摔。
1.分表分庫存在的問題
1廓旬、自增ID問題
2、數(shù)據(jù)關(guān)聯(lián)查詢問題
3谐腰、數(shù)據(jù)同步問題
2.自增ID問題解決辦法
a孕豹、設(shè)置數(shù)據(jù)庫的步長
缺點:步長確定后,無法擴展新的mysql十气,不然生成步長的規(guī)則可能會發(fā)生變化励背。
查詢自增的步長
SHOW VARIABLES LIKE 'auto_inc%'
修改自增的步長
SET @@auto_increment_increment=10;
修改起始值
SET @@auto_increment_offset=5;
假設(shè)有兩臺mysql數(shù)據(jù)庫服務(wù)器
節(jié)點①自增 1 3 5 7 9 11 ….
節(jié)點②自增 2 4 6 8 10 12 ….
b、UUID形式砸西,缺點是不能排序
c叶眉、使用雪花算法或redis解決
3.數(shù)據(jù)庫分表分庫策略
3.1垂直拆分
垂直拆分就是根據(jù)不同的業(yè)務(wù),分為不同的數(shù)據(jù)庫芹枷,比如會員數(shù)據(jù)庫衅疙、訂單數(shù)據(jù)庫、支付數(shù)據(jù)庫等鸳慈,垂直拆分在大型電商系統(tǒng)中用的非常常見饱溢。
優(yōu)點:拆分后業(yè)務(wù)清晰,拆分規(guī)則明確走芋,系統(tǒng)之間整合或擴展容易绩郎。
缺點:
a潘鲫、部分業(yè)務(wù)表無法join,只能通過接口方式解決肋杖,提高了系統(tǒng)復(fù)雜度
b溉仑、存在分布式事務(wù)問題。
3.2水平拆分
水平拆分是按照某個字段的某種規(guī)則兽愤,把同一個表分散到不同的數(shù)據(jù)庫中彼念,每個表中包含一部分數(shù)據(jù)
優(yōu)點:該方式提高了系統(tǒng)的穩(wěn)定性跟負載能力
缺點:跨庫join性能較差
3.3水平拆分策略
3.3.1 求模算法
根據(jù)id進行十進制求摸運算,運算結(jié)果為分區(qū)索引
注意:數(shù)據(jù)庫節(jié)點分片數(shù)量無法更改浅萧,和ES集群非常相似的逐沙。
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="role1">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!--指定分片數(shù)量,不可以被更改-->
<property name="count">3</property>
</function>
</mycat:rule>
create table user(id bigint not null auto_increment primary key,name varchar(100));
INSERT INTO `user`(`id`,`name`)
VALUES
(1,'dd'),
(2,'tt'),
(3,'cc'),
(4,'ww'),
(5,'kk');
select * from `user`;
3.3.2 分片枚舉
根據(jù)不同的枚舉常量洼畅,進行分類存儲
1.案例步驟:
創(chuàng)建數(shù)據(jù)庫userdb_1 吩案、 userdb_2、userdb_3
2.修改partition-hash-int.txt 規(guī)則
wuhan=0
shanghai=1
suzhou=2
規(guī)則:
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="role2">
<rule>
<!--將要分片的表字段-->
<columns>name</columns>
<!--分片函數(shù)-->
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<!--標識配置文件名稱-->
<property name="mapFile">partition-hash-int.txt</property>
<!--type默認值為0帝簇,0表示Integer徘郭,非零表示String-->
<property name="type">1</property>
<!--所有的節(jié)點配置都是從0開始,即0代表節(jié)點1
defaultNode 設(shè)置默認節(jié)點:小于0表示不設(shè)置默認節(jié)點丧肴,大于等于0表示設(shè)置默認節(jié)點
如果碰到不識別的枚舉值残揉,就讓它路由到默認節(jié)點
若默認節(jié)點未配置則報錯: like this:can't find datanode for sharding column:column_name val:ffffffff
-->
<property name="defaultNode">1</property>
</function>
</mycat:rule>
3.3.3、范圍約定--此分片適用于提前規(guī)劃好分片字段某個范圍屬于哪個分片
3.3.4芋浮、日期指定--按日期(天)分片
3.3.5抱环、固定分片hash算法---類似于Hashmap,缺點是數(shù)據(jù)分布不均勻
3.3.6纸巷、通配取模
3.3.7镇草、ASCII碼求模通配
3.3.8、編程指定
3.3.9瘤旨、字符串拆分hash解析
tips:
配置好之后梯啤,mycat鏈接的控制平臺無法直接打開表,但可以用sql語句進行查詢和執(zhí)行操作存哲。
原因:每次查詢表的時候都會攜帶邏輯庫的名字
推薦閱讀:
<<<MySQL自帶主從復(fù)制原理
<<<MyCat實現(xiàn)讀寫分離與動態(tài)數(shù)據(jù)源切換
<<<MyCat的分片查詢原理
<<<Sharding-Jdbc實現(xiàn)讀寫分離
<<<Sharding-Jdbc的分片算法及分表分庫
<<<Sharding-Jdbc與MyCat區(qū)別