主頁 > 後端開發 > mysql中間件分享(Mysql-prxoy,Atlas,DBProxy,Amoeba,cobar,TDDL)

mysql中間件分享(Mysql-prxoy,Atlas,DBProxy,Amoeba,cobar,TDDL)

2020-09-17 23:54:45 後端開發

hello 各位小伙伴大家好,我是小堆疊君,這期我們分享關于mysql中間件的研究,也就是資料層的讀寫分離和負載均衡,希望能夠在實際的應用中能夠幫助到各位小伙伴,

下期我們將繼續分享go語言的系列講解,以及以后的生活中我們也將會分享系列課程包括大資料、人工智能、區塊鏈等等,希望大家能夠多多學習和分享給身邊的小伙伴,我們一起進步和成長,

mysql-proxy

MySQL Proxy就是這么一個中間層代理,簡單的說,MySQL Proxy就是一個連接池,負責將前臺應用的連接請求轉發給后臺的資料庫,并且通過使用lua腳本,可以實作復雜的連接控制和過濾,

從而實作讀寫分離和負載平衡,對于應用來說,MySQL Proxy是完全透明MySQL Proxy更強大的一項功能是實作“讀寫分離”,基本原理是讓主資料庫處理事務性查詢,

它的執行流程如圖所示:

file

讓從庫處理SELECT查詢,資料庫復制被用來把事務性查詢導致的變更同步到集群中的從庫,

mysql-proxy是官方提供的mysql中間件產品可以實作負載平衡,讀寫分離,failover等,但其不支持大資料量的分庫分表且性能較差,

官網:
https://downloads.mysql.com/archives/proxy/

下面介紹幾款能代替其的mysql開源中間件產品,Atlas,cobar,tddl,讓我們看看它們各自有些什么優點和新特性吧,

Atlas
Atlas是由 Qihoo 360, Web平臺部基礎架構團隊開發維護的一個基于MySQL協議的資料中間層專案,

它是在mysql-proxy 0.8.2版本的基礎上,對其進行了優化,增加了一些新的功能特性,360內部使用Atlas運行的mysql業務,每天承載的讀寫請求數達幾十億條,

原始碼:
Github:https://github.com/Qihoo360/Atlas

但是據最新的訊息是因為Atlas已經能夠滿足大多數公司的業務需求,所以進行了停止更新,

file

Altas架構:

file

Atlas是一個位于應用程式與MySQL之間,它實作了MySQL的客戶端與服務端協議,作為服務端與應用程式通訊,同時作為客戶端與MySQL通訊,

它對應用程式屏蔽了DB的細節,同時為了降低MySQL負擔,它還維護了連接池,

Altas的一些新特性:
1、主庫宕機不影響讀主庫宕機,Atlas自動將宕機的主庫摘除,寫操作會失敗,讀操作不受影響,從庫宕機,Atlas自動將宕機的從庫摘除,對應用沒有影響,在mysql官方的proxy中主庫宕機,從庫亦不可用,

2.通過管理介面,簡化管理作業,DB的上下線對應用完全透明,同時可以手動上下線,

3.自己實作讀寫分離,為了解決讀寫分離存在寫完馬上就想讀而這時可能存在主從同步延遲的情況,Altas中可以在SQL陳述句前增加 /master/ 就可以將讀請求強制發往主庫,主庫可設定多項,用逗號分隔,從庫可設定多項和權重,達到負載均衡,

4.自己實作分表,需帶有分表欄位,而且支持SELECT、INSERT、UPDATE、DELETE、REPLACE陳述句,最后支持多個子表查詢結果的合并和排序,

這里不得不吐槽Atlas的分表功能,不能實作分布式分表,所有的子表必須在同一臺DB的同一個database里且所有的子表必須事先建好,Atlas沒有自動建表的功能,

5.之前官方主要功能邏輯由使用lua腳本撰寫,效率低,Atlas用C改寫,QPS(對一個特定的查詢服務器在規定時間內所處理流量多少的衡量標準)提高,latency(一個指令發出 到 抵達 耗用的時間)降低,

