MyCat

什么是 MyCat

MyCat 是目前最流行的基于 java 語言編寫的數(shù)據(jù)庫中間件恩急,是一個實現(xiàn)了 MySQL 協(xié)議的服務器幻捏,前端用戶可以把它看作是一個數(shù)據(jù)庫代理,用 MySQL 客戶端工具和命令行訪問,而其后端可以用 MySQL 原生協(xié)議與多個 MySQL 服務器通信冗懦,也可以用 JDBC 協(xié)議與大多數(shù)主流數(shù)據(jù)庫服務器通信,其核心功能是分庫分表仇祭。配合數(shù)據(jù)庫的主從模式還可實現(xiàn)讀寫分離披蕉。

MyCat 是基于阿里開源的 Cobar 產(chǎn)品而研發(fā),Cobar 的穩(wěn)定性乌奇、可靠性没讲、優(yōu)秀的架構(gòu)和性能以及眾多成熟的使用案例使得 MyCat 變得非常的強大。

MyCat 發(fā)展到目前的版本礁苗,已經(jīng)不是一個單純的 MySQL 代理了爬凑,它的后端可以支持MySQL、SQL Server试伙、Oracle嘁信、DB2于样、PostgreSQL 等主流數(shù)據(jù)庫,也支持 MongoDB 這種新型NoSQL 方式的存儲潘靖,未來還會支持更多類型的存儲穿剖。而在最終用戶看來,無論是那種存儲方式卦溢,在 MyCat 里糊余,都是一個傳統(tǒng)的數(shù)據(jù)庫表,支持標準的 SQL 語句進行數(shù)據(jù)的操作单寂,這樣一來啄刹,對前端業(yè)務系統(tǒng)來說,可以大幅降低開發(fā)難度凄贩,提升開發(fā)速度誓军。

MyCat 官網(wǎng):http://www.mycat.io/

使用 Mycat 的優(yōu)勢

數(shù)據(jù)量級

單一的 MySQL 其數(shù)據(jù)存儲量級和操作量級有限.

Mycat 可以管理若干 MySQL 數(shù)據(jù)庫,同時實現(xiàn)數(shù)據(jù)的存儲和操作

開源性質(zhì)

Mycat 是 java 編寫的中間件. 開源,免費.有非常多的人和組織對
Mycat 實行開發(fā),維護,管理,更新.
Mycat 版本提升較快,可以跟隨環(huán)境發(fā)展.如果有問題,可以快速解決.
Mycat 有開源網(wǎng)站和開源社區(qū).且有官方發(fā)布的電子書籍.
Mycat 是阿里原應用 corba 轉(zhuǎn)型而來

市場應用

2015 年左右,Mycat 在互聯(lián)網(wǎng)應用中占比非常高


MyCat 中的概念

切分

邏輯上的切分. 在物理層面,是使用多庫[database],多表[table]實現(xiàn)的切分.

縱向切分/垂直切分

????????就是把原本存儲于一個庫的數(shù)據(jù)存儲到多個庫上。
????????由于對數(shù)據(jù)庫的讀寫都是對同一個庫進行操作疲扎,所以單庫并不能解決大規(guī)模并發(fā)寫入的問題昵时。

????????例如:我們會建立定義數(shù)據(jù)庫 workDB、商品數(shù)據(jù)庫 payDB椒丧、用戶數(shù)據(jù)庫 userDB壹甥、日志數(shù)據(jù)庫 logDB 等,分別用于存儲項目數(shù)據(jù)定義表壶熏、商品定義表句柠、用戶數(shù)據(jù)表、日志數(shù)據(jù)表等棒假。

優(yōu)點:
1)減少增量數(shù)據(jù)寫入時的鎖對查詢的影響溯职。
2)由于單表數(shù)量下降,常見的查詢操作由于減少了需要掃描的記錄帽哑,使得單表單次查詢所需的檢索行數(shù)變少谜酒,減少了磁盤 IO,時延變短妻枕。
缺點:無法解決單表數(shù)據(jù)量太大的問題僻族。

橫向切分/水平切分

把原本存儲于一個表的數(shù)據(jù)分塊存儲到多個表上。當一個表中的數(shù)據(jù)量過大時屡谐,我們可以把該表的數(shù)據(jù)按照某種規(guī)則述么,進行劃分,然后存儲到多個結(jié)構(gòu)相同的表愕掏,和不同的庫上度秘。
例如,我們 userDB 中的 userTable 中數(shù)據(jù)量很大亭珍,那么可以把 userDB 切分為結(jié)構(gòu)相同的多個 userDB:part0DB敷钾、part1DB 等枝哄,再將 userDB 上的 userTable,切分為很多 userTable:userTable0阻荒、userTable1 等挠锥,然后將這些表按照一定的規(guī)則存儲到多個 userDB 上。

