更新時(shí)間:2021-06-15 15:29:22 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1523次
schema:邏輯庫(kù),與MySQL中的Database(數(shù)據(jù)庫(kù))對(duì)應(yīng),一個(gè)邏輯庫(kù)中定義了所包括的Table。
table:表,即物理數(shù)據(jù)庫(kù)中存儲(chǔ)的某一張表,與傳統(tǒng)數(shù)據(jù)庫(kù)不同,這里的表格需要聲明其所存儲(chǔ)的邏輯數(shù)據(jù)節(jié)點(diǎn)DataNode,這是通過(guò)表格的分片規(guī)則定義來(lái)實(shí)現(xiàn)的,table可以定義其所屬的“子表(childTable)”,子表的分片依賴(lài)于與“父表”的具體分片地址,簡(jiǎn)單的說(shuō),就是屬于父表里某一條記錄A的子表的所有記錄都與A存儲(chǔ)在同一個(gè)分片上。
分片規(guī)則:是一個(gè)字段與函數(shù)的捆綁定義,根據(jù)這個(gè)字段的取值來(lái)返回所在存儲(chǔ)的分片(DataNode)的序號(hào),每個(gè)表格可以定義一個(gè)分片規(guī)則,分片規(guī)則可以靈活擴(kuò)展,默認(rèn)提供了基于數(shù)字的分片規(guī)則,字符串的分片規(guī)則等。
dataNode:MyCAT的邏輯數(shù)據(jù)節(jié)點(diǎn),是存放table的具體物理節(jié)點(diǎn),也稱(chēng)之為分片節(jié)點(diǎn),通過(guò)DataSource來(lái)關(guān)聯(lián)到后端某個(gè)具體數(shù)據(jù)庫(kù)上,一般來(lái)說(shuō),為了高可用性,每個(gè)DataNode都設(shè)置兩個(gè)DataSource,一主一從,當(dāng)主節(jié)點(diǎn)宕機(jī),系統(tǒng)自動(dòng)切換到從節(jié)點(diǎn)。
dataHost:定義某個(gè)物理庫(kù)的訪(fǎng)問(wèn)地址,用于捆綁到dataNode上。
MyCAT目前通過(guò)配置文件的方式來(lái)定義邏輯庫(kù)和相關(guān)配置:
MYCAT_HOME/conf/schema.xml中定義邏輯庫(kù),表、分片節(jié)點(diǎn)等內(nèi)容;
MYCAT_HOME/conf/rule.xml中定義分片規(guī)則;
MYCAT_HOME/conf/server.xml中定義用戶(hù)以及系統(tǒng)相關(guān)變量,如端口等。
關(guān)系圖:

