更新時間:2021-06-15 15:29:22 來源:動力節點 瀏覽1206次
schema:邏輯庫,與MySQL中的Database(數據庫)對應,一個邏輯庫中定義了所包括的Table。
table:表,即物理數據庫中存儲的某一張表,與傳統數據庫不同,這里的表格需要聲明其所存儲的邏輯數據節點DataNode,這是通過表格的分片規則定義來實現的,table可以定義其所屬的“子表(childTable)”,子表的分片依賴于與“父表”的具體分片地址,簡單的說,就是屬于父表里某一條記錄A的子表的所有記錄都與A存儲在同一個分片上。
分片規則:是一個字段與函數的捆綁定義,根據這個字段的取值來返回所在存儲的分片(DataNode)的序號,每個表格可以定義一個分片規則,分片規則可以靈活擴展,默認提供了基于數字的分片規則,字符串的分片規則等。
dataNode:MyCAT的邏輯數據節點,是存放table的具體物理節點,也稱之為分片節點,通過DataSource來關聯到后端某個具體數據庫上,一般來說,為了高可用性,每個DataNode都設置兩個DataSource,一主一從,當主節點宕機,系統自動切換到從節點。
dataHost:定義某個物理庫的訪問地址,用于捆綁到dataNode上。
MyCAT目前通過配置文件的方式來定義邏輯庫和相關配置:
MYCAT_HOME/conf/schema.xml中定義邏輯庫,表、分片節點等內容;
MYCAT_HOME/conf/rule.xml中定義分片規則;
MYCAT_HOME/conf/server.xml中定義用戶以及系統相關變量,如端口等。
關系圖:
根據業務的不同,將不同業務的表放到不同的數據庫中。示例:
schema.xml文件:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<!-- schema邏輯數據庫 -->
<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將實際數據庫和邏輯數據庫映射-->
<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>
<!--寫上數據庫鏈接信息-->
<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>
<!--帳號密碼以及所鏈接的邏輯庫-->
<user name="test">
<property name="password">test</property>
<property name="schemas">mycat1,mycat2,mycat3</property>
</user>
<!--只讀的用戶信息-->
<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數據庫分別放在ip1,ip2和ip3對應的數據庫實例中。
優點:
缺點:
對數據量很大的表進行拆分,把這些表按照某種規則將數據存放到不同的數據庫中。示例:
schema.xml文件:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<!-- tb_class和tb_student有外鍵關聯關系,可以測試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>
<!--帳號密碼以及所鏈接的邏輯庫-->
<user name="test">
<property name="password">test</property>
<property name="schemas">test</property>
</user>
<!--只讀的用戶信息-->
<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規則,將id除于1024然后取余,如果余數落在0~512就將數據寫到第一個數據庫,如果是在512~1024就放到第二個數據庫-->
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<!--分成兩片,每片的區間是512,兩個相乘必須是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的數據放在ip1對應的數據庫mycat1中的tb_user表中,512~1024的數據放在ip2對應的數據庫mycat2中的tb_user表中。
優點:
缺點:
中間件種類很多種,如下圖:
阿里巴巴B2B開發的關系型分布式系統,管理將近3000個MySQL實例。在阿里經受住了考驗,后面由于作者的走開的原因cobar沒有人維護了,阿里也開發了tddl替代cobar。
社區愛好者在阿里cobar基礎上進行二次開發,解決了cobar當時存在的一些問題,并且加入了許多新的功能在其中。目前MyCAT社區活躍度很高,目前已經有一些公司在使用MyCAT。
數據庫界大牛,前支付寶數據庫團隊領導樓總開發,基于mysql官方的proxy思想利用c進行開發的,OneProxy是一款商業收費的中間件,專注在性能和穩定性上。
這個中間件是Youtube生產在使用的,但是架構很復雜。與以往中間件不同,使用Vitess應用改動比較大要使用他提供語言的API接口。
Kingshard是前360Atlas中間件開發團隊的陳菲利用業務時間用go語言開發的,目前在不斷完善。
360團隊基于mysql proxy把lua用C改寫。原有版本是支持分表,目前已經放出了分庫分表版本。
MaxScale與MySQL Route:
MaxScale是mariadb研發的,目前版本不支持分庫分表。MySQL Route是現在MySQL官方Oracle公司發布出來的一個中間件。
以上就是動力節點Java培訓機構的小編針對“Mycat介紹的詳解”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習