高級Spring Boot---使用mycat 分庫分表

什么是mycat

? ? ? ?2013年阿里的Cobar在社區使用過程中發現存在一些比較嚴重的問題,及其使用限制,經過Mycat發起人第一次改良,第一代改良版——Mycat誕生。 Mycat開源以后,一些Cobar的用戶參與了Mycat的開發,最終Mycat發展成為一個由眾多軟件公司的實力派架構師和資深開發人員維護的社區型開源軟件。

  • 一個徹底開源的,面向企業應用開發的大數據庫集群

  • 支持事務、ACID、可以替代MySQL的加強版數據庫

  • 一個可以視為MySQL集群的企業級數據庫,用來替代昂貴的Oracle集群

  • 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server

  • 結合傳統數據庫和新型分布式數據倉庫的新一代企業級數據庫產品

  • 一個新穎的數據庫中間件產品

關鍵特性

  • 支持SQL92標準

  • 支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常見SQL語法

  • 遵守Mysql原生協議,跨語言,跨平臺,跨數據庫的通用中間件代理。

  • 基于心跳的自動故障切換,支持讀寫分離,支持MySQL主從,以及galera cluster集群。

  • 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster

  • 基于Nio實現,有效管理線程,解決高并發問題。

  • 支持數據的多片自動路由與聚合,支持sum,count,max等常用的聚合函數,支持跨庫分頁。

  • 支持單庫內部任意join,支持跨庫2表join,甚至基于caltlet的多表join。

  • 支持通過全局表,ER關系的分片策略,實現了高效的多表join查詢。

  • 支持多租戶方案。

  • 支持分布式事務(弱xa)。

  • 支持XA分布式事務(1.6.5)。

  • 支持全局序列號,解決分布式下的主鍵生成問題。

  • 分片規則豐富,插件化開發,易于擴展。

  • 強大的web,命令行監控。

  • 支持前端作為MySQL通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 odb 、巨杉。

  • 支持密碼加密

  • 支持服務降級

  • 支持IP白名單

  • 支持SQL黑名單、sql注入攻擊攔截

  • 支持prepare預編譯指令(1.6)

  • 支持非堆內存(Direct Memory)聚合計算(1.6)

  • 支持PostgreSQL的native協議(1.6)

  • 支持mysql和oracle存儲過程,out參數、多結果集返回(1.6)

  • 支持zookeeper協調主從切換、zk序列、配置zk化(1.6)

  • 支持庫內分表(1.6)

  • 集群基于ZooKeeper管理,在線升級,擴容,智能優化,大數據處理(2.0開發版)。

安裝

官網下載: http://www.mycat.io/

下載1.6的正式版

image.png

下載后解壓,cmd超級管理員模式進入mycat\bin 目錄,執行安裝命令

mycat install

image.png

安裝完成,啟動mycat mycat start

啟動過程中如果報錯,可查看日志文件,查看錯誤原因

image.png
image.png

一般情況下有兩種錯誤,需要將conf\wrapper.conf 文件中的wrapper.java.command改為jdk的安裝目錄。

wrapper.java.command=D:\Program Files (x86)\Java\jdk1.8.0_131\bin\java.exe

將虛擬內存改小

image.png

mycat 使用場景一---全局表

第一步,打開conf\ Schema.Xml 的配置文件

    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        
        <table name="users" primaryKey="ID" type="global" dataNode="dn1,dn2" />
        
    </schema>
    <dataNode name="dn1" dataHost="mysql01" database="test01" />
    <dataNode name="dn2" dataHost="mysql02" database="test02" />
    <dataHost name="mysql01" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>

        <writeHost host="host01" url="localhost:3306" user="root"
                   password="123456">
        </writeHost>
    </dataHost>
    <dataHost name="mysql02" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="host02" url="localhost:3306" user="root"
                   password="123456">
        </writeHost>
    </dataHost>

用Navicat for MySQL 連接mycat ,mycat 的連接方式跟mysql一致。

默認端口為8066,用戶名:root,密碼:123456

當我們往mycat的表中插入數據時,test01,test02也會自動插入數據。

mycat 使用場景二---分庫分表,取模分片(等分)

image.png

第一步,編輯conf\rule.xml 設置取模數

    <tableRule name="mod-long">
        <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">2</property>
    </function>

第二步,在conf\ Schema.Xml 中配置表節點

    <table name="phones" primaryKey="ID" rule="mod-long" dataNode="dn1,dn2" />

在mycat 數據庫中創建phones表,重啟mycat restart 后,test01和test02會自動創建phones表

image.png
image.png

image.png

當我們向mycat數據庫的phones中插入數據時,數據會自己的等分到test01和test02的數據庫中。

mycat 使用場景三---分庫分表,枚舉分片

通過在配置文件中配置可能的枚舉 id,自己配置分片,根據表中的某一字段的值枚舉分到多個數據庫表中。

如下面表中根據is_free字段0,1不同的值枚舉到不同的庫中

image.png

第一步,配置conf\rule.xml 枚舉的字段

    <tableRule name="sharding-by-intfile">
        <rule>
            <columns>is_free</columns>
            <algorithm>hash-int</algorithm>
        </rule>
    </tableRule>

我們可以看到枚舉的方法是hash-int ,而hash-in的實現如下:

    <function name="hash-int"
        class="io.mycat.route.function.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property>
    </function>

即枚舉值的配置文件為partition-hash-int.txt,打開conf\ partition-hash-int.txt 設置枚舉

image.png

第一個表示字段的值,第二個表示第幾個庫

第二步,在conf\ Schema.Xml 文件中新增一個表

  <table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" />

重啟mycat ,創建customer表,當我們往customer插入數據時,is_free=0的到test01庫中,is_free=1的數據到test02 中。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 《布拉格,以足球的名義》連載之《瓦茨拉夫·哈維爾機場》 迪拜轉機的時候,收到國內同事T的微信截圖,內容大概是確認代...
    劈柴捌哥閱讀 467評論 0 1
  • 久聞拆書讀書法大名,從2016年7月陸續接觸知識管理、知識體系構建課程后,各路知識服務網紅所共同強調的一個核心觀點...
    Jack周希望閱讀 343評論 0 4
  • 待我長發及腰,兄弟娶我可好? 你家三畝薄田,這些我都知道。 頭年饑荒大汗,烈日似火灼燒。 本就窮鄉僻壤,賦稅五六丈...
    劉逍遙閱讀 258評論 2 7