1. 程式人生 > >1.1 DAL數據訪問層

1.1 DAL數據訪問層

切換 特性 img tail 今天 良好的 必須 消息隊列 描述

分布式(Distributed)數據訪問層(Data Access Layer),簡稱DAL,是利用MySQL Proxy、Memcached、集群等技術優點而構建的一個架構系統。主要目的是解決高並發、大數據流操作遇到的和數據訪問有關的問題,例如怎麽進行切庫分表,怎樣能夠更好的防止服務單點故障等等。

分布式數據訪問層的誕生

是由手機之家一位資深的開發者和架構師許超先最先提出的。

2007年,手機之家的用戶已經接近1000萬、PV也到了500萬以上,正處於中小型網站向大型網站的過渡時期。那時候,我們明顯感覺到我們在技術上已經遇上了瓶頸,一個是系統負載過高,經常要擔心我們的數據庫是不是又掛了,進而造成整個系統的癱瘓。第二個是5年積累下來的代碼也已經非常難以維護,因為分層模糊,結果到處充滿著數據庫訪問邏輯、到處充滿著緩存讀寫邏輯,再加上表的設計不合理,造成無法簡單地進行水平伸縮。總之我們的系統已經到了不得不進行改造的地步了。 
後來,老高(手機之家創始人高春輝)組了一個研發團隊,旨在從根本上解決上述提到的問題。在此後一年的時間裏,我們走了很多彎路,經歷了很多痛苦,不過,也正是在這段時間裏產生了DAL的雛形,經過若幹次改進變成了後來的DAL1.
0。DAL的產生完全是形勢使然。 DAL1.0上線後數據庫的QPS明顯下降從幾千降到幾百。事實證明,我們找到了一條行得通的路子。所以才有DAL的後續版本的開發,才有今天的DAL2.x版本的產生……

分布式數據庫訪問層的特點

1、可伸縮

這裏指水平可伸縮。事實上,這點更應該是整個系統要考慮的目標了,而非DAL,DAL要考慮的是怎麽更好地支持。舉例說,我們可以一個庫一個服務,甚至可以是一個表一個服務,庫、表拆分後,DAL應能路由查詢、合並結果,而不是讓應用程序去操心這些事。

2、高可用性

(1) .我們認為出錯失敗是很正常的,一臺機器倒下了,其它機器應繼續保持系統正常運作。容錯是很重要的一個要求。
(2) 系統規模大了以後,很容易出現“異構”的情況,如原有模塊MySQL表引擎是MyISAM的,是不支持事務的,而新上的模塊又采用了InnoDB表引擎,在這種情況下,DAL應能對原有模塊進行優雅降級。即:一個系統支持多種數據庫,來實現數據庫層的遷移,升級等。
(3).失敗恢復也是要考慮的,失敗後,需要把失敗前駐留在內存中的消息找回來。
(4).另外,DAL本身也在快速的叠代當中,升級是很經常的事,應能進行在線熱升級(不重啟原有服務)。

3、良好的性能

對於根據id來取進行的查詢,在緩存命中的情況下,應該達到和Memcached不相上下的讀取速度。在緩存不命中的情況下,則應該充分利用分庫分表和並行計算的優勢,最大化地提高查詢的效率。對於修改型查詢,掛在上面的監聽器,不應該影響性能。

4、易於編程

需要設計一套簡單好用的API便於應用程序的開發。API必須是自完備的應用開發者不需要太費力就能記住的。應用開發人員不再關心分庫分表問題,不再關心緩存問題,特別是緩存清除問題。甚至不再關心後端的數據庫是MySQL,還是Oracle,或者是其它。

5、可定制、可擴展、可維護的架構設計

像連接池組件、緩存組件、查詢分析組件、消息隊列組件、通訊協議等等不應該寫死,應設計成可方便定制的。還應該提供足夠的鉤子用於擴展。只有這樣,DAL 的架構才是靈活的、擁抱變化的。簡單說,我們定的是機制,提供的是策略,機制是軟件目標和宗旨的體現,一般是不能輕易改變的,而策略則應當是能比較簡單地進行切換的。

分布式數據訪問層應用案例

1、TDDL

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

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

技術分享圖片

淘寶很早就對數據進行過分庫的處理, 上層系統連接多個數據庫,中間有一個叫做DBRoute的路由來對數據進行統一訪問。DBRoute對數據進行多庫的操作、數據的整合,讓上層系統像操作 一個數據庫一樣操作多個庫。但是隨著數據量的增長,對於庫表的分法有了更高的要求,例如,你的商品數據到了百億級別的時候,任何一個庫都無法存放了,於是 分成2個、4個、8個、16個、32個……直到1024個、2048個。好,分成這麽多,數據能夠存放了,那怎麽查詢它?這時候,數據查詢的中間件就要能 夠承擔這個重任了,它對上層來說,必須像查詢一個數據庫一樣來查詢數據,還要像查詢一個數據庫一樣快(每條查詢在幾毫秒內完成),TDDL就承擔了這樣一 個工作。在外面有些系統也用DAL(數據訪問層) 這個概念來命名這個中間件。

下圖展示了一個簡單的分庫分表數據查詢策略:

技術分享圖片

主要優點:
(1).數據庫主備和動態切換
(2).帶權重的讀寫分離
(3).單線程讀重試
(4).集中式數據源信息管理和動態變更
(5).剝離的穩定jboss數據源
(6).支持mysql和oracle數據庫
(7).基於jdbc規範,很容易擴展支持實現jdbc規範的數據源
(8).無server,client-jar形式存在,應用直連數據庫
(9).讀寫次數,並發度流程控制,動態變更
(10).可分析的日誌打印,日誌流控,動態變更
TDDL必須要依賴diamond配置中心(diamond是淘寶內部使用的一個管理持久配置的系統,目前淘寶內部絕大多數系統的配置,由diamond來進行統一管理,同時diamond也已開源)。
TDDL源碼:https://github.com/alibaba/tb_tddl

2、CobarClient

Cobar Client是一個輕量級分布式數據訪問層(DAL)基於iBatis(已更名為MyBatis)和Spring框架實現。

技術分享圖片

主要特性:
(1).可以支持垂直和水平數據切分數據庫集群的訪問。
(2).支持雙機熱備的HA解決方案, 應用方可以根據情況選用數據庫特定的HA解決方案(比如Oracle的RAC),或者選用CobarClient提供的HA解決方案。
(3).小數據量的數據集計(Aggregation), 暫時只支持簡單的數據合並。
(4).數據庫本地事務的支持, 目前采用Best Efforts 1PC模式的事務管理。
(5).數據訪問操作相關SQL的記錄, 分析等.(可以采用國際站現有Ark解決方案,但CobarClient提供擴展的切入接口)。

轉自:https://blog.csdn.net/xcbeyond/article/details/54976983

1.1 DAL數據訪問層