根據(jù)業(yè)務(wù)的不同,將不同業(yè)務(wù)的表放到不同的數(shù)據(jù)庫(kù)中。示例:
schema.xml文件:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<!-- schema邏輯數(shù)據(jù)庫(kù) -->
<schema name="mycat1" checkSQLschema="false" sqlMaxLimit="100" dataNode="mycat1" />
<schema name="mycat2" checkSQLschema="false" sqlMaxLimit="100" dataNode="mycat2" />
<schema name="mycat3" checkSQLschema="false" sqlMaxLimit="100" dataNode="mycat3" />
<!--使用dataNode將實(shí)際數(shù)據(jù)庫(kù)和邏輯數(shù)據(jù)庫(kù)映射-->
<dataNode name="mycat1" dataHost="mycat" database="mycat1" />
<dataNode name="mycat2" dataHost="mycat" database="mycat2" />
<dataNode name="mycat3" dataHost="mycat" database="mycat3" />
<dataHost name="mycat" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<!--寫(xiě)上數(shù)據(jù)庫(kù)鏈接信息-->
<writeHost host="hostM1" url="ip1:3306" user="root" password="123456" />
<writeHost host="hostM2" url="ip2:3306" user="root" password="123456" />
<writeHost host="hostM3" url="ip3:3306" user="root" password="123456" />
</dataHost>
</mycat:schema>
server.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<property name="defaultSqlParser">druidparser</property>
</system>
<!--帳號(hào)密碼以及所鏈接的邏輯庫(kù)-->
<user name="test">
<property name="password">test</property>
<property name="schemas">mycat1,mycat2,mycat3</property>
</user>
<!--只讀的用戶(hù)信息-->
<user name="user">
<property name="password">user</property>
<property name="schemas">mycat1,mycat2,mycat3</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
以上配置是將mycat1,mycat2和mycat3數(shù)據(jù)庫(kù)分別放在ip1,ip2和ip3對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)例中。
優(yōu)點(diǎn):
缺點(diǎn):
對(duì)數(shù)據(jù)量很大的表進(jìn)行拆分,把這些表按照某種規(guī)則將數(shù)據(jù)存放到不同的數(shù)據(jù)庫(kù)中。示例:
schema.xml文件:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<!-- tb_class和tb_student有外鍵關(guān)聯(lián)關(guān)系,可以測(cè)試join -->
<schema name="test" checkSQLschema="false" sqlMaxLimit="100">
<table name="tb_user" dataNode="dn1,dn2" rule="rule1" primaryKey="id"/>
</schema>
<dataNode name="dn1" dataHost="mycat1" database="mycat1" />
<dataNode name="dn2" dataHost="mycat2" database="mycat2" />
<dataHost name="mycat1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="host1" url="ip1:3306" user="root" password="123456" />
</dataHost>
<dataHost name="mycat2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="host3" url="ip2:3306" user="root" password="123456" />
</dataHost>
</mycat:schema>
server.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<property name="defaultSqlParser">druidparser</property>
</system>
<!--帳號(hào)密碼以及所鏈接的邏輯庫(kù)-->
<user name="test">
<property name="password">test</property>
<property name="schemas">test</property>
</user>
<!--只讀的用戶(hù)信息-->
<user name="user">
<property name="password">user</property>
<property name="schemas">test</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
rule.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://org.opencloudb/">
<tableRule name="rule1">
<!--安裝id規(guī)則,將id除于1024然后取余,如果余數(shù)落在0~512就將數(shù)據(jù)寫(xiě)到第一個(gè)數(shù)據(jù)庫(kù),如果是在512~1024就放到第二個(gè)數(shù)據(jù)庫(kù)-->
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<!--分成兩片,每片的區(qū)間是512,兩個(gè)相乘必須是1024-->
<function name="func1" class="org.opencloudb.route.function.PartitionByLong">
<property name="partitionCount">2</property>
<property name="partitionLength">512</property>
</function>
</mycat:rule>
以上配置是把id在0~512的數(shù)據(jù)放在ip1對(duì)應(yīng)的數(shù)據(jù)庫(kù)mycat1中的tb_user表中,512~1024的數(shù)據(jù)放在ip2對(duì)應(yīng)的數(shù)據(jù)庫(kù)mycat2中的tb_user表中。
優(yōu)點(diǎn):
缺點(diǎn):
中間件種類(lèi)很多種,如下圖:

阿里巴巴B2B開(kāi)發(fā)的關(guān)系型分布式系統(tǒng),管理將近3000個(gè)MySQL實(shí)例。在阿里經(jīng)受住了考驗(yàn),后面由于作者的走開(kāi)的原因cobar沒(méi)有人維護(hù)了,阿里也開(kāi)發(fā)了tddl替代cobar。
社區(qū)愛(ài)好者在阿里cobar基礎(chǔ)上進(jìn)行二次開(kāi)發(fā),解決了cobar當(dāng)時(shí)存在的一些問(wèn)題,并且加入了許多新的功能在其中。目前MyCAT社區(qū)活躍度很高,目前已經(jīng)有一些公司在使用MyCAT。
數(shù)據(jù)庫(kù)界大牛,前支付寶數(shù)據(jù)庫(kù)團(tuán)隊(duì)領(lǐng)導(dǎo)樓總開(kāi)發(fā),基于mysql官方的proxy思想利用c進(jìn)行開(kāi)發(fā)的,OneProxy是一款商業(yè)收費(fèi)的中間件,專(zhuān)注在性能和穩(wěn)定性上。
這個(gè)中間件是Youtube生產(chǎn)在使用的,但是架構(gòu)很復(fù)雜。與以往中間件不同,使用Vitess應(yīng)用改動(dòng)比較大要使用他提供語(yǔ)言的API接口。
Kingshard是前360Atlas中間件開(kāi)發(fā)團(tuán)隊(duì)的陳菲利用業(yè)務(wù)時(shí)間用go語(yǔ)言開(kāi)發(fā)的,目前在不斷完善。
360團(tuán)隊(duì)基于mysql proxy把lua用C改寫(xiě)。原有版本是支持分表,目前已經(jīng)放出了分庫(kù)分表版本。
MaxScale與MySQL Route:
MaxScale是mariadb研發(fā)的,目前版本不支持分庫(kù)分表。MySQL Route是現(xiàn)在MySQL官方Oracle公司發(fā)布出來(lái)的一個(gè)中間件。
以上就是動(dòng)力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Mycat介紹的詳解”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€(xiàn)咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)