一文帶你深入淺出Mycat分庫分表

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
image.png
修改mycat_home\conf\server.xml 中的user,mycat 的連接用戶信息
image.png

更改完後,進入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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章