前言:
mysql作為網際網路公司都會用到的資料庫,如果在使用過程中出現性能問題,會採用mysql的橫向擴展,使用主從複製來提高讀性能,要是解決寫入問題,需要進行分庫分表。本文不會去介紹mysql的高可用,主要介紹mysql的訪問中間件(DAL)的一些實現方案。
1 >>> Atlas
2 >>> Mysql router
3 >>> Mycat
4 >>> Cobar
5 >>> Amoeba
6 >>> Mysql proxy
官網github:https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
Atlas是由 Qihoo 360公司Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了很多功能特性。目前該項目在360公司內部得到了廣泛應用,很多MySQL業務已經接入了Atlas平臺,每天承載的讀寫請求數達幾十億條。同時,有超過50家公司在生產環境中部署了Atlas,超過800人已加入了我們的開發者交流群,並且這些數字還在不斷增加。
Atlas是一個位於應用程式與MySQL之間中間件。在後端DB看來,Atlas相當於連接它的客戶端,在前端應用看來,Atlas相當於一個DB。Atlas作為服務端與應用程式通訊,它實現了MySQL的客戶端和服務端協議,同時作為客戶端與MySQL通訊。它對應用程式屏蔽了DB的細節,同時為了降低MySQL負擔,它還維護了連接池。
1.讀寫分離
2.從庫負載均衡
3.IP過濾
4.自動分表
5.DBA可平滑上下線DB
6.自動摘除宕機的DB
Atlas相對於官方MySQL-Proxy的優勢
1.將主流程中所有Lua代碼用C重寫,Lua僅用於管理接口
2.重寫網絡模型、線程模型
3.實現了真正意義上的連接池
4.優化了鎖機制,性能提高數十倍
官網:http://dev.mysql.com/doc/mysql-router/en/
MySQL Router是mysql官方發布的資料庫中間件,是處於應用client和dbserver之間的輕量級代理程序,它能檢測,分析和轉發查詢到後端資料庫實例,並把結果返回給client。是mysql-proxy的一個替代品。其架構圖和功能如下。
1.Router實現讀寫分離,程序不是直接連接資料庫IP,而是固定連接到mysql router。MySQL Router對前端應用是透明的。應用程式把MySQL Router當作是普通的mysql實例,把查詢發給MySQL Router,而MySQL Router會把查詢結果返回給前端的應用程式。
2.從資料庫伺服器故障,業務可以正常運行。由MySQL Router來進行自動下線不可用伺服器。程序配置不需要任何修改。
3.主資料庫故障,由MySQL Router來決定主從自動切換,業務可以正常訪問。程序配置不需要做任何修改。
MySQL Router讀寫分離原理:
MySQL Router接受前端應用程式請求後,根據不同的埠來區分讀寫,把連接讀寫埠的所有查詢發往主庫,把連接只讀埠的select查詢以輪詢方式發往多個從庫,從而實現讀寫分離的目的。讀寫返回的結果會交給MySQL Router,由MySQL Router返回給客戶端的應用程式。
MySQL Router的主要用途是讀寫分離,主主故障自動切換,負載均衡,連接池等。
官網:http://www.mycat.org.cn/
Mycat是基於開源cobar演變而來,對cobar的代碼進行了徹底的重構,使用NIO重構了網絡模塊,並且優化了Buffer內核,增強了聚合,Join等基本特性,同時兼容絕大多數資料庫成為通用的資料庫中間件。1.4 版本以後 完全的脫離基本cobar內核,結合Mycat集群管理、自動擴容、智能優化,成為高性能的中間件。
支持SQL92標準
遵守Mysql原生協議,跨語言,跨平臺,跨資料庫的通用中間件代理。
基於心跳的自動故障切換,支持讀寫分離,支持MySQL主從,以及galera cluster集群。
支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
基於Nio實現,有效管理線程,高並發問題。
支持數據的多片自動路由與聚合,支持sum,count,max等常用的聚合函數。
支持單庫內部任意join,支持跨庫2表join,甚至基於caltlet的多表join。
支持通過全局表,ER關係的分片策略,實現了高效的多表join查詢。
支持多租戶方案。
支持分布式事務(弱xa)。
支持全局序列號,解決分布式下的主鍵生成問題。
分片規則豐富,插件化開發,易於擴展。
強大的web,命令行監控。
支持前端作為mysq通用代理,後端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
支持密碼加密
支持服務降級
支持IP白名單
支持SQL黑名單、sql注入攻擊攔截
支持分表(1.6)
集群基於ZooKeeper管理,在線升級,擴容,智能優化,大數據處理(2.0開發版)。
官網:https://github.com/alibaba/cobar/wiki
Cobar是提供關係型資料庫(MySQL)分布式服務的中間件,它可以讓傳統的資料庫得到良好的線性擴展,並看上去還是一個資料庫,對應用保持透明。
產品在阿里巴巴穩定運行3年以上。
接管了3000+個MySQL資料庫的schema。
集群日處理在線SQL請求50億次以上。
集群日處理在線數據流量TB級別以上。
2013年阿里的Cobar在社區使用過程中發現存在一些比較嚴重的問題,及其使用限制,後來在cobar的基礎上改良誕生mycat,也就是目前cobar的代替版,而且2013年之後就沒有版本更新了。
官網:http://docs.hexnova.com/amoeba/
Amoeba(變形蟲)項目,該開源框架於2008年 開始發布一款 Amoeba for Mysql軟體。這個軟體致力於MySQL的分布式資料庫前端代理層,它主要在應用層訪問MySQL的 時候充當SQL路由功能,專注於分布式資料庫代理層(Database Proxy)開發。座落與 Client、DB Server(s)之間,對客戶端透明。具有負載均衡、高可用性、SQL 過濾、讀寫分離、可路由相關的到目標資料庫、可並發請求多臺資料庫合併結果。 通過Amoeba你能夠完成多數據源的高可用、負載均衡、數據切片的功能
目前作者已經停止維護。
MySQL Proxy是一個處於你的client端和MySQL server端之間的簡單程序,它可以監測、分析或改變它們的通信。它使用靈活,沒有限制,常見的用途包括:負載均衡,故障、查詢分析,查詢過濾和修改等等。
MySQL Proxy就是這麼一個中間層代理,簡單的說,MySQL Proxy就是一個連接池,負責將前臺應用的連接請求轉發給後臺的資料庫,並且通過使用lua腳本,可以實現複雜的連接控制和過濾,從而實現讀寫分離和負載平衡。對於應用來說,MySQL Proxy是完全透明的,應用則只需要連接到MySQL Proxy的監聽埠即可。當然,這樣proxy機器可能成為單點失效,但完全可以使用多個proxy機器做為冗餘,在應用伺服器的連接池配置中配置到多個proxy的連接參數即可。
MySQL Proxy更強大的一項功能是實現「讀寫分離」,基本原理是讓主資料庫處理事務性查詢,讓從庫處理SELECT查詢。資料庫複製被用來把事務性查詢導致的變更同步到集群中的從庫。
自從mysql官網出現mysql router之後,mysql proxy就已經停止維護了。
對於上面的mysql中間件,我個人建議在生產中使用atlas和mycat,開發實力較強或者有DBA的情況下可以使用客戶端分片。Mysql router感覺目前還不是很成熟,至於其他的中間件作者都不更新了,只要沒有歷史遺留問題還是不要用了。