MySql DAL中間件

2020-08-28 網際網路趣咖

前言:

mysql作為網際網路公司都會用到的資料庫,如果在使用過程中出現性能問題,會採用mysql的橫向擴展,使用主從複製來提高讀性能,要是解決寫入問題,需要進行分庫分表。本文不會去介紹mysql的高可用,主要介紹mysql的訪問中間件(DAL)的一些實現方案。

DAL中間件:

1 >>> Atlas

2 >>> Mysql router

3 >>> Mycat

4 >>> Cobar

5 >>> Amoeba

6 >>> Mysql proxy


1 Atlas

官網github:https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md

atlas簡介

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

atlas架構

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.優化了鎖機制,性能提高數十倍


2 Mysql router

官網:http://dev.mysql.com/doc/mysql-router/en/

mysql router簡介

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

mysql router架構



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主要功能

MySQL Router的主要用途是讀寫分離,主主故障自動切換,負載均衡,連接池等。


3 Mycat

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

mycat簡介

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

  • 一個徹底開源的,面向企業應用開發的大資料庫集群
  • 支持事務、ACID、可以替代MySQL的加強版資料庫
  • 一個可以視為MySQL集群的企業級資料庫,用來替代昂貴的Oracle集群
  • 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
  • 結合傳統資料庫和新型分布式數據倉庫的新一代企業級資料庫產品
  • 一個新穎的資料庫中間件產品

mycat架構

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開發版)。


4 Cobar

官網:https://github.com/alibaba/cobar/wiki

cobar簡介

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

產品在阿里巴巴穩定運行3年以上。

接管了3000+個MySQL資料庫的schema。

集群日處理在線SQL請求50億次以上。

集群日處理在線數據流量TB級別以上。

cobar架構

cobar現狀

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


5 Amoeba

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

amoeba簡介

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

amoeba架構

amoeba現狀

目前作者已經停止維護。


6 Mysql proxy

mysql proxy簡介

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

MySQL Proxy就是這麼一個中間層代理,簡單的說,MySQL Proxy就是一個連接池,負責將前臺應用的連接請求轉發給後臺的資料庫,並且通過使用lua腳本,可以實現複雜的連接控制和過濾,從而實現讀寫分離和負載平衡。對於應用來說,MySQL Proxy是完全透明的,應用則只需要連接到MySQL Proxy的監聽埠即可。當然,這樣proxy機器可能成為單點失效,但完全可以使用多個proxy機器做為冗餘,在應用伺服器的連接池配置中配置到多個proxy的連接參數即可。

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

mysql proxy現狀

自從mysql官網出現mysql router之後,mysql proxy就已經停止維護了。


總結:

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

