什么是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的正式版
下載后解壓,cmd超級管理員模式進入mycat\bin 目錄,執行安裝命令
mycat install
安裝完成,啟動mycat mycat start
啟動過程中如果報錯,可查看日志文件,查看錯誤原因
一般情況下有兩種錯誤,需要將conf\wrapper.conf 文件中的wrapper.java.command改為jdk的安裝目錄。
wrapper.java.command=D:\Program Files (x86)\Java\jdk1.8.0_131\bin\java.exe
將虛擬內存改小
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 使用場景二---分庫分表,取模分片(等分)
第一步,編輯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表
當我們向mycat數據庫的phones中插入數據時,數據會自己的等分到test01和test02的數據庫中。
mycat 使用場景三---分庫分表,枚舉分片
通過在配置文件中配置可能的枚舉 id,自己配置分片,根據表中的某一字段的值枚舉分到多個數據庫表中。
如下面表中根據is_free字段0,1不同的值枚舉到不同的庫中
第一步,配置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 設置枚舉
第一個表示字段的值,第二個表示第幾個庫
第二步,在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 中。