簡(jiǎn)介
關(guān)鍵特性
支持SQL92標(biāo)準(zhǔn)
支持MySQL、Oracle焊虏、DB2、SQL Server忌怎、PostgreSQL等DB的常見(jiàn)SQL語(yǔ)法
遵守Mysql原生協(xié)議,跨語(yǔ)言筒溃,跨平臺(tái)恐似,跨數(shù)據(jù)庫(kù)的通用中間件代理。
基于心跳的自動(dòng)故障切換便锨,支持讀寫(xiě)分離,支持MySQL主從我碟,以及galera cluster集群放案。
支持Galera for MySQL集群,Percona Cluster或者M(jìn)ariaDB cluster
基于Nio實(shí)現(xiàn)矫俺,有效管理線程吱殉,解決高并發(fā)問(wèn)題掸冤。
支持?jǐn)?shù)據(jù)的多片自動(dòng)路由與聚合,支持sum,count,max等常用的聚合函數(shù),支持跨庫(kù)分頁(yè)友雳。
支持單庫(kù)內(nèi)部任意join稿湿,支持跨庫(kù)2表join,甚至基于caltlet的多表join押赊。
支持通過(guò)全局表饺藤,ER關(guān)系的分片策略,實(shí)現(xiàn)了高效的多表join查詢流礁。
支持多租戶方案涕俗。
支持分布式事務(wù)(弱xa)。
支持XA分布式事務(wù)(1.6.5)崇棠。
支持全局序列號(hào)咽袜,解決分布式下的主鍵生成問(wèn)題。
分片規(guī)則豐富枕稀,插件化開(kāi)發(fā),易于擴(kuò)展谜嫉。
強(qiáng)大的web萎坷,命令行監(jiān)控。
支持前端作為MySQL通用代理沐兰,后端JDBC方式支持Oracle哆档、DB2、SQL Server 住闯、 mongodb 瓜浸、巨杉。
支持密碼加密
支持服務(wù)降級(jí)
支持IP白名單
支持SQL黑名單比原、sql注入攻擊攔截
支持prepare預(yù)編譯指令(1.6)
支持非堆內(nèi)存(Direct Memory)聚合計(jì)算(1.6)
支持PostgreSQL的native協(xié)議(1.6)
支持mysql和oracle存儲(chǔ)過(guò)程插佛,out參數(shù)、多結(jié)果集返回(1.6)
支持zookeeper協(xié)調(diào)主從切換量窘、zk序列雇寇、配置zk化(1.6)
支持庫(kù)內(nèi)分表(1.6)
集群基于ZooKeeper管理,在線升級(jí)蚌铜,擴(kuò)容锨侯,智能優(yōu)化,大數(shù)據(jù)處理(2.0開(kāi)發(fā)版)冬殃。
什么是MYCAT
一個(gè)徹底開(kāi)源的囚痴,面向企業(yè)應(yīng)用開(kāi)發(fā)的大數(shù)據(jù)庫(kù)集群
支持事務(wù)、ACID审葬、可以替代MySQL的加強(qiáng)版數(shù)據(jù)庫(kù)
一個(gè)可以視為MySQL集群的企業(yè)級(jí)數(shù)據(jù)庫(kù)深滚,用來(lái)替代昂貴的Oracle集群
一個(gè)融合內(nèi)存緩存技術(shù)骂束、NoSQL技術(shù)、HDFS大數(shù)據(jù)的新型SQL Server
結(jié)合傳統(tǒng)數(shù)據(jù)庫(kù)和新型分布式數(shù)據(jù)倉(cāng)庫(kù)的新一代企業(yè)級(jí)數(shù)據(jù)庫(kù)產(chǎn)品
一個(gè)新穎的數(shù)據(jù)庫(kù)中間件產(chǎn)品
MYCAT監(jiān)控
支持對(duì)Mycat成箫、Mysql性能監(jiān)控
支持對(duì)Mycat的JVM內(nèi)存提供監(jiān)控服務(wù)
支持對(duì)線程的監(jiān)控
支持對(duì)操作系統(tǒng)的CPU展箱、內(nèi)存、磁盤蹬昌、網(wǎng)絡(luò)的監(jiān)控
環(huán)境
第一步:下載安裝
1.下載
wget http://dl.mycat.io/1.6.7.1/Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz
tar vxf Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz
chmod -R 755 mycat/
mkdir mycat/logs
mv mycat/ /usr/local/
2.設(shè)置環(huán)境變量
echo "MYCAT_HOME=/usr/local/mycat" >> /etc/profile
echo 'export PATH=$MYCAT_HOME/bin:$PATH' >> /etc/profile
cat /etc/profile
source /etc/profile
3.schema.xml文件配置
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--6666666666-->
<!--定義邏輯庫(kù)名-->
<!--sqlMaxLimit:每條執(zhí)行的 SQL 語(yǔ)句混驰,如果沒(méi)有加上 limit 語(yǔ)句,MyCat 也會(huì)自動(dòng)的加上所對(duì)的值-->
<!--這里的dataNode="kpcx"對(duì)應(yīng)下邊的dataNode name="kpcx"-->
<schema name="kpcx" checkSQLschema="false" sqlMaxLimit="1000" dataNode="kpcx">
</schema>
<schema name="kpcx_coupon" checkSQLschema="false" sqlMaxLimit="1000" dataNode="kpcx_coupon">
</schema>
<!---->
<!--這里的kpcx對(duì)應(yīng)上文的dataNode="kpcx"-->
<!--這里的dataHost="localhost"對(duì)應(yīng)下文的<dataHost name="localhost1"-->
<!--這里的database="db1"為服務(wù)器上實(shí)際數(shù)據(jù)庫(kù)名稱-->
<dataNode name="kpcx" dataHost="localhost" database="kpcx" />
<dataNode name="kpcx_coupon" dataHost="localhost" database="kpcx_coupon" />
<!--balance="2"皂贩,所有讀操作都隨機(jī)的在 writeHost栖榨、readhost 上分發(fā)。-->
<!-- writeType="0", 所有寫(xiě)操作發(fā)送到配置的第一個(gè) writeHost
第一個(gè)掛了切到還生存的第二個(gè)writeHost明刷,重新啟動(dòng)后已切換后的為準(zhǔn)婴栽,切換記錄在配置文件中:dnindex.properties .-->
<!--switchType 切換類型:3 基于 MySQL galary cluster 的切換機(jī)制(適合集群)(1.4.1)心跳語(yǔ)句為 show status like ‘wsrep%’-->
<dataHost name="localhost" maxCon="20000" minCon="50" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="3" >
<!--心跳檢測(cè)-->
<heartbeat>show status like 'wsrep%'</heartbeat>
<writeHost host="hostM1" url="192.168.1.81:3306" user="kpcx" password="123456" />
<writeHost host="hostS2" url="192.168.1.82:3306" user="kpcx" password="123456" />
<writeHost host="hostS3" url="192.168.1.83:3306" user="kpcx" password="123456" />
</dataHost>
</mycat:schema>
4.server.xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!--6666666666-->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="nonePasswordLogin">0</property> <!-- 0為需要密碼登陸、1為不需要密碼登陸 ,默認(rèn)為0辈末,設(shè)置為1則需要指定默認(rèn)賬戶-->
<property name="useHandshakeV10">1</property>
<property name="useSqlStat">0</property> <!-- 1為開(kāi)啟實(shí)時(shí)統(tǒng)計(jì)愚争、0為關(guān)閉 -->
<property name="useGlobleTableCheck">0</property> <!-- 1為開(kāi)啟全加班一致性檢測(cè)、0為關(guān)閉 -->
<property name="sequnceHandlerType">2</property>
<property name="subqueryRelationshipCheck">false</property> <!-- 子查詢中存在關(guān)聯(lián)查詢的情況下,檢查關(guān)聯(lián)字段中是否有分片字段 .默認(rèn) false -->
<!-- <property name="useCompression">1</property>--> <!--1為開(kāi)啟mysql壓縮協(xié)議-->
<!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!--設(shè)置模擬的MySQL版本號(hào)-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!--
<property name="processors">1</property>
<property name="processorExecutor">32</property>
-->
<!--默認(rèn)為type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
<property name="processorBufferPoolType">0</property>
<!--默認(rèn)是65535 64K 用于sql解析時(shí)最大文本長(zhǎng)度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->
<!--<property name="sequnceHandlerType">0</property>-->
<!--<property name="backSocketNoDelay">1</property>-->
<!--<property name="frontSocketNoDelay">1</property>-->
<!--<property name="processorExecutor">16</property>-->
<!--
<property name="serverPort">8066</property> <property name="managerPort">9066</property>
<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
<!--分布式事務(wù)開(kāi)關(guān)挤聘,0為不過(guò)濾分布式事務(wù)轰枝,1為過(guò)濾分布式事務(wù)(如果分布式事務(wù)內(nèi)只涉及全局表,則不過(guò)濾)组去,2為不過(guò)濾分布式事務(wù),但是記錄分布式事務(wù)日志-->
<property name="handleDistributedTransactions">0</property>
<!--
off heap for merge/order/group/limit 1開(kāi)啟 0關(guān)閉
-->
<property name="useOffHeapForMerge">1</property>
<!--
單位為m
-->
<property name="memoryPageSize">64k</property>
<!--
單位為k
-->
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!--
單位為m
-->
<property name="systemReserveMemorySize">384m</property>
<!--是否采用zookeeper協(xié)調(diào)切換 -->
<property name="useZKSwitch">false</property>
<!-- XA Recovery Log日志路徑 -->
<!--<property name="XARecoveryLogBaseDir">./</property>-->
<!-- XA Recovery Log日志名稱 -->
<!--<property name="XARecoveryLogBaseName">tmlog</property>-->
<!--如果為 true的話 嚴(yán)格遵守隔離級(jí)別,不會(huì)在僅僅只有select語(yǔ)句的時(shí)候在事務(wù)中切換連接-->
<property name="strictTxIsolation">false</property>
<property name="useZKSwitch">true</property>
</system>
<!-- 全局SQL防火墻設(shè)置 -->
<!--白名單可以使用通配符%或著*-->
<!--例如<host host="127.0.0.*" user="root"/>-->
<!--例如<host host="127.0.*" user="root"/>-->
<!--例如<host host="127.*" user="root"/>-->
<!--例如<host host="1*7.*" user="root"/>-->
<!--這些配置情況下對(duì)于127.0.0.1都能以root賬戶登錄-->
<!--
<firewall>
<whitehost>
<host host="1*7.0.0.*" user="root"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
-->
<user name="mycat" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">kpcx,kpcx_coupon</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">kpcx,kpcx_coupon</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
注意:
Linux 下部署安裝 MySQL鞍陨,默認(rèn)不忽略表名大小寫(xiě)
需要手動(dòng)到/etc/my.cnf 下配置lower_case_table_names=1 使 Linux 環(huán)境下 MySQL 忽略表名大小寫(xiě),否則使用 MyCAT 的時(shí)候會(huì)提示找不到表的錯(cuò)誤从隆!
主要文件說(shuō)明
conf 目錄下存放配置文件
server.xml 是 Mycat 服務(wù)器參數(shù)調(diào)整和用戶授權(quán)的配置文件
schema.xml 是邏輯庫(kù)定義和表以及分片定義的配置文件
rule.xml 是分片規(guī)則的配置文件诚撵,分片規(guī)則的具體一些參數(shù)信息單獨(dú)存放為文件,也在這個(gè)目錄下
配置文件修改键闺,需要重啟 Mycat 或者通過(guò) 9066 端口 reload
. lib 目錄下主要存放 mycat 依賴的一些 jar 文件.
日志存放在 logs/mycat.log 中寿烟,每天一個(gè)文件,日志的配置是在 conf/log4j.xml 中艾杏,根據(jù)自己的需要韧衣,可以調(diào)整輸出級(jí)別為 debug,debug級(jí)別下购桑,會(huì)輸出更多的信息畅铭,方便排查問(wèn)題.
schema.xml文件說(shuō)明 - dataHost標(biāo)簽
作為 Schema.xml 中最后的一個(gè)標(biāo)簽,該標(biāo)簽在 mycat 邏輯庫(kù)中也是作為最底層的標(biāo)簽存在勃蜘,直接定義了具
體的數(shù)據(jù)庫(kù)實(shí)例硕噩、讀寫(xiě)分離配置和心跳語(yǔ)句。現(xiàn)在我們就解析下這個(gè)標(biāo)簽缭贡。
name 唯一標(biāo)識(shí) dataHost 標(biāo)簽炉擅,供上層的標(biāo)簽使用辉懒。
maxCon 指定每個(gè)讀寫(xiě)實(shí)例連接池的最大連接。也就是說(shuō)谍失,標(biāo)簽內(nèi)嵌套的 writeHost眶俩、readHost 標(biāo)簽都會(huì)使用這個(gè)屬性的值來(lái)實(shí)例化出連接池的最大連接數(shù)
minCon 指定每個(gè)讀寫(xiě)實(shí)例連接池的最小連接,初始化連接池的大小快鱼。
balance 負(fù)載均衡類型颠印,目前的取值有 3 種:
balance="0", 不開(kāi)啟讀寫(xiě)分離機(jī)制,所有讀操作都發(fā)送到當(dāng)前可用的 writeHost 上抹竹。
balance="1"线罕,全部的 readHost 與 stand by writeHost 參與 select 語(yǔ)句的負(fù)載均衡
簡(jiǎn)單的說(shuō),當(dāng)雙主雙從模式(M1->S1窃判,M2->S2钞楼,并且 M1 與 M2 互為主備)
正常情況下,M2,S1,S2 都參與 select 語(yǔ)句的負(fù)載均衡袄琳。
balance="2"询件,所有讀操作都隨機(jī)的在 writeHost、readhost 上分發(fā)跨蟹。
balance="3"雳殊,所有讀請(qǐng)求隨機(jī)的分發(fā)到 wiriterHost 對(duì)應(yīng)的 readhost 執(zhí)行,writerHost 不負(fù)擔(dān)讀壓力
注意 balance=3 只在 1.4 及其以后版本有窗轩,1.3 沒(méi)有。
writeType 負(fù)載均衡類型座咆,目前的取值有 3 種:
writeType="0", 所有寫(xiě)操作發(fā)送到配置的第一個(gè) writeHost
第一個(gè)掛了切到還生存的第二個(gè)writeHost痢艺,重新啟動(dòng)后已切換后的為準(zhǔn),切換記錄在配置文件中:dnindex.properties .
writeType="1"介陶,所有寫(xiě)操作都隨機(jī)的發(fā)送到配置的 writeHost堤舒,1.5 以后廢棄不推薦。
switchType 切換類型
-1 表示不自動(dòng)切換
1 默認(rèn)值哺呜,自動(dòng)切換
2 基于 MySQL 主從同步的狀態(tài)決定是否切換:心跳語(yǔ)句為 show slave status
3 基于 MySQL galary cluster 的切換機(jī)制(適合集群)(1.4.1)心跳語(yǔ)句為 show status like ‘wsrep%’
dbType 指定后端連接的數(shù)據(jù)庫(kù)類型舌缤,目前支持二進(jìn)制的 mysql 協(xié)議,還有其他使用 JDBC 連接的數(shù)據(jù)庫(kù)某残。例如:mongodb国撵、oracle、spark 等玻墅。
dbDriver 指定連接后端數(shù)據(jù)庫(kù)使用的 Driver介牙,目前可選的值有 native 和 JDBC。
使用 native 的話澳厢,因?yàn)檫@個(gè)值執(zhí)行的是二進(jìn)制的 mysql 協(xié)議环础,所以可以使用 mysql 和 maridb囚似。
其他類型的數(shù)據(jù)庫(kù)則需要使用 JDBC 驅(qū)動(dòng)來(lái)支持。從 1.6 版本開(kāi)始支持 postgresql 的 native 原始協(xié)議线得。
如果使用 JDBC 的話需要將符合 JDBC 4 標(biāo)準(zhǔn)的驅(qū)動(dòng) JAR 包放到 MYCAT\lib 目錄下饶唤,并檢查驅(qū)動(dòng) JAR 包中包括如下目錄結(jié)構(gòu)的文件:META-INF\services\java.sql.Driver。
在這個(gè)文件內(nèi)寫(xiě)上具體的 Driver 類名贯钩,例如:com.mysql.jdbc.Driver
tempReadHostAvailable 如果配置了這個(gè)屬性 writeHost 下面的 readHost 仍舊可用募狂,默認(rèn) 0 可配置(0、1)魏保。
heartbeat 這個(gè)標(biāo)簽內(nèi)指明用于和后端數(shù)據(jù)庫(kù)進(jìn)行心跳檢查的語(yǔ)句熬尺。例如,MYSQL 可以使用 select user(),Oracle 可以使用 select 1 from dual 等谓罗。
這個(gè)標(biāo)簽還有一個(gè) connectionInitSql 屬性粱哼,主要是當(dāng)使用 Oracla 數(shù)據(jù)庫(kù)時(shí),需要執(zhí)行的初始化 SQL 語(yǔ)句就這個(gè)放到這里面來(lái)檩咱。
例如:alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'
1.4 主從切換的語(yǔ)句必須是:show slave status
writeHost 標(biāo)簽揭措、readHost 標(biāo)簽
這兩個(gè)標(biāo)簽都指定后端數(shù)據(jù)庫(kù)的相關(guān)配置給 mycat,用于實(shí)例化后端連接池刻蚯。
唯一不同的是绊含,writeHost 指定寫(xiě)實(shí)例、readHost 指定讀實(shí)例炊汹,組著這些讀寫(xiě)實(shí)例來(lái)滿足系統(tǒng)的要求躬充。
在一個(gè) dataHost 內(nèi)可以定義多個(gè) writeHost 和 readHost。
但是讨便,如果 writeHost 指定的后端數(shù)據(jù)庫(kù)宕機(jī)充甚,那么這個(gè) writeHost 綁定的所有 readHost 都將不可用。
另一方面霸褒,由于這個(gè) writeHost 宕機(jī)系統(tǒng)會(huì)自動(dòng)的檢測(cè)到伴找,并切換到備用的 writeHost 上去。
host 用于標(biāo)識(shí)不同實(shí)例废菱,一般 writeHost 我們使用*M1技矮,readHost 我們用*S1。
url 后端實(shí)例連接地址殊轴,如果是使用 native 的 dbDriver衰倦,則一般為 address:port 這種形式。
用 JDBC 或其他的dbDriver梳凛,則需要特殊指定耿币。當(dāng)使用 JDBC 時(shí)則可以這么寫(xiě):jdbc:mysql://localhost:3306/。
user 后端存儲(chǔ)實(shí)例需要的用戶名字韧拒。
password 后端存儲(chǔ)實(shí)例需要的密碼淹接。
weight 權(quán)重 配置在 readhost 中作為讀節(jié)點(diǎn)的權(quán)重(1.4 以后)十性。
usingDecrypt 是否對(duì)密碼加密默認(rèn) 0 否 如需要開(kāi)啟配置 1,同時(shí)使用加密程序?qū)γ艽a加密
常用命令
mycat restart
mycat pause
mycat stop
mycat start
mycat status
## 前臺(tái)運(yùn)行
mycat console
## 添加到系統(tǒng)自動(dòng)啟動(dòng)(暫未實(shí)現(xiàn))
mycat install
## 取消隨系統(tǒng)自動(dòng)啟動(dòng)(暫未實(shí)現(xiàn))
mycat remove
附錄:
官網(wǎng):http://www.mycat.io/