分布式數據庫中間件Mycat百億級數據存儲(轉)
2013年阿裏的Cobar在社區使用過程中發現存在一些比較嚴重的問題,如高並發下的假死,心跳連接的故障,只實現了一半的NIO,和看上去很美的自動連接讓我們在使用過程中掉入了一個接一個的陷阱,苦苦掙紮。終於,經過Mycat帶頭人Leader.us的改良——Mycat誕生了。
Mycat 開源後,一些 Cobar 的用戶參與了Mycat的開發,最終 Mycat 發展成為一個由眾多軟件公司的實力派架構師和資深開發人員維護的社區型開源軟件。
2014 年 Mycat 首次在上海的《中華架構師》大會上對外宣講,更多的人參與進來,隨後越來越多的項目采用了 Mycat。
2015 年 5 月,由核心參與者們一起編寫癿第一本官方權威指南《 Mycat 權威指南》電子版發布,累計超過500 本,成為開源項目中的首創。
2015 年 10 月為止,Mycat 項目總共有 16 個 Committer。
截至 2015 年 11 月,超過300 個項目采用 Mycat,涵蓋銀行、電信、電子唱務、物流、移動應用、 O2O
的眾多領域和公司。
截至2016 年 3 月,超過6000 名用戶加群或研究討論或測試或使用 Mycat。
Mycat是基於開源cobar演變而來,我們對cobar的代碼進行了徹底的重構,使用NIO重構了網絡模塊,並且優化了Buffer內核,增強了聚合,Join等基本特性,同時兼容絕大多數數據庫成為通用的數據庫中間件。1.4 版本以後 完全的脫離基本cobar內核,結合Mycat集群管理、自動擴容、智能優化,成為高性能的中間件。我們致力於開發高性能數據庫中間而努力。永不收費,永不閉源,持續推動開源社區的發展。
MyCat是什麽?
從定義和分類來看,它是一個開源的分布式數據庫系統,是一個實現了MySQL協議的服務器,前端用戶可以把它看作是一個數據庫代理,用MySQL客戶端工具和命令行訪問,而其後端可以用MySQL原生協議與多個MySQL服務器通信,也可以用JDBC協議與大多數主流數據庫服務器通信,其核心功能是分表分庫讀寫分離,即將一個大表水平分割為N個小表,存儲在後端MySQL服務器裏或者其他數據庫裏。也可以指定多個寫庫多個讀庫。
MyCat發展到目前的版本,已經不是一個單純的MySQL代理了,它的後端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流數據庫,也支持MongoDB這種新型NoSQL方式的存儲,未來還會支持更多類型的存儲。而在最終用戶看來,無論是那種存儲方式,在MyCat裏,都是一個傳統的數據庫表,支持標準的SQL語句進行數據的操作,這樣一來,對前端業務系統來說,可以大幅降低開發難度,提升開發速度。
為什麽用Mycat?
1. 連接過多問題,可以通過MyCat統一管理所有的數據源,後端數據庫集群對前端應用程序透明。
使用MyCat之前。 關註微信號架構設計者看更多幹貨MyCat改造後。 關註微信架構設計者看更多幹貨
2. 獨創的ER關系分片,解決E-R分片難處理問題,存在關聯關系的父子表在數據插入的過程中,子表會被MyCat路由到其相關父表記錄的節點上,從而父子表的Join查詢可以下推到各個數據庫節點上完成,這是最高效的跨節點Join處理技術,也是MyCat首創。
關註微信架構設計者看更多幹貨
3. 采用全局分片技術,每個節點同時並發插入和更新數據,每個節點都可以讀取數據,提升讀性能的同時,也解決跨節點Join的效率。
關註微信架構設計者查看更多幹貨
4. 通過人工智能的catlet支持跨分片復雜SQL實現以及存儲過程支持等。使用方式主要通過MyCat註釋的方式來執行,如下:
(1)跨分片聯合查詢註解支持:
/*!MyCat:catlet=demo.catlets.ShareJoin / select bu. ,sg.* from base_user bu,sam_glucose sg where bu.id_=sg.user_id;
註:sam_glucose是跨分片表。
(2)存儲過程註解支持:
/*!MyCat: sql=select * from base_user where id_=1;*/ CALL proc_test();
註:目前執行存儲過程通過MyCat註解的方式執行,註意需要把存儲過程中的sql寫到註解中。
(3)批量插入與ID自增長結合的支持:
/*!MyCat:catlet=demo.catlets.BatchInsertSequence */ insert into sam_test(name_) values(‘t1’),(‘t2’);
註:此方式不需要在sql語句中顯示的設置主鍵字段,程序在後臺根據primaryKey配置的主鍵列,自動生成主鍵的sequence值並替換原sql中相關的列和值;
(4)獲取批量sequence值的支持:
/*!MyCat:catlet=demo.catlets.BatchGetSequence */SELECT MyCat_get_seq(‘MyCat_TEST’,100);
註:此方法表示獲取MyCat_TEST表的100個sequence值,例如當前MyCat_TEST表的最大sequence值為5000,則通過此方式返回的是5001,同時更新數據庫中的MyCat_TEST表的最大sequence值為5100。
(5)更好地支持數據庫讀寫分離與高可用性,MyCat支持基於MySQL主從復制狀態的高級讀寫分離控制機制(比如Slave_behind_master <100則開啟),而一旦檢測到主從同步出錯或者延時超過發展,則自動排除readHost,防止程序讀到很久的舊數據。
MyCat下一步規劃
強化分布式數據庫中間件的面的功能,使之具備豐富的插件、強大的數據庫智能優化功能、全面的系統監控能力、以及方便的數據運維工具,實現在線數據擴容、遷移、事物等高級功能。
Mycat 吸引和聚集了一大批業內大數據和雲計算方面的資深工程師,Mycat 的發展壯大基於開源社區誌願者的持續努力,感謝社區誌願者的努力讓Mycat更加強大,同時我們也歡迎更多的誌願者參與Mycat的開發,一起推動社區的發展,為程序世界提供更好的開源中間件。
Mycat 官方網站:http://www.mycat.io/
Mycat 源碼:https://github.com/MyCATApache/Mycat-Server
Mycat 下載地址:https://github.com/MyCATApache/Mycat-download
作者:落羽成霜丶
鏈接:https://www.jianshu.com/p/9f1347ef75dd
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
分布式數據庫中間件Mycat百億級數據存儲(轉)