什么是 MyCAT ?樂字節(jié)老師問過我這么一個問題
根據(jù) MyCAT 官網(wǎng) - http://mycat.io/ 的描述可以知道, MyCAT 是如下的一個東東:
一個徹底開源的宪睹,面向企業(yè)應(yīng)用開發(fā)的大數(shù)據(jù)庫集
支持事務(wù)、ACID蚕钦、可以替代MySQL的加強版數(shù)據(jù)庫
一個可以視為MySQL集群的企業(yè)級數(shù)據(jù)庫亭病,用來替代昂貴的Oracle集群
一個融合內(nèi)存緩存技術(shù)、NoSQL技術(shù)嘶居、HDFS大數(shù)據(jù)的新型SQL Server
結(jié)合傳統(tǒng)數(shù)據(jù)庫和新型分布式數(shù)據(jù)倉庫的新一代企業(yè)級數(shù)據(jù)庫產(chǎn)品
一個新穎的數(shù)據(jù)庫中間件產(chǎn)品
總結(jié)一下就是: MyCAT 是一款數(shù)據(jù)庫中間件罪帖,類似于Tomcat 容器或者相關(guān)的 Web 中間件。它主要用于解決數(shù)據(jù)庫相關(guān)的問題食听。
MyCAT 能干什么胸蛛?為什么要使用它?使用它可以解決什么問題樱报?
用于支持海量數(shù)據(jù)存儲葬项,對海量數(shù)據(jù)進行分庫分表
支持分庫分表場景下的分布式事務(wù)
對多個數(shù)據(jù)源進行統(tǒng)一整合
高并發(fā)應(yīng)用場景下,降低請求對單個數(shù)據(jù)庫節(jié)點帶來的災(zāi)難性壓力
可以通過數(shù)據(jù)庫中間間層面實現(xiàn)數(shù)據(jù)庫讀寫分離迹蛤,使其Java程序與數(shù)據(jù)庫訪問解耦
具體更多的特性可以參考 http://mycat.io/ 對MyCAT 特性的介紹民珍。總結(jié)下來的一般常用的用途有3個盗飒,分別如下:
數(shù)據(jù)讀寫分離
數(shù)據(jù)分片
多數(shù)據(jù)源整合
MyCAT 是唯一的數(shù)據(jù)庫分庫分表的解決方案嗎嚷量?與其它的數(shù)據(jù)庫中間件有什么區(qū)別?
我們來看如下圖逆趣,圖片來源于網(wǎng)絡(luò):
具體介紹如下:
Cobar 屬于阿里 B2B 事業(yè)群蝶溶,始于 2008 年,在阿里服役 3 年多宣渗,接管 3000+ 個 MySQL 數(shù)據(jù)庫的 schema,
集 群日處理在線 SQL 請求 50 億次以上抖所。由于 Cobar 發(fā) 起人的離職, Cobar 停止維護痕囱。
My cat 是開源社區(qū)在阿里 cobar 基礎(chǔ)上進行二次開發(fā)田轧,解決了 cobar 存在的問題,并且加入了許多新
的功能在其中鞍恢。青出于藍(lán)而勝于藍(lán)傻粘。
OneProxy 基于 MySQL 官方的 proxy 思想利用 c 進行開發(fā)的每窖, OneProxy 是一款商業(yè)收費的中間件。舍
棄了一些功能弦悉,專注在性能和穩(wěn)定性上窒典。
kingshard 由小團隊用 go 語言開發(fā),還需要發(fā)展警绩,需要不斷完善 崇败。
Vite ss 是 Youtube 生產(chǎn)在使用 架構(gòu)很復(fù)雜。不支持 MySQL 原生協(xié)議肩祥,使用需要大量改造成本 。
Atlas 是 3 60 團隊基于 mysql proxy 改寫 缩膝,功能還需完善 混狠,高并發(fā)下不穩(wěn)定 。
MaxScale 是 mariadb MySQL 原作者維護的一個版本 研發(fā)的中間件
MySQLRout e 是 MySQL 官方 Oracle 公司發(fā)布的中間件
除了這些之外疾层,我們?nèi)ithub 搜羅了一下将饺,還有如下的一些數(shù)據(jù)庫中間件:
Oceanus - 58同城數(shù)據(jù)庫中間件,github star 數(shù) 500+痛黎;
SOHU-DBProxy - 是由 搜狐 數(shù)據(jù)庫團隊開發(fā)維護的一個基于MySQL協(xié)議的數(shù)據(jù)中間層項目予弧。它在MySQL官方推出的MySQL-Proxy 0.8.3版本的基礎(chǔ)上, 修改了大量bug湖饱,添加了很多功能特性∫锤颍現(xiàn)在已經(jīng)在sohu的多個業(yè)務(wù)線上使用, github star 數(shù) 700+井厌;
Cetus是由C語言開發(fā)的關(guān)系型數(shù)據(jù)庫MySQL的中間件蚓庭,主要提供了一個全面的數(shù)據(jù)庫訪問代理功能。Cetus連接方式與MySQL基本兼容仅仆,應(yīng)用程序幾乎不用修改即可通過Cetus訪問數(shù)據(jù)庫器赞,實現(xiàn)了數(shù)據(jù)庫層的水平擴展和高可用。 墓拜, github star 數(shù) 1000+港柜;
Zebra是一個基于JDBC API協(xié)議上開發(fā)出的高可用、高性能的數(shù)據(jù)庫訪問層解決方案咳榜,是美團點評內(nèi)部使用的數(shù)據(jù)庫訪問層中間件夏醉。github star 數(shù) 1500+;
MyCAT作為分庫分表中間件的原理是什么?
Mycat收到一條SQL語句時贿衍, 首先解析SQL語句涉及的表授舟, 接著查看此表的定義, 如果該表存在分片規(guī)則贸辈, 則獲取SQL語句里分片字段的值释树, 并匹配分片函數(shù)肠槽, 得到該SQL語旬對應(yīng)的分片列表, 然后將SQL語句發(fā)送到相應(yīng)的分片去執(zhí)行奢啥, 最后處理所有分片返回的數(shù)據(jù)并返回給客戶端秸仙。 以 select* from Orders where prov=? 語句為例, 查找prov=wuhan, 按照分片函數(shù)桩盲, wuhan值存放在dnl上寂纪, 于是SQL語句被發(fā)送到Mysql l , 把DBI上的查詢結(jié)果返回給用戶。
這里使用過阿里巴巴數(shù)據(jù)源 Druid 的同學(xué)不知道有沒有發(fā)現(xiàn)赌结,在Druid 中有一個叫做 SQLParser 的東東捞蛋,這個玩意其實就是可以用來對原始的SQL語句,根據(jù)SQL語法樹柬姚,對SQL進行加強改造的一個解析器拟杉,如果你們項目中有做過表數(shù)據(jù)的行權(quán)限或者列權(quán)限,則用這個Druid 的SQLParser 對所有的SQL 進行攔截改寫是一個不錯的方案量承,我之前在做數(shù)據(jù)權(quán)限的時候搬设,參考相關(guān)實現(xiàn)時,也發(fā)現(xiàn)了MyCAT 中對于SQL的解析和改寫也使用的這個撕捍,具體可以參考:https://github.com/MyCATApache/Mycat-Server/blob/f929f96a16852869bc9dc63f4c0f192ee02818e0/src/main/java/io/mycat/statistic/stat/UserSqlHighStat.java
MyCAT 入門
對于一款開箱即用的數(shù)據(jù)庫分庫分表中間件來說拿穴,MyCAT的入門相對簡單,只需要按照官方的入門指導(dǎo)一步步往下走即可忧风。
安裝
安裝之前我們首先準(zhǔn)備環(huán)境默色,這里我們以企業(yè)中生產(chǎn)使用最多的Centos 7 為示例,進行下面的實操阀蒂,本次CentOS 7 的內(nèi)核版本如下:
Linux VM_0_14_centos 3.10.0-862.el7.x86_64
由于 MyCAT 源碼是通過 Java 語言進行開發(fā)的该窗,因此在我們使用之前,需要先檢查自己的CentOS 7 主機具備不具備Java 環(huán)境蚤霞,使用java-version進行驗證酗失,如果沒有安裝JDK,則首先需要安裝JDK并且配置Java環(huán)境變量才闊以昧绣,Centos 7 安裝Java8 比較容易规肴,只需要如下一行命令即可:
yum -y install java-1.8.0-openjdk
JDK8 安裝完畢之后,進行如下驗證夜畴,沒有錯誤即可:
java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
接下來我們根據(jù)官方的入門指導(dǎo)拖刃,下載mycat server 包,下載地址為:http://dl.mycat.io/ , 這里我們實驗時使用MyCAT 1.6.7.3 release 版本即可贪绘,下載 1.6.7.3 release 安裝包到自己主機的 /opt 目錄下 , 操作命令如下:
cd /opt/ && wget? /usr/local/ http://dl.mycat.io/1.6.7.3/20190927161129/Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz
下載完成之后兑牡,我們對mycat 安裝包進行解壓即可,命令如下:
tar -zxvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz
解壓完成之后税灌,我們看到 /opt 目錄下有了一個 mycat 目錄均函,我們進入到該目錄下亿虽,發(fā)現(xiàn)它的子目錄主要有如下:
.
├── bin
├── catlet
├── conf
├── lib
├── logs
├── tmlogs
└── version.txt
這里我們進入到conf 目錄下,只關(guān)注如下的幾個配置文件即可,其它的配置文件先不用關(guān)心:
server.xml? 定義邏輯庫苞也,表洛勉、分片節(jié)點等內(nèi)容
schema.xml? 定義用戶以及系統(tǒng)相關(guān)變量,如端口等
修改相關(guān)配置
為了對用戶進行區(qū)分如迟,此時收毫,我們先修改 server.xml 中的 root 用戶為 mycat,當(dāng)使用 mycat 用戶連接時殷勘,就代表我們直連的是 mycat此再,其它的配置不動,具體修改如下:
...
<!-- 修改之前的 root 用戶為 mycat? -->
? ? <user name="mycat" defaultAccount="true">
? ? ? ? <property name="password">123456</property>
? ? ? ? <property name="schemas">TESTDB</property>
? ? ? ? <!-- 表級 DML 權(quán)限設(shè)置 -->
? ? ? ? <!--
? ? ? ? <privileges check="false">
? ? ? ? ? ? <schema name="TESTDB" dml="0110" >
? ? ? ? ? ? ? ? <table name="tb01" dml="0000"></table>
? ? ? ? ? ? ? ? <table name="tb02" dml="1111"></table>
? ? ? ? ? ? </schema>
? ? ? ? </privileges>
? ? ? ? -->
? ? </user>
...
</mycat:server>
接下來我們修改 schema.xml
刪除 標(biāo)簽間的 表信息 dataNode 標(biāo)簽只留一個 dataHost 標(biāo)簽只留一個 writeHost
<readhost 只留一="" 對劳吠,如下:<="" p="" style="box-sizing: border-box;">
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" />
? ? <dataNode name="dn1" dataHost="host1" database="testdb" />
? ? <dataHost name="host1" maxCon="1000" minCon="10" balance="3"
? ? ? ? ? ? ? writeType="0" dbType="mysql" dbDriver="native" switchType="1"? slaveThreshold="100">
? ? ? ? <heartbeat>select user()</heartbeat>
? ? ? ? <!-- can have multi write hosts -->
? ? ? ? <writeHost host="hostM1" url="118.25.102.189:3306" user="mycat"
? ? ? ? ? ? ? ? ? password="123456"></writeHost>
? ? </dataHost>
</mycat:schema>
其中<writehost host="”hostM1”" 表示="" mysql="" 的主數(shù)據(jù)庫引润,等會我們啟動="" mycat="" 之后進行驗證讀寫否可以正常進行操作。<="" p="" style="box-sizing: border-box;">
啟動 MyCAT 前驗證數(shù)據(jù)庫遠(yuǎn)程訪問情況
在驗證之前由于我們的主數(shù)據(jù)庫目前并沒有創(chuàng)建mycat 這個用戶痒玩,我們需要登錄到 118.25.102.189:3306 數(shù)據(jù)庫實例進行創(chuàng)建用戶,腳本如下:
# 在 118.25.102.189 主機上登錄 mysql 服務(wù)器
mysql -uroot
# 登錄成功后進行創(chuàng)建用戶并授權(quán)
CREATE USER 'mycat'@'%' IDENTIFIED BY '123456';
開始登陸驗證MyCAT登陸
在我們配置并創(chuàng)建完畢MyCAT 用戶之后议慰,就可以嘗試登陸MyCAT 了蠢古, 通過以下方式登陸,進行驗證别凹,登陸方式如下:
# 完事之后我們開始嘗試登陸MyCAT , mycat 默認(rèn)的端口為 8066
mysql -umycat -h118.26.102.189? -p123456 -P8066
通過上述方式登陸成功后草讶,如下圖所示:
文章轉(zhuǎn)載至樂字節(jié)
最后給大家推薦幾個b站超詳細(xì)的Java自學(xué)課:
Servlet入門教程BV1D5411373E
Vue、Vuejs教程炉菲,BV19V41177od
SpringBoot+Vue項目實戰(zhàn)BV1o64y117qQ