什麼是Mycat
它是一個開源的分佈式數據庫系統,是一個實現了 MySQL 協議的的
Server,前端用戶可以把它看作是一個數據庫代理,用 MySQL 客戶端工具和命令行訪問,而其後端可以用MySQL 原生(Native)協議與多個 MySQL 服務器通信,也可以用 JDBC 協議與大多數主流數據庫服務器通信,其核心功能是分表分庫,即將一個大表水平分割爲 N 個小表,存儲在後端 MySQL 服務器裏或者其他數據庫裏。
關鍵特性
支持SQL92標準
遵守Mysql原生協議,跨語言,跨平臺,跨數據庫的通用中間件代理。
基於心跳的自動故障切換,支持讀寫分離,支持MySQL主從,以及galera cluster集羣。
支持Galera for MySQL集羣,Percona Cluster或者MariaDB cluster
基於Nio實現,有效管理線程,高併發問題。
支持數據的多片自動路由與聚合,支持sum,count,max等常用的聚合函數。
支持單庫內部任意join,支持跨庫2表join,甚至基於caltlet的多表join。
支持通過全局表,ER關係的分片策略,實現了高效的多表join查詢。
支持多租戶方案。
支持分佈式事務(弱xa)。
支持全局序列號,解決分佈式下的主鍵生成問題。
分片規則豐富,插件化開發,易於擴展。
強大的web,命令行監控。
支持前端作爲mysq通用代理,後端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
支持密碼加密
支持服務降級
支持IP白名單
支持SQL黑名單、sql注入攻擊攔截
支持分表(1.6)
集羣基於ZooKeeper管理,在線升級,擴容,智能優化,大數據處理(2.0開發版)。
Mycat安裝與使用
下載:
https://github.com/MyCATApache/Mycat-download 具體下載哪個版本以發佈爲準,推薦穩定最新版(我這裏使用1.6.6.1)
安裝:
下載的文件直接解壓即可。
運行:
linux:
./mycat start 啓動
./mycat stop 停止
./mycat console 前臺運行
./mycat install 添加到系統自動啓動(暫未實現)
./mycat remove 取消隨系統自動啓動(暫未實現)
./mycat restart 重啓服務
./mycat pause 暫停
./mycat status 查看啓動狀態
win:
直接運行startup_nowrap.bat,如果出現閃退,在cmd 命令行運行,查看出錯原因。
內存配置:
啓動前,一般需要修改JVM配置參數,打開conf/wrapper.conf文件,如下行的內容爲2G和2048,可根據本機配置情況修改爲512M或其它值。 以下配置跟jvm參數完全一致,可以根據自己的jvm參數調整。
Java Additional Parameters
wrapper.java.additional.1=
wrapper.java.additional.1=-DMYCAT_HOME=.
wrapper.java.additional.2=-server
wrapper.java.additional.3=-XX:MaxPermSize=64M
wrapper.java.additional.4=-XX:+AggressiveOpts
wrapper.java.additional.5=-XX:MaxDirectMemorySize=100m
wrapper.java.additional.6=-Dcom.sun.management.jmxremote
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1984
wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false
wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false
wrapper.java.additional.10=-Xmx100m
wrapper.java.additional.11=-Xms100m
wrapper.java.additional.12=-XX:+UseParNewGC
wrapper.java.additional.13=-XX:+UseConcMarkSweepGC
wrapper.java.additional.14=-XX:+UseCMSCompactAtFullCollection
wrapper.java.additional.15=-XX:CMSFullGCsBeforeCompaction=0
wrapper.java.additional.16=-XX:CMSInitiatingOccupancyFraction=70
以下配置作廢:
wrapper.java.initmemory=3
wrapper.java.maxmemory=64
Mycat連接測試:
測試mycat與測試mysql完全一致,mysql怎麼連接,mycat就怎麼連接。
推薦先採用命令行測試:
mysql -uroot -proot -P8066 -h127.0.0.1
如果採用工具連接,1.6.6.1目前部分工具無法連接,會提示database not selected,建議採用高版本,navicat測試。1.5已經修復了部分工具連接。
我這邊本地使用win10 數據庫軟件 navicat Premium12
server.xml
重點關注下面這段,其他默認即可。
參數 |
說明 |
---|---|
user |
用戶配置節點 |
--name |
登錄的用戶名,也就是連接Mycat的用戶名 |
--password |
登錄的密碼,也就是連接Mycat的密碼 |
--schemas |
數據庫名,這裏會和schema.xml中的配置關聯,多個用逗號分開,例如需要這個用戶需要管理兩個數據庫db1,db2,則配置db1,dbs |
--privileges |
配置用戶針對表的增刪改查的權限,具體見文檔吧 |
schema.xml
參數 |
說明 |
---|---|
schema |
數據庫設置,此數據庫爲邏輯數據庫,name與server.xml中schema對應 |
dataNode |
分片信息,也就是分庫相關配置 |
dataHost |
物理數據庫,真正存儲數據的數據庫 |
每個節點的屬性逐一說明:
schema:
屬性 |
說明 |
---|---|
name |
邏輯數據庫名,與server.xml中的schema對應 |
checkSQLschema |
數據庫前綴相關設置,建議看文檔,這裏暫時設爲folse |
sqlMaxLimit |
select 時默認的limit,避免查詢全表 |
table:
屬性 |
說明 |
---|---|
name |
表名,物理數據庫中表名 |
dataNode |
表存儲到哪些節點,多個節點用逗號分隔。節點爲下文dataNode設置的name |
primaryKey |
主鍵字段名,自動生成主鍵時需要設置 |
autoIncrement |
是否自增 |
rule |
分片規則名,具體規則下文rule詳細介紹 |
dataNode
屬性 |
說明 |
---|---|
name |
節點名,與table中dataNode對應 |
datahost |
物理數據庫名,與datahost中name對應 |
database |
物理數據庫中數據庫名 |
dataHost
屬性 |
說明 |
---|---|
name |
物理數據庫名,與dataNode中dataHost對應 |
balance |
均衡負載的方式 |
writeType |
寫入方式 |
dbType |
數據庫類型 |
heartbeat |
心跳檢測語句,注意語句結尾的分號要加。 |
Mycat 運行
可能會出現問題 (主要是數據源問題或者不能連接到mysql)
我之前遇到的 nvalid datasource:0 invalid datasource:1
1.需要更改 mysql中的mysql.user表中的root 用戶的 host改爲%
2.mysql配置項 增加 skip-grant-tables
成功時
插入兩條數據
在mycat中取數據
分庫分表規則 按照rule.xml中的配置
參考
《Mycat權威指南》: http://www.mycat.io/document/Mycat_V1.6.0.pdf
下載地址:http://dl.mycat.io/