6.安全方面的提升:通過組態檔中的pwds引數進行連接Atlas的用戶的權限控制,通過client-ips引數對有權限連接Atlas的ip進行過濾,

日志中記錄所有通過Altas處理的SQL陳述句,包括客戶端IP、實際執行該陳述句的DB、執行成功與否、執行所耗費的時間

7.平滑重啟通過組態檔中設定lvs-ips引數實作平滑重啟功能,否則重啟Altas的瞬間那些SQL請求都會失敗,

DBProxy

DBProxy是由美團點評公司技術工程部DBA團隊(北京)開發維護的一個基于MySQL協議的資料中間層,它在奇虎360公司開源的Atlas基礎上,修改了部分bug,并且添加了很多特性,

file

目前DBProxy在美團點評廣泛應用,包括美團支付、酒店旅游、外賣、團購等產品線,公司內部對DBProxy的開發全面轉到github上,開源和內部使用保持一致,目前只支持MySQL(Percona)5.5和5.6,
主要功能:

讀寫分離

從庫負載均衡

IP過濾

分表

DBA可平滑上下線DB

自動摘除宕機的DB

監控資訊完備

SQL過濾

從庫流量配置

使用DBProxy之后,應用程式只需要在連接串中設定DBProxy的地址,不需要關注整個資料庫集群的結點;

DBProxy內部實作負載均衡,讀寫分離;

Slave上下線的操作由DBA在自動化運營系統上點一下滑鼠就能夠完成,

這樣極大的減輕了DBA和應用開發人員的作業;而沒有DBProxy的情況下,這些作業是由RD來實作的,引入DBProxy對于系統的可管理性和便利性都有非常大的幫助,

DBProxy是基于奇虎360開源的Altas進行改進,官方檔案上說明了改進的點有:

提供了豐富的監控資訊,大量引數可配置化并且支持動態修改

對原有的諸如日志等模塊進行了優化,性能提升明顯

開源版本即為目前美團點評內部使用版本,并將一直對原始碼及其檔案進 行維護

開源地址:
https://github.com/Meituan-Dianping/DBProxy

Amoeba

Amoeba是一個以MySQL為底層資料存盤,并對應用提供MySQL協議介面的proxy,它集中地回應應用的請求,依據用戶事先設定的規則,將SQL請求發送到特定的資料庫上執行,

基于此可以實作負載均衡、讀寫分離、高可用性等需求,與MySQL官方的MySQL Proxy相比,作者強調的是amoeba配置的方便(基于XML的組態檔,用SQLJEP語法書寫規則,比基于lua腳本的MySQL Proxy簡單),

Amoeba相當于一個SQL請求的路由器,目的是為負載均衡、讀寫分離、高可用性提供機制,而不是完全實作它們,

用戶需要結合使用MySQL的 Replication等機制來實作副本同步等功能,amoeba對底層資料庫連接管理和路由實作也采用了可插撥的機制,第三方可以開發更高級的策略類來替代作者的實作,

Amoeba優點:

a). 資料切分后復雜資料源整合

b). 提供資料切分規則并降低資料切分規則給資料庫帶來的影響

c). 降低資料庫與客戶端連接

d). 讀寫分離路由

Amoeba缺點:

a)、目前還不支持事務

b)、暫時不支持存盤程序(近期會支持)

c)、不適合從amoeba導資料的場景或者對大資料量查詢的query并不合適(比如一次請求回傳10w以上甚至更多資料的場合)

d)、暫時不支持分庫分表,amoeba目前只做到分資料庫實體,每個被切分的節點需要保持庫表結構一致:

官方網站:
http://wiki.hexnova.com/display/amoeba/Home

遺憾的是年代久遠,網站資料更新時間位于2012年

file

alibaba.cobar

file

