【1】學習目的
(1)掌握在數據庫負載增大時的處理方法
(2)理解mycat的基礎概念
(3)掌握mycat基礎配置和監控方法
【2】Mycat的前世今生
在2008年,阿里開發了開源數據庫中間件 Amoeba,支持高可用、數據過濾、負載均衡等等
在2012年,阿里開發了開源數據庫中間件 Cobar,開源之后就沒有維護了
在2013年,阿里開發了開源數據庫中間件 Mycat,Mycat社區非常火爆且該中間件好用
在2017年,mycat 已經發展到1.6版本
在2019-12-23,好像mysql已經進入2.0許久,但一直沒有發布正式版
【3】Mycat的主要功能
【3.1】分布式數據庫系統中間層
APP=》數據庫中間層=》Mysql等關系型數據庫(MongoDB等nosql也可以)

作用:實現讀寫分離、讀負載均衡、數據庫連接池管理(統一控制連接數量)、屏蔽后端數據庫的一些變更(比如分庫分表)
【3.2】實現數據庫的讀寫分離

(1)讀寫分離,顧名思義,就是把寫操作應用在主庫,把讀操作應用到從庫。
(2)Mycat支持讀負載均衡
(3)Mycat支持后端MySQL高可用(指的是,我們在配置的時候,指定一台從機器也可以完成寫的功能,主宕機后,該從機器會接收寫請求,但其他從庫並不會重新指定新主庫到該機器),所以一般情況是需要配合Mysql的高可用策略(比如MHA、MMM、PXC、MGR)等帶有自動故障轉移的高可用方案來使用。
【3.3】數據庫的垂直與水平拆分
利用Mycat配置好,就可以實現切分與訪問邏輯,不用在應用程序端再做代碼判斷訪問等。
(1)數據庫垂直拆分:
分庫:其實就是把不同業務模塊分到不同的數據庫(可以每個庫都在一個實例里,也可以每個庫在不同實例里)中去。

(2)數據庫水平拆分
在單機上:可以看成是分表,把一個大表,拆分成多個表結構相同的表來共同存儲表數據
在多機上:這種叫做分庫分表,也就是說在單表水平分表的情況下,把每一個分的表都放到一個庫(實例上去)上去。

【4】Mycat的應用場景
(1)需要進行讀寫分離的場景(支持數據庫端多種拓撲方案,如主從、主主、MHA、PXC等)
(2)需要進行分庫分表的場景(支持一千億的單表分片)
(3)多租戶場景(什么是多租戶?就是有多個應用程序共用一個數據中心,大家都連Mycat,彼此感受不到對方的存在,互不影響。最常見的就是我們現在的雲服務)
(4)數據統計系統(如報表系統,海量數據實時查詢的一種方式)
(5)HBASE的一種替代方案(HBASE:基於hadoop的列存儲)
(6)需要使用同樣的方式查詢多種數據庫的場景(比如MYSQL、MongoDB)
【5】Mycat的優勢
(1)基於阿里的Cobar系統開發,開源系統(有一個好爸爸就是優勢)
(2)開發社區活躍(證明用的人多,維護的人多,經驗和解決方案就多)
(3)完全開源可以自定義開發,且經歷過大規模、大范圍的使用,解決方案多
(4)支持多種關系型及NOSQL數據庫
(5)基於JAVA平台開發,支持多種平台部署,可移植性好
(6)具有多種行業和項目中應用的成功案例
【6】Mycat的基本概念
【6.1】Mycat中的數據庫——邏輯庫
把后端Mysql物理數據庫,封裝成邏輯庫,如下圖,把db01~db03封裝成邏輯庫User_DB.
可以以視圖的概念去理解它,可以隱藏后端數據庫結構分布的復雜性。

【6.2】Mycat中的數據庫——邏輯表
把后端Mysql物理數據庫的表,封裝成邏輯表。如下圖,把分庫分表技術(即一個表分成多個子表,且每個子表分布在不同的數據庫)在Mycat層封裝成一個統一供訪問的邏輯視圖數據庫User_db,其邏輯表為user_inf。
可以以視圖的概念去理解它,可以隱藏后端數據庫結構分布的復雜性。