優(yōu)點:
1)單表的并發(fā)能力提高了侨赡,磁盤 I/O 性能也提高了蓖租。
2)如果出現(xiàn)高并發(fā)的話,總表可以根據(jù)不同的查詢羊壹,將并發(fā)壓力分到不同的小表里面蓖宦。
缺點:無法實現(xiàn)表連接查詢

邏輯庫-Schema

Mycat 中定義的 database.是邏輯上存在的.但是物理上是不存在的.主要是針對縱向切分提供的概念.

邏輯表-table

Mycat 中定義的 table.是邏輯上存在,物理上是不存在的.主要是針對橫向切分提供的概念

默認端口

Mycat 默認端口是 8066

數(shù)據(jù)主機 - dataHost

物理 MySQL 存放的主機地址.可以使用主機名,IP,域名定義

數(shù)據(jù)節(jié)點 - dataNode

配置物理的 database. 數(shù)據(jù)保存的物理節(jié)點.就是 database

分片規(guī)則

當控制數(shù)據(jù)的時候,如何訪問物理 database 和 table.就是訪問 dataHost 和 dataNode 的算法.
在 Mycat 處理具體的數(shù)據(jù) CRUD 的時候,如何訪問 dataHost 和 dataNode 的算法.如:哈希算法,crc32 算法等


MyCat 的使用

讀寫分離

原理:需要搭建主從模式,讓主數(shù)據(jù)庫(master)處理事務性增油猫、改稠茂、刪操作(INSERT、UPDATE情妖、DELETE)睬关,而從數(shù)據(jù)庫(slave)處理 SELECT 查詢操作。
Mycat 配合數(shù)據(jù)庫本身的復制功能毡证,可以解決讀寫分離的問題

主從備份概念

什么是主從備份: 就是一種主備模式的數(shù)據(jù)庫應用.
主庫(Master)數(shù)據(jù)與備庫(Slave)數(shù)據(jù)完全一致.
實現(xiàn)數(shù)據(jù)的多重備份, 保證數(shù)據(jù)的安全.
可以在 Master[InnoDB]和 Slave[MyISAM]中使用不同的數(shù)據(jù)庫引擎,實現(xiàn)讀寫的分離

MySQL5.5, 5.6 版本后本身支持主從備份

在老舊版本的 MySQL 數(shù)據(jù)庫系統(tǒng)中,不支持主從備份,需要安裝額外的 RPM 包.如果需要安裝 RPM,只能在一個位置節(jié)點安裝

主從備份目的:

實現(xiàn)主備模式
保證數(shù)據(jù)的安全. 盡量避免數(shù)據(jù)丟失的可能

實現(xiàn)讀寫分離
使用不同的數(shù)據(jù)庫引擎,實現(xiàn)讀寫分離.提高所有的操作效率.InnoDB 使用 DML 語法操作. MyISAM 使用 DQL 語法操作.

主從備份效果

主庫操作同步到備庫

所有對 Master 的操作,都會同步到 Slave 中.如果 Master 和 Salve 天生上環(huán)境不同,那么對 Master 的操作,可能會在 Slave 中出現(xiàn)錯誤如: 在創(chuàng)建主從模式之前,Master 有 database : db1, db2, db3. Slave 有 database: db1,db2.

創(chuàng)建主從模式.現(xiàn)在的情況 Master 和 Slave 天生不同.
主從模式創(chuàng)建成功后,在 Master 中 drop database db3. Slave 中拋出數(shù)據(jù)庫 SQL 異常.后續(xù)所有的命令不能同步.一旦出現(xiàn)錯誤. 只能重新實現(xiàn)主從模式

主從模式下的邏輯圖

MySql 的主從模式搭建

使用兩個虛擬機模擬搭建兩個虛擬機都進行安裝 MySQL

主庫:192.168.1.19

編輯/etc/my.cnf文件电爹,

配置server_id,主庫的server_id任意配置,只要是數(shù)字即可serverid Master 唯一標識數(shù)字必須小于 Slave 唯一標識料睛;

配置log_bin開啟丐箩;變量的值就是日志文件名稱.是日志文件名稱的主體.MySQL 數(shù)據(jù)庫自動增加文件名后綴和文件類型.

配置完成后,重啟mysql服務恤煞,然后為從庫創(chuàng)建用戶:

在 MySQL 數(shù)據(jù)庫中,為不存在的用戶授權(quán),就是同步創(chuàng)建用戶并授權(quán).
此用戶是從庫訪問主庫使用的用戶
ip 地址不能寫為%. 因為主從備份中,當前創(chuàng)建的用戶,是給從庫 Slave 訪問主庫 Master
使用的.用戶必須有指定的訪問地址.不能是通用地址

grant all privileges on *.* to ‘username’@’ip’ identified by ‘password’ with grant option; flush privileges;