Cobar是阿里巴巴(B2B)部門開發的一種關系型資料的分布式處理系統,它可以在分布式的環境下看上去像傳統資料庫一樣為您提供海量資料服務,那么具體說說我們為什么要用它,或說cobar--能干什么?

cabar優點總結:

資料和訪問從集中式改變為分布:

Cobar支持將一張表水平拆分成多份分別放入不同的庫來實作表的水平拆分

Cobar也支持將不同的表放入不同的庫

多數情況下,用戶會將以上兩種方式混合使用注意!:Cobar不支持將一張表,例如test表拆分成test_1,test_2, test_3.....放在同一個庫中,必須將拆分后的表分別放入不同的庫來實作分布式,

解決連接數過大的問題,

對業務代碼侵入性少,

提供資料節點的failover,HA:(1)Cobar的主備切換有兩種觸發方式,一種是用戶手動觸發,一種是Cobar的心跳陳述句檢測到例外后自動觸發,

那么,當心跳檢測到主機例外,切換到備機,如果主機恢復了,需要用戶手動切回主機作業,Cobar不會在主機恢復時自動切換回主機,除非備機的心跳也回傳例外,

Cobar只檢查MySQL主備例外,不關心主備之間的資料同步,因此用戶需要在使用Cobar之前在MySQL主備上配置雙向同步,

cobar缺點:開源版本中資料庫只支持mysql,并且不支持讀寫分離,

TDDL(核心層代碼沒有開源)

淘寶根據自己的業務特點開發了TDDL(Taobao Distributed Data Layer 外號:頭都大了)框架,主要解決了分庫分表對應用的透明化以及異構資料庫之間的資料復制,它是一個基于集中式配置的 jdbc datasource實作,具有主備,讀寫分離,動態資料庫配置等功能,

TDDL所處的位置(tddl通用資料訪問層,部署在客戶端的jar包,用于將用戶的SQL路由到指定的資料庫中):

淘寶很早就對資料進行過分庫的處理, 上層系統連接多個資料庫,中間有一個叫做DBRoute的路由來對資料進行統一訪問,

DBRoute對資料進行多庫的操作、資料的整合,讓上層系統像操作一個資料庫一樣操作多個庫,但是隨著資料量的增長,對于庫表的分法有了更高的要求,
例如,你的商品資料到了百億級別的時候,任何一個庫都無法存放了,于是分成2個、4個、8個、16個、32個……直到1024個、2048個,

分成這么多,資料能夠存放了,那怎么查詢它?

這時候,資料查詢的中間件就要能夠承擔這個重任了,它對上層來說,必須像查詢一個資料庫一樣來查詢資料,還要像查詢一個資料庫一樣快(每條查詢在幾毫秒內完成),TDDL就承擔了這樣一個作業,

主要優點:

資料庫主備和動態切換

帶權重的讀寫分離

單執行緒讀重試

集中式資料源資訊管理和動態變更

穩定jboss資料源

支持mysql和oracle資料庫

基于jdbc規范,很容易擴展支持實作jdbc規范的資料源

無server,client-jar形式存在,應用直連資料庫

讀寫次數,并發度流程控制,動態變更10.可分析的日志列印,日志流控,動態變更TDDL必須要依賴diamond配置中心(diamond是淘寶內部使用的一個管理持久配置的系統,目前淘寶內部絕大多數系統的配置,由diamond來進行統一管理,同時diamond也已開源),

原始碼:
https://github.com/alibaba/tb_tddl

TDDL復雜度相對較高,而且已經年久失修了

file

當前公布的檔案較少,只開源動態資料源,分表分庫部分還未開源,還需要依賴diamond,不推薦使用,

今天的分享就到這里就結束啦,如果你喜歡我的分享,麻煩你點擊再看,分享或留言,我是小堆疊君,我們下期見,拜了個拜~

本文由博客一文多發平臺 OpenWrite 發布!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/69297.html

標籤:Go

上一篇:求RFC-4510的中文譯文資源

下一篇:解釋一下Delphi中的模塊

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more