【7】Mycat關鍵特性
【7.1】關鍵特性
(1)支持SQL92標准:以此來解析SQL進行SQL路由
(2)支持多種Mysql集群:如一主一從,一主多從,多主多從,多主集群
(3)支持JDBC鏈接數據庫:通過它來連接多種關系型數據庫與nosql數據庫(mongodb)
(4)支持NOSQL數據庫:如mongodb
(5)支持自動故障切換,高可用性:它只是指定一個主庫故障后的從庫用於寫而已(不同於MHA等高可用架構)
(6)支持讀寫分離:可以用SQL路由來把讀寫操作分離開來
(7)支持全局表:把一個全局表自動分部到所有節點上
(8)支持獨有的基於ER關系的分片策略:把子表與父表自動分配到同一個節點上,避免跨庫
(9)支持一致性HASH分片:解決分片擴容問題,實際使用時建議在一台機器上建立足夠多的分片,不能滿足需求時,可以再把部分分片遷移到其他機器上。
(10)支持多平台部署:是因為使用JAVA開發,很好的集成了JAVA的可移植性
(11)支持全局序列號:解決分片表全局唯一ID問題。
【7.2】核心重點特性
(1)支持多種Mysql集群:如一主一從,一主多從,多主多從,多主集群
(2)支持自動故障切換,高可用性:它只是指定一個主庫故障后的從庫用於寫而已(不同於MHA等高可用架構)
(3)支持讀寫分離:可以用SQL路由來把讀寫操作分離開來
(4)支持全局表:把一個全局表自動分部到所有節點上
(5)支持一致性HASH分片:解決分片擴容問題,實際使用時建議在一台機器上建立足夠多的分片,不能滿足需求時,可以再把部分分片遷移到其他機器上。
(6)支持全局序列號:解決分片表全局唯一ID問題。
(7)默認端口為8066和9066,8066為服務端口,9066為管理端口
【8】支持特性功能
- 支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常見SQL語法
- 遵守Mysql原生協議,跨語言,跨平台,跨數據庫的通用中間件代理。
- 基於心跳的自動故障切換,支持讀寫分離,支持MySQL主從,以及galera cluster集群。
- 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
- 基於Nio實現,有效管理線程,解決高並發問題。
- 支持數據的多片自動路由與聚合,支持sum,count,max等常用的聚合函數,支持跨庫分頁。
- 支持單庫內部任意join,支持跨庫2表join,甚至基於caltlet的多表join。
- 支持通過全局表,ER關系的分片策略,實現了高效的多表join查詢。
- 支持多租戶方案。
- 支持分布式事務(弱xa)。
- 支持XA分布式事務(1.6.5)。
- 支持全局序列號,解決分布式下的主鍵生成問題。
- 分片規則豐富,插件化開發,易於擴展。
- 強大的web,命令行監控。
- 支持前端作為MySQL通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
- 支持密碼加密
- 支持服務降級
- 支持IP白名單
- 支持SQL黑名單、sql注入攻擊攔截
- 支持prepare預編譯指令(1.6)
- 支持非堆內存(Direct Memory)聚合計算(1.6)
- 支持PostgreSQL的native協議(1.6)
- 支持mysql和oracle存儲過程,out參數、多結果集返回(1.6)
- 支持zookeeper協調主從切換、zk序列、配置zk化(1.6)
- 支持庫內分表(1.6)
【9】一些常見的缺陷
不知道現在是否修復,需要去多驗證
- 由於對堆外內存的使用不當,導致高並發操作時對同一片內存可能發生“double free",從而造成JVM異常,服務崩潰。 #4
- XA事務漏洞:包亂序導致客戶端崩潰 #21
- where關鍵字寫錯時,會忽視后面的where條件,會得到錯誤的結果,比如select * from customer wher id=1;#126
- 對於一些隱式分布式事務,例如insert into table values(節點1),(節點2);原生mycat直接下發,這樣當某個節點錯誤時,會造成該SQL執行了一部分
- 權限黑名單針對同一條sql只在第一次生效。#92
- 聚合/排序的支持度非常有限,而且在很多場景下還存在結果不正確、執行異常等問題 #43,#31,#44
- 針對between A and B語法,hash拆分算法計算出來的范圍有誤#23
- 開啟全局表一致性檢查時,對全局表的處理存在諸多問題,例如不能alter table、insert...on duplicate...時不更新時間戳、update...in ()報錯等#24, #25,#26 ,#5
- 多值插入時,全局序列生成重復值 #1
- ER表在一個事務內被隔離,不能正確插入子表數據#13
- sharding-join結果集不正確#17
參考:
imooc Mycat入門及應用