創(chuàng)建完成后屎勘,刷新用戶,使用命令:flush privilege

添加從庫用戶并指定ip

然后查詢用戶阱州,查看是否添加成功

查看 Master 信息

show master status;

顯示圖片內(nèi)容挑秉,表示配置完成

從庫:192.168.70.149

編輯/etc/my.cnf文件,

配置server_id苔货,從庫的server_id任意配置,但是要大于主庫的數(shù)字,然后重啟mysql服務

配置 Slave立哑,首先需要連接到從庫夜惭,然后停止 Slave 功能使用命令:stop slave

配置主庫信息

需要修改的數(shù)據(jù)是依據(jù) Master 信息修改的. ip 是 Master 所在物理機 IP. 用戶名和密碼是

Master 提供的 Slave 訪問用戶名和密碼. 日志文件是在 Master 中查看的主庫信息提供的.在

Master 中使用命令 show master status 查看日志文件名稱.

change master to master_host=’ip’, master_user=’username’, master_password=’password’,master_log_file=’log_file_name’;

啟動 Slave 功能 命令: start slave;

查看 Slave 配置 命令:show slave status \G;

至此主從庫都配置完成;可以進行測試铛绰,在主庫中創(chuàng)建數(shù)據(jù)庫诈茧,表,和插入數(shù)據(jù)捂掰,從庫中會自動同步相同的敢会;


安裝 MyCat

?MyCat依賴依賴于JDK曾沈,需要先安裝配置JDK;

JDK安裝配置完成后鸥昏,只需從把從的壓縮包解壓即可

MyCat 目錄介紹

bin 目錄里是啟動腳本
conf 目錄里是配置文件
catlet 為 Mycat 的一個擴展功能
lib 目錄里是 Mycat 和它的依賴 jar
logs 目錄里是 console.log 用來保存控制臺日志塞俱,和 mycat.log 用來保存 mycat 的 log4j日志

MyCat 配置文件

Mycat 的架構(gòu)其實很好理解,Mycat 是代理吏垮,Mycat 后面就是物理數(shù)據(jù)庫障涯。和 Web 服務器的 Nginx 類似。對于使用者來說膳汪,訪問的都是 Mycat唯蝶,不會接觸到后端的數(shù)據(jù)庫。我們現(xiàn)在做一個主從遗嗽、讀寫分離粘我。結(jié)構(gòu)如下:

server.xml 常見修改內(nèi)容:


schema.xml

schema.xml 是最主要的配置文件,默認的配置文件:

(1)?<schema>節(jié)點的作用是什么痹换?
邏輯庫配置
(2)?<schema>中name屬性的作用是什么涂滴?
邏輯庫的名稱
(3)?<schema>中checkSQLschema屬性的作用是什么?
是否檢測?SQL 語法中的 schema 信息.
(4)?<schema>中sqlMaxLimit屬性的作用是什么晴音?
SQL查詢的默認的分頁單位
(5)?<table>節(jié)點的作用是什么柔纵?
定義邏輯表
(6)?<table>中name屬性的作用是什么?
邏輯表名稱
(7)?<table>中dataNode屬性的作用是什么锤躁?
數(shù)據(jù)節(jié)點名稱. 即物理數(shù)據(jù)庫中的 database 名稱.多個名稱使用逗號
(8)?<table>中rule屬性的作用是什么搁料?
分片規(guī)則名稱.具體的規(guī)則名稱參考 rule.xml 配置文件
(9)?<dataNode>節(jié)點的作用是什么?
定義數(shù)據(jù)節(jié)點的標簽
(10)?<dataNode>中name屬性的作用是什么系羞?
數(shù)據(jù)節(jié)點名稱, 是定義的邏輯名稱,對應具體的物理數(shù)據(jù)庫 database
(11)?<dataNode>中dataHost屬性的作用是什么郭计?
定義數(shù)據(jù)主機的標簽
(12)?<dataNode>中database屬性的作用是什么?
在?dataHost 物理機中,具體的物理數(shù)據(jù)庫 database 名稱.
(13)?<dataHost>節(jié)點的作用是什么椒振?
定義數(shù)據(jù)主機的標簽
(14)?<dataHost>中name屬性的作用是什么昭伸?
定義邏輯上的數(shù)據(jù)的主機名稱
(15)?<dataHost>中maxCon/minCon屬性的作用是什么?
定義最大/小的連接數(shù)
(16)?<dataHost>中dbType屬性的作用是什么澎迎?
定義數(shù)據(jù)庫的類型
(17)?<dataHost>中dbDriver屬性的作用是什么庐杨?
定義數(shù)據(jù)庫的驅(qū)動,?native,表示使用mycat 提供的本地驅(qū)
(18)?<writeHost>節(jié)點的作用是什么夹供?
寫數(shù)據(jù)的數(shù)據(jù)庫定義標簽. 實現(xiàn)讀寫分離
(19)?<writeHost>中host屬性的作用是什么灵份?
自定義數(shù)據(jù)庫的名
(20)?<writeHost>中url屬性的作用是什么?
數(shù)據(jù)庫的連接地址和端口
(21)?<writeHost>中user屬性的作用是什么哮洽?
連接數(shù)據(jù)庫使用的賬戶名
(22)?<writeHost>中password屬性的作用是什么填渠?
連接數(shù)據(jù)庫使用的密碼
(23)?<readHost>節(jié)點的作用是什么?
只讀數(shù)據(jù)庫的定義標簽
(24)?<readHost>中host屬性的作用是什么?
自定義數(shù)據(jù)庫的名
(25)?<readHost>中url屬性的作用是什么氛什?
數(shù)據(jù)庫的連接地址和端口
(26)?<readHost>中user屬性的作用是什么莺葫?
連接數(shù)據(jù)庫使用的賬戶名
(27)?<readHost>中password屬性的作用是什么?
連接數(shù)據(jù)庫使用的密碼

