前言
說明
最近從同事那邊瞭解到一些數據庫主從讀寫分離,分片的工具。叫mycat。然後就寫下這篇入門博客簡單的說一下和mycat有關的內容吧。
準備
mysql5.7。安裝2個,做好主從配置。如果不會可以參照我之前的文章docker安裝mysql以及主從配置
mycat下載。從mycat官網,上面有本mycat權威指南挺好用的
1.mycat的簡短介紹
我使用mycat的原因是它對於代碼的沒有侵入,相比大家也都看過java的一些主從分離和分片的方案,就是配置多數據源,到用到主庫的時候,就調用主庫的連接。需要用到從庫的時候,就調用從庫的連接。
但是使用mycat之後,他相當於給數據庫外面再做一層。你每次調用sql語句,等於先到mycat中,mycat再分發到需要操作的數據庫中。
例如,一個表根據id分成了10個表。但是實際上在程序員看來,需要寫的代碼並不需要變化。還是操作一個表。只不過是配置好的mycat的邏輯表,它會給你分發到對應物理表中。
2.mycat的配置說明
mycat的主要配置其實就在於3(或者說4)個文件的配置
分別是:
server.xml
說明:mycat最基本的配置,配置連接的數據庫和用戶
schema.xml
說明:mycat中邏輯表的具體配置
rule.xml
說明:
mycat中邏輯表需要分片的分片規則的配置文件
以及一個具體的分片規則txt文件。我這邊命名爲chen.txt
3.表格建立
注意開啓主從後這些操作只要在主庫進行就可以,從庫會自動同步
創一張不需要分片的數據庫test,然後創一張表做例子
CREATE TABLE `test`.`test1`( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(20), PRIMARY KEY (`id`) );
然後創建需要分片的表的數據庫,創建10個數據庫,分別是db1-db10。做分片表的數據庫位置。
4.server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="defaultSqlParser">druidparser</property>
<!--需要配置的端口號-->
<property name="serverPort">8066</property>
</system>
<user name="master">
<!--name就是登錄名,password就是密碼,schemas就是對應的schema.xml裏面的邏輯庫,就是schemal標籤裏面的name,注意這個name要和數據庫中的庫名相同,readOnly就是開啓只讀-->
<property name="password">mycat</property>
<property name="schemas">test</property>
</user>
<user name="read">
<property name="password">mycat</property>
<property name="schemas">test</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
5.schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="test">
<!--不需要分片的表直接用test處理-->
<!--注意,name要和邏輯庫中的名字相同,dadaNode對應配置,schema name就是service配置文件中需要對應的用戶所操作的數據庫-->
<!--需要分片的表的配置-->
<table name="test2" dataNode="dn$1-10" rule="chen" />
</schema>
<dataNode name="test" dataHost="dh1" database="test"></dataNode>
<!--需要配置需要分片的表-->
<dataNode name="dn1" dataHost="dh1" database="db1" />
<dataNode name="dn2" dataHost="dh1" database="db2" />
<dataNode name="dn3" dataHost="dh1" database="db3" />
<dataNode name="dn4" dataHost="dh1" database="db4" />
<dataNode name="dn5" dataHost="dh1" database="db5" />
<dataNode name="dn6" dataHost="dh1" database="db6" />
<dataNode name="dn7" dataHost="dh1" database="db7" />
<dataNode name="dn8" dataHost="dh1" database="db8" />
<dataNode name="dn9" dataHost="dh1" database="db9" />
<dataNode name="dn10" dataHost="dh1" database="db10" />
<!--dataHost就是具體要連接的數據庫的,dataBase就是具體的數據庫名-->
<dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!--用於驗證心跳,這個是mysql主庫的配置-->
<writeHost host="hostM1" url="ip:3306" user="root" password="password">
<!--具體物理庫mysql從庫的配置-->
<readHost host="hostS1" url="ip:3307" user="root" password="password">
</readHost>
</writeHost>
</dataHost>
</mycat:schema>
6.rule.xml
添加
<tableRule name="chen">
<rule>
<columns>id</columns>
<algorithm>chen-test</algorithm>
</rule>
</tableRule>
<!--schema.xml中配置的rule="chen"所對應的規則,規則對應主鍵,列名爲id-->
<function name="chen-test"
class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">chen.txt</property>
<!--在conf中需要添加的txt規則文件-->
</function>
7.chen.txt
0-10=0
10-20=1
20-30=2
30-40=3
40-50=4
50-60=5
60-70=6
70-80=7
80-90=8
90-100=9
表示主鍵id爲0-10的在db1,11-20的在表bd2操作
8.開啓服務
win系統,打開bin/startup_nowrap.bat這個文件,提示mycat server startup successfully。
表示啓動成功
9.連接mycat,測試數據庫操作
打開數據庫工具,我用的是sqlyog,配置是locathost/mycat/mycat/8066
然後就可以看到之前創建好的test庫中的test表了,然後對test進行相應操作就可以
然後我們需要創建需要分片的表
CREATE TABLE `test2` ( `id` BIGINT(20) NOT NULL, `name` VARCHAR(100) DEFAULT NULL, `date` DATE DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
INSERT INTO test2 (`id`, `name`, `date`) VALUES ('10', '2', '2018-05-28')#插入測試數據
SELECT * FROM test2
創建test2表的時候可以看到,db1-10中,都創建了表test2
然後通過sqlyog連接實際的數據庫,發現如果插入對應的數據的時候,1-10會被mycat插入到db1中,11-20會被插入到db2中,以此類推
其次就是查詢。mycat會自動把分片表中的數據整合在一起顯示出來。這樣mycat的配置就算完畢了。
然後在讀寫分離這邊。可以試着關閉主庫,進行讀操作(select),發現操作都去了從庫。關閉從庫,進行寫操作(delete,update,inser),發現操作都去了主庫。
關於mycat-eye
只需要配置安裝好一個zookeeper,已經在網頁中對數據庫做好相應的連接配置即可。非常簡單,就不多敘述了。