中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

MySQL云數(shù)據(jù)庫服務(wù)的架構(gòu)探索

  MySQL作為一種低成本、高性能、可靠性良好而且開源的數(shù)據(jù)庫產(chǎn)品,在互聯(lián)網(wǎng)企業(yè)中應(yīng)用非常廣泛。例如,淘寶網(wǎng)就有數(shù)千臺MySQL服務(wù)器。雖然近兩年來NoSQL的發(fā)展很快,新產(chǎn)品層出不窮,但在業(yè)務(wù)中應(yīng)用NoSQL對開發(fā)者來說要求比較高,而MySQL擁有成熟的中間件、運(yùn)維工具, 已經(jīng)形成一個(gè)良性的生態(tài)圈。因此,在現(xiàn)階段的應(yīng)用中仍然以MySQL為主,NoSQL為輔。

  在過去一年里,我們在MySQL托管平臺方向做了大量工作,設(shè)計(jì)和實(shí)現(xiàn)了一套UMP(Unified MySQL Platform)系統(tǒng),提供低成本和高性能的MySQL云數(shù)據(jù)庫服務(wù)。開發(fā)者從平臺上申請MySQL實(shí)例資源,通過平臺提供的單一入口來訪問數(shù)據(jù)。UMP系統(tǒng)內(nèi)部維護(hù)和管理資源池,以透明的形式提供主從熱備、數(shù)據(jù)備份、遷移、容災(zāi)、讀寫分離和分庫分表等一系列服務(wù)。平臺通過在一臺物理機(jī)上運(yùn)行多個(gè)MySQL實(shí)例的方式來降低成本,并且實(shí)現(xiàn)了資源隔離,按需分配和限制CPU、內(nèi)存和I/O資源,同時(shí)在不影響提供數(shù)據(jù)服務(wù)的前提下,支持根據(jù)用戶業(yè)務(wù)的發(fā)展來動(dòng)態(tài)擴(kuò)容和縮容。

  架構(gòu)的演變

  UMP系統(tǒng)第一版基于MySQL Proxy 0.8版修復(fù)了若干Bug,并對Proxy插件中管理用戶連接和數(shù)據(jù)庫連接的狀態(tài)機(jī)流程進(jìn)行了修改;編寫了Lua腳本實(shí)現(xiàn)到中心數(shù)據(jù)庫獲取用戶認(rèn)證信息和后臺數(shù)據(jù)庫地址,來對用戶進(jìn)行驗(yàn)證;建立了到后臺數(shù)據(jù)庫的連接和轉(zhuǎn)發(fā)數(shù)據(jù)包等邏輯(如圖1所示)。

圖1 UMP系統(tǒng)的第一版(當(dāng)時(shí)稱作RDS系統(tǒng))采用MySQL Proxy

  在開發(fā)和部署第一版的過程中,我們逐漸認(rèn)識到幾個(gè)問題。

  首先,MySQL Proxy 0.8版對多線程的支持比較簡單粗暴,多個(gè)工作線程共享同一個(gè)消息隊(duì)列,同時(shí)監(jiān)聽著同一個(gè)socketpair通道。當(dāng)有新事件進(jìn)入消息隊(duì)列后,socketpair會(huì)被寫入一個(gè)字節(jié),所有休眠中的線程都會(huì)被喚醒,去競爭一個(gè)互斥鎖從消息隊(duì)列中取任務(wù)。這種實(shí)現(xiàn)有幾個(gè)問題:一是造成“驚群”現(xiàn) 象,多個(gè)線程被喚醒但只有一個(gè)線程需要去完成任務(wù);二是任務(wù)的CPU親緣性比較差,在同一個(gè)狀態(tài)機(jī)上觸發(fā)的事件會(huì)在多個(gè)處理器上來回切換執(zhí)行。此外,MySQL Proxy中還使用了全局Lua鎖,同時(shí)僅允許一個(gè)工作線程執(zhí)行Lua腳本(計(jì)劃在0.9版本中改進(jìn))。因此,在多線程模式下,MySQL Proxy的性能遠(yuǎn)不能同CPU核數(shù)保持線性增長,甚至在16核上的性能還不如4核。而使用單進(jìn)程模式時(shí),一臺物理機(jī)上需要部署多個(gè)進(jìn)程才能有效利用機(jī)器的處理能力,但給部署、監(jiān)控和服務(wù)的升級帶來麻煩。

  其次,由于MySQL Proxy的框架在功能上不容易擴(kuò)展,所以實(shí)現(xiàn)用戶的連接數(shù)限制、QPS限制及主從切換、讀寫分離、分庫分表等功能比較困難。

  最后,MySQL Proxy的社區(qū)近些年并不活躍,且C語言對開發(fā)者功底的要求比較高,很難要求團(tuán)隊(duì)所有成員協(xié)同開發(fā)出兼顧優(yōu)雅和正確性的代碼。

  因此,我們決定用Erlang語言重新編寫Proxy服務(wù)器,替換了原有的MySQL Proxy模塊。目前,整個(gè)項(xiàng)目擁有5萬行Erlang源碼,3萬行C/C++源碼,2萬行其他語言源碼。

  為什么選擇Erlang語言

  Erlang是一個(gè)結(jié)構(gòu)化的、動(dòng)態(tài)的、函數(shù)式的編程語言。常見的一種說法是Erlang是面向并發(fā)的(Concurrent-Oriented),這主要指Erlang在語言中定義了Erlang進(jìn)程的概念和行為(本文中提到的“Erlang進(jìn)程”都是指Erlang語言中定義的進(jìn)程,以區(qū)分于大家熟悉的操作系統(tǒng)進(jìn)程)。與操作系統(tǒng)的進(jìn)程/線程相比,Erlang進(jìn)程同樣是并發(fā)執(zhí)行的單位,但特別輕量級,它是在Erlang虛擬機(jī)內(nèi)管理和調(diào)度的“綠進(jìn)程”, 即用戶態(tài)進(jìn)程(如圖2所示)。舉個(gè)例子,在關(guān)閉了HiPE和SMP支持的Erlang虛擬機(jī)中,一個(gè)新創(chuàng)建的進(jìn)程占用的內(nèi)存僅為309個(gè)字 (Word,64位服務(wù)器上為8個(gè)字節(jié))。其中233個(gè)字為堆空間(包含棧),創(chuàng)建和結(jié)束一個(gè)進(jìn)程約耗時(shí)1~3微秒,而一個(gè)Erlang虛擬機(jī)中可以同時(shí)支持幾十萬甚至更多個(gè)進(jìn)程。

