那些年非常火的MyCAT是什么?

什么是 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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堕战,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拍霜,更是在濱河造成了極大的恐慌嘱丢,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祠饺,死亡現(xiàn)場離奇詭異越驻,居然都是意外死亡,警方通過查閱死者的電腦和手機道偷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門缀旁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勺鸦,你說我怎么就攤上這事并巍。” “怎么了换途?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵懊渡,是天一觀的道長刽射。 經(jīng)常有香客問我,道長距贷,這世上最難降的妖魔是什么柄冲? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮忠蝗,結(jié)果婚禮上现横,老公的妹妹穿的比我還像新娘。我一直安慰自己阁最,他們只是感情好戒祠,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著速种,像睡著了一般姜盈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上配阵,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天馏颂,我揣著相機與錄音,去河邊找鬼棋傍。 笑死救拉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘫拣。 我是一名探鬼主播亿絮,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼麸拄!你這毒婦竟也來了派昧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拢切,失蹤者是張志新(化名)和其女友劉穎蒂萎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體失球,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡岖是,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了实苞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豺撑。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖黔牵,靈堂內(nèi)的尸體忽然破棺而出聪轿,到底是詐尸還是另有隱情,我是刑警寧澤猾浦,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布陆错,位于F島的核電站灯抛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏音瓷。R本人自食惡果不足惜对嚼,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绳慎。 院中可真熱鬧纵竖,春花似錦、人聲如沸杏愤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽珊楼。三九已至通殃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厕宗,已是汗流浹背画舌。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留已慢,地道東北人骗炉。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像蛇受,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子厕鹃,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容