1.Mycat原理解析-Mycat架構分析
2.Mycat原理解析-網絡通信框架
3.MyCat 客戶端 SQL 請求執行流程
博客文章除注明轉載外,均為原創。轉載請注明出處。
本文鏈接地址: http://blog.chinaunix.net/uid-31396856-id-5781751.html
本文鏈接地址: http://blog.chinaunix.net/uid-31396856-id-5781751.html
本文是mycat筆記整理:
Mycat是一個開源的數據庫中間件。在業務和數據庫中間提供的代理層,介於數據庫與應用之間,進行數據處理與交互的中間服務,其核心功能分庫分表。
1.mycat原理
Mycat接收前段對數據庫對訪問請求,是通過模擬MySQL協議的接口實現的。在前端同Mycat建立會話連接后,將請求的SQL發給Mycat后,mycat並不是直接交由數據庫處理。而是對sql進行攔截后,進行解析優化、分片分析、讀寫分離分析、緩存分析,根據解析的結果進行路由處理。把sql發給復合規則的后端數據庫群執行。
Mycat同后端數據庫使用基於MySQL實例的連接池方式進行通信,mycat接收后端數據庫返回的執行結果,對結果進行處理,比如分頁處理,排序處理、聚合處理、結果集合並等等,然后返回前端業務層。Mycat實現實現讀寫分離和分片分庫,甚至備份容災等功能。
架構如下圖
圖1:架構圖(出自官方)
Mycat實現了MySQL協議,前端用戶可以把它看作是一個數據庫代理,用MySQL客戶端工具和命令行訪問,而其后端可以用MySQL原生協議與多個MySQL服務器通信,也可以用JDBC協議與大多數主流數據庫服務器通信,其核心功能是分表分庫,即將一個大表水平分割為N個小表,存儲在后端MySQL服務器里或者其他數據庫里。
2.Mycat SQL機制
下圖說明Mycat的SQL攔截機制
有上圖可知,mycat模擬MySQL的socket協議或者jdbc協議同業務端(application)連接,在接收到SQL后,並不是直接發給MySQL數據庫,而是在SQL解析器組件對SQL進行解析優化,通過SQL Router中對SQL進行路由分析,進行匹配路由規則匹配,然后交給SQL執行組件,發送到響應的寫、讀數據庫的分片節點,執行SQL。SQL執行簡單過程如下所示:
當Mycat收到前端發送的一個SQL時,首先會先解析這個SQL,查找涉及到的表,然后看此表的定義,如果有分片規則,則獲取到SQL里分片字段的值,並匹配分片函數,得到該SQL對應的分片列表,然后將SQL發往這些分片去執行,最后收集和處理所有分片返回的結果數據,並輸出到客戶端。以select * from orders where area='xxx'語句為例,查到area='beijing',按照分片函數,beijing返回dn1,於是SQL就發給了MySQL1,去取DB1上的查詢結果,並返回給用戶。
如果上述SQL改為select * from orders where area in ('shanghai','beijing),那么,SQL就會發給MySQL1與MySQL2去執行,然后將Dn1和Dn2返回的結果集進行合並(merge)處理后輸出給用戶。
3.Mycat主要線程說明
(1)Timer線程:調度線程,是一個單線程,負責調度,任務的具體動作交給 timerExecutor。
(2) TimerExecutor(線程池)
默認大小 N=2,任務通過 timer 單線程和 timerExecutor 線程池這種1+N模式共同完成。但是 timerExecutor 跟 aioExecutor 大小默認一樣,不太合理,定時任務沒有那么大的運算量。
(3) NIOConnect: 主動連接事件分離器,負責作為客戶端連接 MySQL 的主動連接事件
(4)Server 被動連接事件分離器,負責作為服務端接收來自業務系統的連接事件
(5) Manager線程:被動連接事件分離器,負責作為服務端接收來自管理系統的連接事件
(6)NIOReactor 讀寫事件分離器
默認個數 N=processor size,通道建立連接后處理 NIO 讀寫事件。
由於寫是采用通道空閑時其它線程直接寫,只有寫繁忙時才會注冊寫事件,再由 NIOReactor 分發。NIOReactor 主要是處理讀操作
(7)BusinessExecutor 線程池
默認大小 N=processor size,任務隊列采用的 LinkedTransferQueue
所有的 NIOReactor 把讀出的數據交給 BusinessExecutor 做下一步的業務操作
全局只有一個 BusinessExecutor 線程池,所有鏈接通道隨機分成多個組,然后每組的多個通道共享一Reactor,所有的 Reactor 讀取且解碼后的數據下一步處理操作,又共享一個 BusinessExecutor 線程池
4.Mycat使用的原則
(1)分庫分表原則:
原則一:能不分就不分。
分表是為了解決的問題,但是也會帶來性能上的損失。 所以分片第一原則是:能不分就不分。對於1000 萬以內的表,不建議分片,通過合適的索引,讀寫分離等方式,可以很好的解決性能問題。
原則二:分片數量盡量少,分片盡量均勻分布在多個 DataHost 上
因為一個查詢 SQL 跨分片越多,則總體性能越差,雖然要好於所有數據在一個分片的結果,只在必要的時候進行擴容,增加分片數量。
原則三:分片規則需要慎重選擇。
分片規則的選擇,需要考慮數據的增長模式,數據的訪問模式,分片關聯性問題,以及分片擴容問題,最近的分片策略為范圍分片,枚舉分片,一致性 Hash 分片,這幾種分片都有利於擴容
原則四:盡量不要在一個事務中的 SQL 跨越多個分片,分布式事務一直是個不好處理的問題
原則五:查詢條件盡量優化,盡量避免 Select * 的方式,大量數據結果集下,會消耗大量帶寬和 CPU 資源,查詢盡量避免返回大量結果集,並且盡量為頻繁使用的查詢語句建立索引。
(2)數據拆分原則
1. 達到一定數量級才拆分( 800 萬左右)。
2. 不到 800 萬但跟大表(超 800 萬的表)有關聯查詢的表也要拆分,在此稱為大表關聯表。
3. 大表關聯表如何拆:
小於 100 萬的使用全局表;
大於 100 萬小於 800 萬跟大表使用同樣的拆分策略;
無法跟大表使用相同規則的,可以考慮從 java 代碼上分步驟查詢,不用關聯查詢,或者采用特例使用全局表。
4. 使用全局表。
全局表的作用:可充當數據字典表,這張數據表會在所有的數據庫中存在,但對外而言,只是一個邏輯數據庫存在的數據表,當對該表進行變更操作時,所有數據庫的該表都會發生相應的變化。
滿足於global表的條件是:很少對表進行並發 update,如多線程同時 update 同一條 id=1 的記錄(多線程 update,但不是操作同一行記錄是可以的,多線程 update 全局表的同一行記錄會死鎖)。批量 insert沒問題。
符合使用全局表的特征:
變動不頻繁,很少對表進行並發update
數據量總體變化不大
數據規模不大,很少有超過數十萬條記錄。
5. 拆分字段是不可修改的
6. 拆分字段只能是一個字段,如果想按照兩個字段拆分,必須新建一個冗余字段,冗余字段的值使用兩個字段的值拼接而成(如大區+年月拼成 zone_yyyymm 字段)。
7.拆分算法的選擇和合理性評判:按照選定的算法拆分后每個庫中單表不得超過 800 萬
8. 能不拆的就盡量不拆。如果某個表不跟其他表關聯查詢,數據量又少,直接不拆分,使用單庫即可。
(3)DataNode 的分布問題
DataNode 代表 MySQL 數據庫上的一個 Database,因此一個分片表的 DataNode 的分布可能有以下3種:
1.都在一個 DataHost 上.
2. 在幾個 DataHost 上,但有連續性,比如 dn1 到 dn5 在 Server1 上, dn6 到 dn10 在 Server2上,依次類推.
3. 在幾個 DataHost 上,但均勻分布,比如 dn1,dn2,d3 分別在 Server1,Server2,Server3 上, dn4 到 dn6 又重復如此.
第一種情況不大推薦。至於是采用數據連續性分布還是數據均勻分布要看具體情況。如果是要考慮高並發的IO的分布、熱數據處理、盡可能提高sql響應時間,采取數據均勻分布;如果是考慮業務數據冷熱分布,方便進行數據歸檔,則考慮數據連續分布。
5、分片規則
分片規則用於定義數據與分片的路由關系,也就是 insert, delete, update, select的基本 sql 操作中,如何將 sql 路由到對應的分片執行。
在分片之前,應該考慮以下因素:
分片要考慮數據的增長情況,是實時大量增長還是緩慢增長,數據和數據之間的關聯關系。
通過抓取系統中實際執行的SQL,分析SQL的運行規律,頻率、響應時間、對系統性能和功能的影響程度。
要保證系統中不同數據表的可靠性,以及操作模式。
業務的特點:系統中哪些業務操作是嚴格事務的,哪些是普通事務或可以無事務的。
要考慮數據的備份模式,對系統的影響。
分片后,SQL性能的損耗,據測算大約20%左右,因此在作分片處理的時候需要考慮
分片數據如何插入,在插入數據的時候,應考慮到數據分布多節點的特點,根據分片規則定位數據對應到相應的節點,分解SQL進行插入。
分片數據如何關聯查詢,應盡量避免大的關聯查詢,盡量使用小的事務,盡量使用簡單的查詢,盡量在前端進行一些數據處理操作。
分片數據刪除。由於數據是分布在各個數據節點,進行數據刪除的時候,盡量避免join操作。應該對數據進行分析,根據分片規則定位數據,在對應分片刪除相應數據。
分片數據修改。把查詢條件識別出來,然后執行一下分片函數即可定位到節點,再執行對應的SQL即可,對了提高執行效率,盡量避免join操操作,必須避免對分片鍵進行修改的操作。
分片鍵的選擇需要考慮
盡可能將數據均勻的分布到各個節點
該業務字段是最頻繁的或者最重要的查詢條件
盡量避免跨庫join操作;
盡量減少表join操作,可以考慮全局表,可以考慮適當的冗余字段等。
常用分片規則算法:
取模分庫:mod-long
范圍分庫:auto-sharding-long
Hash分庫:hash-int
分片枚舉:hash-int
截取數字 hash :sharding-by-stringhash
自然月分庫:sharding-by-month
按日期(天):sharding-by-date
日期范圍hash:range-date-hash
冷熱數據:sharding-by-hotdate
ER模型分庫:childTable
自定義分庫:CustomRule(該方式需要自己實現分庫算法)
6.配置文件:
conf目錄下面的三個配置文件:
schema.xml中定義邏輯庫,表、分片節點等內容,邏輯庫標簽、datanode標簽、datahost標簽;
rule.xml中定義分片規則,包括分片規則標簽和分片函數標簽;
server.xml中定義用戶以及系統相關變量,包括system標簽、用戶標簽、防火牆標簽等;
---The end
原文地址:
-
原創 7 Mycat原理解析-DDL語句處理
前面,我們已經講過了Mycat如何判斷sql類型,然后針對不同類型的sql就行不同的處理【Mycat原理解析-SQL語句的處理】,下面,我們來看看其中的DDL語句,Mycat是怎么處理的。 結合ServerParse.java中的代碼,我們來看看Mycat支持的常見的DDL語句的。 CREATE:create index DROP:drop index TRUNCATE:truncate t2018-01-29 09:23:43
1210
0
-
原創 6 Mycat原理解析-EXPLAIN語句處理
前面,我們已經講過了Mycat如何判斷sql類型,然后針對不同類型的sql就行不同的處理【Mycat原理解析-SQL語句的處理】,下面,我們來看看其中的explain語句,Mycat是怎么處理的。 Mycat提供的EXPLAIN語句並不是用來查看執行計划的,而是用來查看路由結果的,如果要查詢真正的執行計划,拿到路由結果里面的sql語句,到具體的實例上面查看就行了。例如,下面的sql語句,就被2018-01-26 14:42:21
2310
0
-
原創 5 Mycat原理解析-SQL語句的處理
Mycat接收到客戶端的sql語句時,會統一使用ServerQueryHandler.query(String sql)方法來處理,ServerQueryHandler主要做了兩件事情。 確定sql的類型。比如:SELECT、UPDATE、INSERT、SHOW等 將不同類型的sql交給不同的處理器進行處理 @Override public void query(String sql) {2018-01-25 13:50:59
688
0
-
原創 4.Mycat原理解析-線程模型
Mycat的線程主要包括下面幾個部分: 主線程,IO線程(包括NIOAcceptor、NIOConnector、NIOReactor)、調度線程(包括scheduler、heartbeatScheduler)、業務線程池(包括timerExecutor、businessExecutor)2018-01-03 18:51:10
452
0
-
原創 3.Mycat原理解析-后端連接管理
一、數據源與連接池 前面我們說過,Mycat除了作為服務端外,還作為客戶端來連接數據庫,所以需要管理與數據庫的連接。在管理后端連接中,主要涉及到下面兩個類。 PhysicalDatasource BackendConnection 從下面的類圖可以看出,同普通的數據源一樣,PhysicalDatasource負責建立連接,並且內部維護了一個連接池——conMap。 Mycat2018-01-03 11:45:39
1844
0
-
原創 2.Mycat原理解析-網絡通信框架
一、3種 IO 類型 根據消息通信機制來分,IO分為同步與異步 同步:調用者主動等待調用的結果,發出調用后,在沒有得到結果之前該調用就不返回; 異步:發出調用后就直接返回了,但是沒有結果。被調用者會在調用真正執行完后,通過狀態或者回調函數將結果通知調用者。 根據程序在等待調用結果時的狀態來分,IO分為阻塞於非阻塞。 阻塞:調用結果返回之前,當前線程會被掛起,調用線程只有在得到結果之后才會返回。2018-01-02 11:45:46
1215
0
-
原創 1.Mycat原理解析-Mycat架構分析
MyCat是社區愛好者在阿里Cobar基礎上進行二次開發,解決了cobar當時存 在的一些問題,並且加入了許多新的功能在其中,目前MyCAT社區活躍度很高。2018-01-02 08:52:34