圖2 Erlang的輕量級進(jìn)程

  說到Erlang語言,就必須提及OTP(Open Telecom Platform,開放電信平臺)。OTP是用于開發(fā)分布式的、高容錯(cuò)性的Erlang應(yīng)用程序的框架與平臺。例如,一個(gè)Erlang節(jié)點(diǎn)連接并注冊到Erlang集群上,發(fā)現(xiàn)集群中的其他節(jié)點(diǎn),并與它們進(jìn)行RPC通信,這些都在OTP里的Kernel服務(wù)中實(shí)現(xiàn)。OTP和Erlang語言關(guān)系如此緊密,以至于兩者通常合稱為Erlang/OTP,因此從嚴(yán)格的意義上來講,應(yīng)該說我們選擇了Erlang/OTP來構(gòu)造UMP系統(tǒng)。Erlang/OTP很好地抽象了開發(fā)一個(gè)分布式的、高容錯(cuò)性的應(yīng)用程序所需的要素,包括網(wǎng)絡(luò)編程框架、序列化和反序列化、容錯(cuò)、熱部署。

  為了支持并發(fā),服務(wù)器端多采用多進(jìn)程/多線程模型,即每個(gè)進(jìn)程/線程處理一個(gè)客戶端連接。但受限于操作系統(tǒng)資源,每臺服務(wù)器可以處理的并發(fā)連接數(shù)并不高,且由于進(jìn)程/線程上下文切換開銷,系統(tǒng)性能會(huì)受到影響。而開發(fā)高并發(fā)、高性能服務(wù)器一般采用事件驅(qū)動(dòng)的狀態(tài)機(jī)模型,底層采用非阻塞I/O(Linux中的epoll,BSD系統(tǒng)中的kqueue,Java中的nio)或者異步I/O,或者采用異步的事件通知的I/O框架,例如C/C++下的ACE、boost::asio、 libevent,Java下的MINA等。在業(yè)務(wù)層則使用狀態(tài)機(jī)來表示每個(gè)客戶端連接,通過I/O事件、超時(shí)事件驅(qū)動(dòng)狀態(tài)機(jī)進(jìn)行跳轉(zhuǎn),每個(gè)進(jìn)程/線程可處理成千上萬個(gè)客戶端連接。與多進(jìn)程/多線程模型相比,雖然事件驅(qū)動(dòng)的狀態(tài)機(jī)模型并發(fā)量更大、性能更好,但把業(yè)務(wù)邏輯表達(dá)成狀態(tài)機(jī)是一件困難的事情。相比之下,多進(jìn)程/多線程模型中的業(yè)務(wù)邏輯可以實(shí)現(xiàn)為順序執(zhí)行的代碼,開發(fā)起來要簡單得多。

  Erlang/OTP中的網(wǎng)絡(luò)編程模型則結(jié)合了兩者的優(yōu)點(diǎn),每個(gè)Erlang進(jìn)程處理一個(gè)客戶端連接,業(yè)務(wù)邏輯是順序執(zhí)行的。Erlang進(jìn)程是極輕量級的,可以認(rèn)為每個(gè)Erlang進(jìn)程是一個(gè)狀態(tài)機(jī),堆和棧上的數(shù)據(jù)是這個(gè)狀態(tài)機(jī)的狀態(tài)。Erlang進(jìn)程收到數(shù)據(jù)包或者其他進(jìn)程發(fā)來的消息后執(zhí)行處理例程,相當(dāng)于狀態(tài)機(jī)的跳轉(zhuǎn),因此也具有高并發(fā)和高性能的優(yōu)勢。

  Erlang/OTP定義了“External Term Format”協(xié)議將Erlang數(shù)據(jù)結(jié)構(gòu)與二進(jìn)制字符串相互轉(zhuǎn)化,并用C實(shí)現(xiàn)在Erlang虛擬機(jī)中,在進(jìn)行跨節(jié)點(diǎn)通信時(shí)遵從這個(gè)協(xié)議。因此,開發(fā)者無須額外考慮序列化和反序列化問題。

  在容錯(cuò)方面,Erlang進(jìn)程的數(shù)據(jù)空間是相互隔離的,沒有共享內(nèi)存,因此一個(gè)Erlang進(jìn)程崩潰不會(huì)影響其他Erlang進(jìn)程運(yùn)行,更不會(huì)造成Erlang虛擬機(jī)崩潰。OTP提供了監(jiān)督樹機(jī)制和heart模塊,前者在監(jiān)控到Erlang進(jìn)程崩潰時(shí)進(jìn)行故障恢復(fù),后者在發(fā)現(xiàn)Erlang虛擬機(jī)失去響應(yīng)時(shí)重啟程序。

  Erlang/OTP提供熱部署方式,可以避免服務(wù)升級時(shí)造成不可用時(shí)間。此外,OTP還提供了一些在系統(tǒng)運(yùn)行時(shí)觀察系統(tǒng)狀態(tài)的工具。例如lcnt工具,可以統(tǒng)計(jì)虛擬機(jī)內(nèi)部的鎖使用次數(shù)和沖突次數(shù),指導(dǎo)系統(tǒng)的優(yōu)化。

  當(dāng)前系統(tǒng)架構(gòu)

  在設(shè)計(jì)UMP系統(tǒng)時(shí),我們遵循了以下幾條原則:

  • 系統(tǒng)對外保持單一入口,對內(nèi)維護(hù)單一資源池。
  • 保證服務(wù)的高可用性,消除單點(diǎn)故障。
  • 保證系統(tǒng)是彈性可伸縮的,可以動(dòng)態(tài)地增加、刪減計(jì)算與存儲節(jié)點(diǎn)。
  • 保證分配給用戶的資源也是彈性可伸縮的,資源之間相互隔離。

  UMP系統(tǒng)中的角色包括:Controller服務(wù)器、Proxy服務(wù)器、Agent服務(wù)器、API/Web服務(wù)器、日志分析服務(wù)器和信息統(tǒng)計(jì)服務(wù)器。圖3是當(dāng)前UMP系統(tǒng)的架構(gòu)圖。UMP系統(tǒng)依賴Mnesia、LVS、RabbitMQ、ZooKeeper等開源組件。

