乾貨!MySql DAL中間件總結

1.前言

mysql做爲互聯網公司都會用到的數據庫,若是在使用過程當中出現性能問題,會採用mysql的橫向擴展,使用主從複製來提升讀性能,要是解決寫入問題,須要進行分庫分表。本文不會去介紹mysql的高可用,須要瞭解Mysql高可用架構相關的請戳淺談MySQL集羣高可用架構,本文主要介紹mysql的訪問中間件(DAL)的一些實現方案。前端

2.Atlas

官網:https://github.com/Qihoo360/A...mysql

2.1.atlas簡介git

Atlas是由 Qihoo 360公司Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了不少功能特性。目前該項目在360公司內部獲得了普遍應用,不少MySQL業務已經接入了Atlas平臺,天天承載的讀寫請求數達幾十億條。同時,有超過50家公司在生產環境中部署了Atlas,超過800人已加入了咱們的開發者交流羣,而且這些數字還在不斷增長。github

2.2.atlas架構web

Atlas是一個位於應用程序與MySQL之間中間件。在後端DB看來,Atlas至關於鏈接它的客戶端,在前端應用看來,Atlas至關於一個DB。Atlas做爲服務端與應用程序通信,它實現了MySQL的客戶端和服務端協議,同時做爲客戶端與MySQL通信。它對應用程序屏蔽了DB的細節,同時爲了下降MySQL負擔,它還維護了鏈接池。面試

clipboard.png

2.3.主要功能redis

  • 1.讀寫分離
  • 2.從庫負載均衡
  • 3.IP過濾
  • 4.自動分表
  • 5.DBA可平滑上下線DB
  • 6.自動摘除宕機的DB

Atlas相對於官方MySQL-Proxy的優點sql

  • 1.將主流程中全部Lua代碼用C重寫,Lua僅用於管理接口
  • 2.重寫網絡模型、線程模型
  • 3.實現了真正意義上的鏈接池
  • 4.優化了鎖機制,性能提升數十倍

3.Mysql router

官網:http://dev.mysql.com/doc/mysq...mongodb

3.1.mysql router簡介數據庫

MySQL Router是mysql官方發佈的數據庫中間件,是處於應用client和dbserver之間的輕量級代理程序,它能檢測,分析和轉發查詢到後端數據庫實例,並把結果返回給client。是mysql-proxy的一個替代品。其架構圖和功能以下。

3.2.mysql router架構

clipboard.png

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返回給客戶端的應用程序。

3.3.mysql router主要功能
MySQL Router的主要用途是讀寫分離,主主故障自動切換,負載均衡,鏈接池等。

4.Mycat

官網:http://www.mycat.org.cn/

4.1.mycat簡介

Mycat是基於開源cobar演變而來,對cobar的代碼進行了完全的重構,使用NIO重構了網絡模塊,而且優化了Buffer內核,加強了聚合,Join等基本特性,同時兼容絕大多數數據庫成爲通用的數據庫中間件。1.4 版本之後 徹底的脫離基本cobar內核,結合Mycat集羣管理、自動擴容、智能優化,成爲高性能的中間件。

  • 一個完全開源的,面向企業應用開發的大數據庫集羣
  • 支持事務、ACID、能夠替代MySQL的增強版數據庫
  • 一個能夠視爲MySQL集羣的企業級數據庫,用來替代昂貴的Oracle集羣
  • 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
  • 結合傳統數據庫和新型分佈式數據倉庫的新一代企業級數據庫產品
  • 一個新穎的數據庫中間件產品

4.2.mycat架構

clipboard.png

4.3.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、DB二、SQL Server 、 mongodb 、巨杉。
  • 支持密碼加密
  • 支持服務降級
  • 支持IP白名單
  • 支持SQL黑名單、sql注入攻擊攔截
  • 支持分表(1.6)
  • 集羣基於ZooKeeper管理,在線升級,擴容,智能優化,大數據處理(2.0開發版)。

Mysql+mycat架構實戰請戳Mysql+Mycat實現數據庫主從同步與讀寫分離

5.Cobar

官網:https://github.com/alibaba/co...

5.1.cobar簡介

Cobar是提供關係型數據庫(MySQL)分佈式服務的中間件,它可讓傳統的數據庫獲得良好的線性擴展,並看上去仍是一個數據庫,對應用保持透明。

  • 產品在阿里巴巴穩定運行3年以上。
  • 接管了3000+個MySQL數據庫的schema。
  • 集羣日處理在線SQL請求50億次以上。
  • 集羣日處理在線數據流量TB級別以上。