rule.xml

用于定義分片規(guī)則的配置文件.

mycat 默認的分片規(guī)則: 以 500 萬為單位,實現(xiàn)分片規(guī)則.
邏輯庫 A 對應 dataNode - db1 和 db2. 1-500 萬保存在 db1 中, 500 萬零 1 到 1000 萬保存
在 db2 中,1000 萬零 1 到 1500 萬保存在 db1 中.依次類推.

MyCat讀寫分離及分庫分片的示例:

常用的分片規(guī)則

uto-sharding-long的分片規(guī)則

以?500 萬為單位,實現(xiàn)分片規(guī)則.
邏輯庫?A 對應 dataNode - db1 和 db2. 1-500 萬保存在 db1 中, 500 萬零 1 到 1000 萬保存在 db2 中,1000 萬零 1 到 1500 萬保存在 db1 中.依次類推

crc32slot的分片規(guī)則

在?CRUD 操作時,根據(jù)具體數(shù)據(jù)的 crc32 算法計算,數(shù)據(jù)應該保存在哪一個 dataNode 中

配置時需要注意的

1)<columns>id</columns>中推薦配置主鍵列
2)所有的 tableRule 只能使用一次枪眉。如果需要為多個表配置相同的分片規(guī)則捺檬,那么需要在此重新定義該規(guī)則。
3)在 crc32Slot 算法中的分片數(shù)量一旦給定瑰谜,MyCat 會將該分片數(shù)量和 slor 的取值范圍保存到文件中欺冀。在次修改分片數(shù)量時是不會生效的,需要將該文件刪除萨脑。文件位置位于 conf
4)使用 MyCat 實現(xiàn)分庫時隐轩,先在 MyCat 中定義邏輯庫與邏輯表,然后在 MyCat 的鏈接中執(zhí)行創(chuàng)建表的命令必須要在 MyCat 中運行渤早。因為 MyCat 在創(chuàng)建表時职车,會在表中添加一個新的列,列名為_slot鹊杖。
5)使用 MyCat 插入數(shù)據(jù)時悴灵,語句中必須要指定所有的列。即便是一個完全項插入也不允許省略列

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骂蓖,一起剝皮案震驚了整個濱河市积瞒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌登下,老刑警劉巖茫孔,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異被芳,居然都是意外死亡缰贝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門畔濒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剩晴,“玉大人,你說我怎么就攤上這事侵状≡廾郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵壹将,是天一觀的道長嗤攻。 經(jīng)常有香客問我,道長诽俯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮暴区,結(jié)果婚禮上闯团,老公的妹妹穿的比我還像新娘。我一直安慰自己仙粱,他們只是感情好房交,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伐割,像睡著了一般候味。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隔心,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天白群,我揣著相機與錄音,去河邊找鬼硬霍。 笑死帜慢,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的唯卖。 我是一名探鬼主播粱玲,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拜轨!你這毒婦竟也來了抽减?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤橄碾,失蹤者是張志新(化名)和其女友劉穎卵沉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堪嫂,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡偎箫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了皆串。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淹办。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖恶复,靈堂內(nèi)的尸體忽然破棺而出怜森,到底是詐尸還是另有隱情,我是刑警寧澤谤牡,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布副硅,位于F島的核電站,受9級特大地震影響翅萤,放射性物質(zhì)發(fā)生泄漏恐疲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望培己。 院中可真熱鬧碳蛋,春花似錦、人聲如沸省咨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽醋拧。三九已至大刊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敌蜂,已是汗流浹背箩兽。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留紊册,地道東北人比肄。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像囊陡,于是被迫代替她去往敵國和親芳绩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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