圖3 當(dāng)前UMP系統(tǒng)架構(gòu)圖

  Mnesia是OTP提供的分布式數(shù)據(jù)庫,與MySQL NDB出自同門,都是20世紀(jì)90年代中期Ericsson為電信業(yè)務(wù)研發(fā)的數(shù)據(jù)產(chǎn)品。Mnesia支持事務(wù)、支持透明的數(shù)據(jù)分片,利用兩階段鎖實(shí)現(xiàn)分布式事務(wù),可以線性擴(kuò)展到至少50個(gè)節(jié)點(diǎn)。

  從CAP理論的角度來說,Mnesia更傾向于犧牲可用性來換取強(qiáng)一致性,屬于CP陣營。但它也提供了臟讀、臟寫操作,可以繞過事務(wù)管理去操作數(shù)據(jù),這時(shí)不保證一致性,有點(diǎn)類似于AP的系統(tǒng)。在工程實(shí)踐中,我們用事務(wù)去修改關(guān)鍵數(shù)據(jù)(例如路由表),而用臟寫接口去寫非關(guān)鍵數(shù)據(jù)(例如用戶的狀態(tài)信息),讀取數(shù)據(jù)用臟讀接口。

  Controller服務(wù)器向UMP集群提供各種管理服務(wù),實(shí)現(xiàn)元數(shù)據(jù)存儲、集群成員管理、MySQL實(shí)例管理、故障恢復(fù)、 備份、遷移和擴(kuò)容等功能。Controller服務(wù)器上運(yùn)行了一組Mnesia分布式數(shù)據(jù)庫服務(wù),系統(tǒng)的元數(shù)據(jù)如集群成員、用戶的配置和狀態(tài)信息,以及用戶名到后端MySQL實(shí)例地址的映射關(guān)系(路由表)等都存儲在Mnesia里,其他服務(wù)器組件通過發(fā)送請求到Controller服務(wù)器獲取用戶數(shù)據(jù)。

  為了達(dá)到高可用性,系統(tǒng)中會(huì)部署多臺Controller服務(wù)器,它們通過ZooKeeper提供的分布式鎖算法選舉出一個(gè)leader,這個(gè)leader負(fù)責(zé)調(diào)度和監(jiān)控各種系統(tǒng)任務(wù),例如創(chuàng)建和刪除數(shù)據(jù)庫實(shí)例、備份和遷移等。這些系統(tǒng)任務(wù)可以分成多個(gè)步驟,而且會(huì)涉及系統(tǒng)中的多個(gè)組件,例如主庫、從庫和 Proxy服務(wù)器等,還需要提供失敗時(shí)回滾的方法。因此,我們采用類似工作流的方式來實(shí)現(xiàn)。每個(gè)系統(tǒng)任務(wù)都分成多個(gè)階段的Erlang進(jìn)程,每執(zhí)行完一個(gè) 步驟跳進(jìn)下個(gè)步驟之前會(huì)把中間狀態(tài)持久化到Mnesia中。如果任務(wù)因?yàn)楣?jié)點(diǎn)故障停止的話,leader能檢測到并重新發(fā)起該任務(wù),任務(wù)重啟后會(huì)從上一次失敗的“斷點(diǎn)”繼續(xù)向下執(zhí)行。

  API/Web服務(wù)器向用戶提供了系統(tǒng)管理界面。它們是基于開源項(xiàng)目Mochiweb和Chicago Boss開發(fā)的,Mochiweb提供HTTP/HTTPS服務(wù),而Chicago Boss是由Nginx的作者之一Evan Miller開發(fā)的,提供類似Rails的MVC框架。與Rails比,Erlang開發(fā)的框架天生就對并發(fā)有很好的支持,每個(gè)請求占用一個(gè)輕量級的Erlang進(jìn)程,而Rails雖然在最近引入了多線程安全,但處理每條請求時(shí)仍然是獨(dú)占整個(gè)進(jìn)程的,因此需要使用多進(jìn)程模型處理并發(fā)請求,通過 Phusion Passenger等應(yīng)用服務(wù)器進(jìn)行派發(fā)。

  Proxy服務(wù)器向用戶提供訪問MySQL數(shù)據(jù)庫的服務(wù),它完全實(shí)現(xiàn)了MySQL協(xié)議,用戶可以使用已有的MySQL客戶端連接到Proxy服務(wù)器,Proxy服務(wù)器通過用戶名獲取到用戶的認(rèn)證信息、資源配額的限制(例如最大連接數(shù)、QPS和IOPS等),以及后臺MySQL實(shí)例的地址(列表),再將用戶的SQL查詢請求轉(zhuǎn)發(fā)到正確的MySQL實(shí)例上。

  除了數(shù)據(jù)路由的基本功能外,Proxy服務(wù)器中還實(shí)現(xiàn)了資源限制、屏蔽MySQL實(shí)例故障、讀寫分離、分庫分表、記錄用戶訪問日志等功能。Proxy服務(wù)器是無狀態(tài)的,服務(wù)器宕機(jī)不會(huì)對系統(tǒng)中其他服務(wù)器造成影響,只會(huì)造成連接到該P(yáng)roxy的用戶連接斷開。多臺Proxy服務(wù)器采用LVS HA方案實(shí)現(xiàn)負(fù)載均衡,用戶應(yīng)用重連后會(huì)被LVS定向到其他的Proxy上。

  Agent服務(wù)器部署在運(yùn)行MySQL進(jìn)程的機(jī)器上,用來管理每臺物理機(jī)上的MySQL實(shí)例,執(zhí)行創(chuàng)建、刪除、備份、遷移和主從切換等操作,收集和分析MySQL進(jìn)程的統(tǒng)計(jì)信息、bin log和slow query log。

  日志分析服務(wù)器會(huì)存儲和分析Proxy服務(wù)器傳入的用戶訪問日志,并實(shí)現(xiàn)了實(shí)時(shí)索引供用戶查詢一段時(shí)間內(nèi)的慢日志和統(tǒng)計(jì)報(bào)表。信息統(tǒng)計(jì)服務(wù)器定期將采集到的用戶連接數(shù)、QPS數(shù)值,以及MySQL實(shí)例的進(jìn)程狀態(tài)用RRDtool進(jìn)行統(tǒng)計(jì),可畫圖展示到Web界面上,也可為今后實(shí)現(xiàn)彈性的資源分配和自動(dòng)化的 MySQL實(shí)例遷移提供依據(jù)。

  UMP系統(tǒng)中各節(jié)點(diǎn)間的通信(不包括SQL查詢、日志等大數(shù)據(jù)流的傳輸,這些還是直接走TCP的)都通過RabbitMQ,作為消息通信的中間件來使用,以保證消息發(fā)送的可靠性。ZooKeeper則主要發(fā)揮配置服務(wù)器、分布式鎖,以及監(jiān)控所有MySQL實(shí)例的作用。

  在多個(gè)組件的協(xié)同作業(yè)下,整個(gè)系統(tǒng)實(shí)現(xiàn)了對用戶透明的容災(zāi)、讀寫分離、分庫分表功能。系統(tǒng)內(nèi)部還通過多個(gè)小規(guī)模用戶共享同一個(gè)MySQL實(shí)例,中等規(guī)模用戶獨(dú)占一個(gè)MySQL實(shí)例,多個(gè)MySQL實(shí)例共享同一個(gè)物理機(jī)的方式實(shí)現(xiàn)資源的虛擬化,降低整體成本。在資源隔離方面,通過Cgroup限制MySQL進(jìn)程資源,以及在Proxy服務(wù)器端限制QPS相結(jié)合的方法,UMP系統(tǒng)能在實(shí)現(xiàn)資源虛擬化的同時(shí)保障用戶的服務(wù)質(zhì)量。此外,UMP系統(tǒng)綜合運(yùn)用SSL數(shù)據(jù)庫連接、數(shù)據(jù)訪問IP白名單、記錄用戶操作日志、SQL攔截等技術(shù)保護(hù)用戶的數(shù)據(jù)安全。

  結(jié)束語

  UMP系統(tǒng)的一些組件,例如Proxy服務(wù)器和日志分析服務(wù)器,目前已經(jīng)運(yùn)用在天貓的聚石塔平臺中,為電商和ISV提供安全的數(shù)據(jù)云服務(wù)。此外,UMP系統(tǒng)還運(yùn)用在淘寶的店鋪裝修平臺中,為開發(fā)者提供數(shù)據(jù)服務(wù)。下一階段,我們希望UMP系統(tǒng)能進(jìn)一步為企業(yè)降低數(shù)據(jù)存儲的成本。

  作者曹偉,花名鳴嵩,淘寶核心系統(tǒng)數(shù)據(jù)庫組技術(shù)專家,目前從事高性能服務(wù)器、IM、P2P、微博等各類型分布式系統(tǒng)、海量存儲產(chǎn)品的開發(fā)。