相關焦點

  • 阿里開源MySQL中間件Canal快速入門
    前言距離上一篇文章發布又過去了兩周,這次先填掉上一篇秒殺系統文章結尾處開的坑,介紹一下資料庫中間件MySQL Binlog配置Canal服務運行Canal服務Java客戶端Demo❝歡迎關注我的個人公眾號獲取最全的原創文章:「後端技術漫談」(二維碼見文章底部)❞阿里開源MySQL中間件
  • 中間件"SQL重複執行"
    應用拓撲應用通過中間件連後端多個資料庫,sql會根據路由規則路由到指定的節點,如下圖所示:真相大白在筆者發現(sql1;sql2;)這樣的拼接sql會返回多個okay包後,就立刻聯想到,該不會業務自己寫了這樣的sql發給中間件,造成中間件的sql處理邏輯錯亂吧。
  • 雲原生下,如何實現高可用的MySQL?
    從 Kubernetes 1.9 開始,針對有狀態服務的資源類型 Statefulset 進入 GA,而且 Kubernetes 1.14 版本 Local Volume、CSI 等存儲功能也進入 GA 階段,Kubernetes 對有狀態服務的支持得到全面加將,這使得很多數據存儲型基礎中間件往 Kubernetes 遷移成為可能。
  • SpringBoot+MyBatis+MySQL讀寫分離
    引言讀寫分離要做的事情就是對於一條SQL該選擇哪個資料庫去執行,至於誰來做選擇資料庫這件事兒,無非兩個,要麼中間件幫我們做,要麼程序自己做。因此,一般來講,讀寫分離有兩種實現方式。第一種是依靠中間件(比如:MyCat),也就是說應用程式連接到中間件,中間件幫我們做SQL分離;第二種是應用程式自己去做分離。
  • Mysql複製數據一致性解決方案
    mysql資料庫現在這麼流行,其複製組件功不可沒,雖然其它類型的關係型資料庫也有複製功能,向oracle,db2但是其複製組件沒有Mysql資料庫的複製那麼靈活,簡便,而且mysql開源,開發著可以很容易的就開發出第三方mysql資料庫複製中間件,比較有名的像阿里的DTS。
  • 基於Canal和Kafka實現MySQL的Binlog近實時同步
    基於當前團隊的資源和能力,優先調研了Alibaba開源中間件Canal的使用。這篇文章簡單介紹一下如何快速地搭建一套Canal相關的組件。部署所需的中間件搭建一套可以用的組件需要部署MySQL、Zookeeper、Kafka和Canal四個中間件的實例,下面簡單分析一下部署過程。選用的虛擬機系統是CentOS7。
  • SpringBoot + MyBatis + MySQL讀寫分離實踐!
    引言讀寫分離要做的事情就是對於一條SQL該選擇哪個資料庫去執行,至於誰來做選擇資料庫這件事兒,無非兩個,要麼中間件幫我們做,要麼程序自己做。因此,一般來講,讀寫分離有兩種實現方式。第一種是依靠中間件(比如:MyCat),也就是說應用程式連接到中間件,中間件幫我們做SQL分離;第二種是應用程式自己去做分離。
  • 阿里中間件:底層+算法+微服務+架構+資料庫!(四面)
    Java中間件二面技術二面考察範圍:問了項目相關的技術實現細節資料庫相關:索引、索引底層實現、mysql相關的行鎖接著上面的問題,延伸到了中間件,kafka、redis、rocketmq、mycat等設計思路和適用場景等最近上過哪些技術網站?最近再看哪些書?工作和生活中遇見最大的挑戰,怎麼去克服?
  • ThinkPHP 5.1.6 版本發布 —— 引入中間件和路由提速
    並正式引入了中間件的支持,可以在路由中定義或者全局定義。而且包含了一個安全更新,是一個建議更新版本。* 改進URL生成對路由`ext`方法的支持* 改進查詢緩存對不同資料庫相同表名的支持* 改進composer自動加載的性能* 改進空路由變量對默認參數的影響* mysql的`json`欄位查詢支持多級* Query類增加`option`方法* 優化路由匹配* 修復驗證規則數字鍵名丟失問題* 改進路由Url生成*
  • 萬字詳述 MySQL ProxySQL
    ProxySQL是用C++語言開發的,一個輕量級開源軟體,性能和功能滿足讀寫中間件所需的絕大多數功能=&34; mysql_ifaces=&34; debug=true}......
  • 一文帶你深入剖析,實現MySQL讀寫分離
    Mycat是一個廣受好評的資料庫中間件,已經在很多產品上進行使用了。下面就針對Mycat的基礎知識和應用做一總結性梳理。[mysqld]log-bin=mysql-bin server-id=1 設置字符集及需要同步的庫replicate-do-db=coursecharacter-set-server=utf8init_connect=&39; 獲取當前日誌信息mysql> SHOW MASTER STATUS\G*************************** 1. row *************
  • MySQL進階之路:為什麼建議創建欄位的時候not null?
    > SELECT COUNT(*), COUNT(age) FROM person; // output:3,2這裡參考自官網:https://dev.mysql.com/doc/refman/5.7/en/problems-with-null.html2.4 null與order by/group by根據Mysql文檔,order by中,如果使用
  • 中間件的分類
    中間件的分類的任務是使應用程式開發變得容易,通過提供統一的程序抽象,隱藏異構系統和分布式系統下低級別編程的複雜性。中間件的分類有很多種方式。我們這裡按由底向上從中間層的層次上來劃分。(1)底層中間件的主流技術有JVM、CLR、ACE、JDBC、 ODBC等,代表產品有SUN JVM 和Microsoft CLR等。
  • mysql訪問速度慢,自從用redis做了緩存之後,快得飛起
    mysql資料庫源碼是開源的,也就是說是免費的,而且它的體積小,但是速度卻是挺快的。這就導致適用於中小型企業領域或個人使用。主要是網上還非常多的教程,更是因為是開源的,所以當mysql出現了問題之後,就能夠很快的從網上找到答案。
  • 輕量級的資料庫中間件解決了SpringBoot中分庫分表問題
    一、 Sharding-jdbc簡介Sharding-jdbc是開源的資料庫操作中間件;定位為輕量級java框架,在Java的JDBC層提供的額外服務。--mysql-->        <dependency>            <groupId>mysql</groupId>   
  • 中間件是什麼?常見的中間件伺服器有哪些?
    中間件是什麼? 中間件是在系統軟體和應用程式軟體之間提供連接的軟體,以便於軟體之間的通信,尤其是應用程式軟體到系統軟體的集中邏輯, 它是一個獨立的系統軟體或服務程序,分布式應用軟體藉助此軟體在不同技術之間共享資源。
  • 阿里雲安裝MySQL8.0及遠程連接失敗等問題
    此外,公司的伺服器肯定不會讓自己搭建各種開發環境的,所以自己想要接觸集群、Redis、消息中間件等技術,搭建屬於自己的伺服器是很重要的選擇。wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm yum localinstall mysql80-community-release-el7-3.noarch.rpmyum install mysql-community-client mysql-community-server
  • 消息中間件大全
    的技術,當然這個消息中間件是一個統稱了,他裡面還包含其他具體的技術。,那麼下一個問題,什麼是消息中間件。學英語的時候,大家經常說,每個字母都認識,字母組合在一起就不認識了,如果把消息和中間件組合在一起估計你也不認識了。
  • 一文看懂中間件
    2、中間件的分類中間件的功能特點、自身定位決定了其分類的多樣性。具體的,中間件可以分為基礎中間件、集成中間件和行業領域應用平臺。為區別於傳統中間件,業內提出了軟體基礎平臺的概念。3、國產中間件廠商巡禮中間件初創之時,國產廠商即已布局。東方通1992年開始中間件的研究與開發,推出消息中間件TongLINK,而中科院軟體所、國防科技大學等研究機構也對中間件技術進行了同步研究。
  • Java消息中間件實踐
    ,其他系統向消息中間件訂閱這個消息,完成相應工作。通過消息中間件的解耦,註冊系統不關心有多少系統需要知道註冊成功這件事,也不用關心如何通知它們,只需要把登錄成功這件事轉化為一個消息發送到消息中間件。這樣,需要了解登錄成功這件事的系統自己去消息中間件訂閱就行。