5.2.cobar架構

clipboard.png

5.3.cobar現狀

2013年阿里的Cobar在社區使用過程當中發現存在一些比較嚴重的問題,及其使用限制,後來在cobar的基礎上改良誕生mycat,也就是目前cobar的代替版,並且2013年以後就沒有版本更新了。

6.Amoeba

官網:http://docs.hexnova.com/amoeba/

6.1.amoeba簡介

Amoeba(變形蟲)項目,該開源框架於2008年 開始發佈一款 Amoeba for Mysql軟件。這個軟件致力於MySQL的分佈式數據庫前端代理層,它主要在應用層訪問MySQL的 時候充當SQL路由功能,專一於分佈式數據庫代理層(Database Proxy)開發。座落與 Client、DB Server(s)之間,對客戶端透明。具備負載均衡、高可用性、SQL 過濾、讀寫分離、可路由相關的到目標數據庫、可併發請求多臺數據庫合併結果。經過Amoeba你可以完成多數據源的高可用、負載均衡、數據切片的功能

6.2.amoeba架構

clipboard.png

6.3.amoeba現狀
目前做者已經中止維護。

7.Mysql proxy

7.1.mysql proxy簡介

MySQL Proxy是一個處於你的client端和MySQL server端之間的簡單程序,它能夠監測、分析或改變它們的通訊。它使用靈活,沒有限制,常見的用途包括:負載均衡,故障、查詢分析,查詢過濾和修改等等。

MySQL Proxy就是這麼一箇中間層代理,簡單的說,MySQL Proxy就是一個鏈接池,負責將前臺應用的鏈接請求轉發給後臺的數據庫,而且經過使用lua腳本,能夠實現複雜的鏈接控制和過濾,從而實現讀寫分離和負載平衡。對於應用來講,MySQL Proxy是徹底透明的,應用則只須要鏈接到MySQL Proxy的監聽端口便可。固然,這樣proxy機器可能成爲單點失效,但徹底可使用多個proxy機器作爲冗餘,在應用服務器的鏈接池配置中配置到多個proxy的鏈接參數便可。

MySQL Proxy更強大的一項功能是實現「讀寫分離」,基本原理是讓主數據庫處理事務性查詢,讓從庫處理SELECT查詢。數據庫複製被用來把事務性查詢致使的變動同步到集羣中的從庫。

7.2.mysql proxy現狀
自從mysql官網出現mysql router以後,mysql proxy就已經中止維護了。

mysql proxy架構實戰:ProxySQL+Mysql實現數據庫讀寫分離實戰

8.客戶端分片

8.1.客戶端分片簡介

程序客戶端進行分庫分表。也就是直接在程序裏面進行數據庫和表的拆分,例如用戶表。根據用戶的UID,例如13678789,根據最後一位,能夠拆分爲0-9共10個數據庫,把尾號是0的存入db_user_0數據庫,尾號是1的存入db_user_1數據庫,select的時候也是同樣。而後根據倒數第二位,能夠拆分爲0-9共10張表,根據倒數第二的尾號寫入相應的表中。例如13678789這個UID的信息,寫入db_user_9數據庫的table_user_8的表中。

8.2.優勢

(1)不須要使用中間件對性能沒有影響
(2)經過代碼控制,可定義性強

9.後記

對於上面的mysql中間件,我我的建議在生產中使用atlas和mycat,開發實力較強或者有DBA的狀況下可使用客戶端分片。Mysql router感受目前還不是很成熟,至於其餘的中間件做者都不更新了,只要沒有歷史遺留問題仍是不要用了。

文章系做者原創投稿,做者:西門飛冰,一名90後it男,一直在北京工做,熱愛運動,熱愛冒險,熱愛旅行。

關注 民工哥技術之路 微信公衆號對話框回覆關鍵字:1024 能夠獲取一份最新整理的技術乾貨:包括系統運維、數據庫、redis、MogoDB、電子書、Java基礎課程、Java實戰項目、架構師綜合教程、架構師實戰項目、大數據、Docker容器、ELK Stack、機器學習、BAT面試精講視頻等。

clipboard.png

相關文章
相關標籤/搜索