What is Mycat?
- 一個徹底開源的,面向企業應用開發的大數據庫集羣
- 支持事務、ACID、可以替代MySQL的加強版數據庫
- 一個可以視爲MySQL集羣的企業級數據庫,用來替代昂貴的Oracle集羣
- 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
- 結合傳統數據庫和新型分佈式數據倉庫的新一代企業級數據庫產品
- 一個新穎的數據庫中間件產品
功能特性
• 支持 SQL 92標準
• 支持Mysql集羣,可以作爲Proxy使用
• 支持JDBC連接多數據庫
• 支持NoSQL數據庫
• 支持galera for mysql集羣,percona-cluster或者mariadb cluster,提供高可用性數據分片集羣
• 自動故障切換,高可用性
• 支持讀寫分離,支持Mysql雙主多從,以及一主多從的模式
• 支持全局表,數據自動分片到多個節點,用於高效表關聯查詢
• 支持獨有的基於E-R 關係的分片策略,實現了高效的表關聯查詢
• 支持一致性Hash分片,有效解決分片擴容難題
• 多平臺支持,部署和實施簡單
• 支持Catelet開發,類似數據庫存儲過程,用於跨分片複雜SQL的人工智能編碼實現,143行Demo完成跨分片的兩個表的JION查詢。
• 支持NIO與AIO兩種網絡通信機制,Windows下建議AIO,Linux下目前建議NIO
• 支持Mysql存儲過程調用
• 以插件方式支持SQL攔截和改寫
• 支持自增長主鍵、支持Oracle的Sequence機制
Mycat 的安裝
下載地址:http://dl.mycat.io/
下載完,進入conf中配置更改schema.xml,server.xml。
配置文件介紹
schema.xml 配置schema、datanode、datahost
schema就是邏輯數據庫,它包含table(邏輯表),表中有對應的datanode、分片規則
datanode,就是邏輯數據庫,含有物理數據庫名字
datahost,就是物理數據庫的ip地址,用戶名、密碼等
server.xml 配置連接mycat的用戶名、密碼、數據庫名
rule.xml 分片規則
修改mycat_home\conf\schema.xml中的url、user、password
修改mycat_home\conf\server.xml 中的user,mycat 的連接用戶信息
更改完後,進入bin目錄運行:
mycat install
mycat start
登錄物理數據庫,創建db1、db2、db3
mysql -u[username] -p -P3306
create database db1;
create database db2;
create database db3;
客戶端連接mycat,注意連接的是mycat而不是物理數據庫,mycat默認端口號8066
mysql -u[username] -p -P8066
如若在schema.xml配置了dataNode數據節點信息,記得先連接mysql創建相應的數據庫。
避免出現(Invalid datasource)的錯誤。
創建成功,連接mycat進行操作,mysql默認端口8066。
mysql -uroot -proot -P8066
使用Mycat實現分庫分表
配置schema.xml,添加一個user的表
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="user" primaryKey="id" dataNode="dn1,dn2,dn3" rule="rule10" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="127.0.0.1:3306" user="root"
password="root">
</writeHost>
</dataHost>
</mycat:schema>
接着配置rule.xml文件
在已有配置的基礎上,添加
<tableRule name="rule10">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
默認function name爲mod-long是已有的了,設置了3個分片,對應schema.xml中配置的三個數據源。
接着進入mycat,創建user表,這裏隨便建了一個,忽略了主鍵等
create table `user`(
`id` bigint(20) NOT NULL,
`age` int not null,
`password` varchar(20) not null,
`user_name` varchar(20) not null
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
可以通過explain看到,它分別向3個數據源都添加了表。
接着用SpringBoot連接Mycat 查看添加效果。
使用Mybatis進行操作,操作不變,只是mysql連接需要更新爲mycat連接,
spring.datasource.open-plat-form-data.url=jdbc:mysql://127.0.0.1:8066/TESTDB?useUnicode=true&characterEncoding=UTF-8&useSSL=true&serverTimezone=UTC
接着使用API添加三條數據
添加成功後,三條數據分別存放在3個分片中,達到分庫分表的效果。
同時,當你查詢時,mycat會自動幫你去查詢3個分片,並進行彙總返回,如下:
至此,基於mycat的分庫分表簡單實踐就結束啦,還是很簡單的,但是要真正用好,還不是一件很容易的事,因爲mycat也存在着很多侷限,預知如何可見後文分曉
上面的完整源碼以上傳至github:
https://github.com/liaozihong/SpringBoot-Learning/tree/master/SpringBoot-Mybatis-Mycat
參考鏈接:
參考鏈接:
https://blog.csdn.net/wangjun5159/article/details/51568249
https://blog.csdn.net/wangshuang1631/article/details/62898469