it知識庫MySQL云數(shù)據(jù)庫服務(wù)的架構(gòu)探索,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 日本久久综合网 | 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 亚洲精品一区中文字幕乱码 | 男女羞羞的网站 | 天天色影视综合 | 亚洲伊人久久综合 | 免费观看色 | 欧美日韩久久久久 | 国产高清一区二区三区 | 欧美精品一区二区在线观看 | 免费观看毛片 | 日韩激情在线 | 久久伊人在 | 91在线免费视频 | 亚洲午夜在线 | h在线看| 亚洲最新在线视频 | 麻豆久久久久久久 | 91看片网址| 一级在线 | 神马久久久久久久久久 | 日韩国产中文字幕 | 福利社午夜影院 | 成人免费精品 | 一级做a爰片久久毛片 | 亚洲免费影院 | 欧美影院| 婷婷色国产偷v国产偷v小说 | 一级毛片免费 | 国产精品久久久久久久久久免费看 | 成人av资源在线 | 热久久久 | 免费在线观看av | 日韩精品一区二区三区视频播放 | 亚洲综合国产精品 | 欧美精品一区二区在线观看 | 国内精品久久久久久 | 欧美日韩视频在线 | 国产高清美女一级a毛片久久w | 欧美天堂 | 欧美三级电影在线播放 |