分布式(Distributed)資料通路層(Data Access Layer)(以下簡稱DAL)是綜合MySQL Proxy、Memcached、叢集等等技術優點而建構的一個軟體系統。目的是為了解決在建構大中型網站時遇到的和資料通路有關的諸多問題,如怎麼使得切庫分表透明化,如何使得緩存存取清除自動化,怎樣才能更好地防止服務單點故障等等。DAL是手機之家團隊近幾年在開發和營運上的經驗的總結以及智慧的結晶。
許超前 是手機之家一位資深的開發者和架構師, JavaEye非常榮幸的采訪了他。
歡迎大家推薦更多開源項目和業界專家給我們,支援中國的IT發展,發站内短信給JavaEye管理者或者發信到[email protected],謝謝。
<a href="http://writeblog.csdn.net/#2267">采訪分布式資料通路層(Data Access Layer)作者許超前(十四)</a>
<a href="http://writeblog.csdn.net/#2268">許超前 介紹</a>
JavaEye:1.Hi,許超前,你好,非常榮幸能夠采訪你,首先你能夠向大家介紹一下分布式(Distributed)資料通路層(Data Access Layer)嗎?
許超前:簡單說來,分布式資料通路層(以下簡稱DAL)是綜合MySQL Proxy、Memcached、叢集等等技術優點而建構的一個軟體系統。目的是為了解決在建構大中型網站時遇到的和資料通路有關的諸多問題,如怎麼使得切庫分表透明化,如何使得緩存存取清除自動化,怎樣才能更好地防止服務單點故障等等。後面,我會在我的部落格上以及今年的SD2China大會上做進一步的說明,有興趣的可以留意。
JavaEye:2.分布式(Distributed)資料通路層(Data Access Layer)是什麼時候誕生的,能否介紹一下發展曆程?
許超前:DAL的産生是經曆一番波折的。
2007 年,手機之家的使用者已經接近1000萬、PV也到了500萬以上,正處于中小型網站向大型網站的過渡時期。那時候,我們明顯感覺到我們在技術上已經遇上了瓶頸:一個是系統負載過高,經常要擔心我們的資料庫是不是又挂了,進而造成整個系統的癱瘓;第二個是5年積累下來的代碼也已經非常難以維護,因為分層模糊,結果到處充滿着資料庫通路邏輯、到處充滿着緩存讀寫邏輯,再加上表的設計不合理,造成無法簡單地進行水準伸縮。總之,我們的系統已經到了不得不進行改造的地步了。
後來,老高(手機之家創始人高春輝)組了一個研發團隊,旨在從根本上解決上述提到的問題。在此後一年的時間裡,我們走了很多彎路,經曆了很多痛苦,不過,也正是在這段時間裡,産生了DAL的雛形,經過若幹次改進,變成了後來的DAL1.0。DAL的産生完全是形勢使然。。。到了那個時間、在那個地點、做了那件事。
DAL1.0上線後資料庫的QPS明顯下降,從幾千降到幾百。事實證明,我們找到了一條行得通的路子。是以才有DAL的後續版本的開發,才有今天的DAL2.x版本的産生。
JavaEye:3.能介紹一下手機之家網站和技術團隊嗎?
許超前:手機之家是一個旨在提供全方位的手機相關服務的資訊類網站。在7年的時間裡,手機之家從無到有,已經發展成為極具人氣、最受關注的手機産品資訊網站。有點廣告的味道,不過說的都是事實,呵呵。
以下是今年3月份在Beta技術沙龍上提到的統計資料:
a. 1000w+使用者
b. 3000w+文章
c. 1.1TB+附件
d. 780w+ Page View/每天
e. 5~10w線上使用者/15分
現在,使用者應該是1200萬了吧,其它的也有所變動。最近比較忙,沒再去關注。
手機之家現在有個技術部,負責網站的日常維護事宜;我們還有個項目組,負責整個系統的架構設計及新技術的研究和探索等等。
JavaEye:4.分布式(Distributed)資料通路層(Data Access Layer)的主要特點是什麼?能否簡要分析一下它實作的主要技術核心?
許超前:要說特點,摘抄一下我在部落格裡寫的關于新版DAL的項目目标,這些目标在DAL2.x裡已經得到了相對較好的實作,我想這應該就是它最大的特點了吧:
一)可伸縮。
這裡是指Scale Out.,即水準可伸縮。事實上,這點更應該是整個系統要考慮的目标了,而非DAL,DAL要考慮的是怎麼更好地支援。舉例說,我們可以一個庫一個服務,甚至可以是一個表一個服務;庫、表拆分後,DAL應能路由查詢、合并結果,而不是讓應用程式去操心這些事。
二)高可用性。
1) 我們認為出錯失敗是很正常的,一台機器倒下了,其它機器應繼續保持系統正常運作。容錯是很重要的一個要求。
2) 系統規模大了以後,很容易出現“異構“的情況,如原有子產品MySQL表引擎是MyISAM的,是不支援事務的,而新上的子產品又采用了InnoDB表引擎,在這種情況下,DAL應能對原有子產品進行優雅降級。
3)失敗恢複也是要考慮的,失敗後,需要把失敗前駐留在記憶體中的消息找回來。
4) 另外,DAL本身也在快速的疊代當中,更新是很經常的事,應能進行線上熱更新(不重新開機原有服務)。
三)良好的性能。
對于根據Id來取記錄的查詢,在緩存命中的情況下,應該達到和Memcached不相上下的讀取速度。在緩存不命中的情況下,則應該充分利用分庫分表和并行計算的優勢,最大化地提高查詢的效率。對于修改型查詢,挂在上面的監聽器,不應該影響性能。
四)系統可監控。
資源占用情況,命中率如何,系統目前壓力怎樣等等,都應該是可知的。應該有報警機制,當壓力到達一個閥值以後,通知相關人員進行處理。還應該有詳細的錯誤日志,便于排查問題。
五)安全。
沒有SQL注入問題;避免或盡量減少分表和索引表之間的資料不一緻問題等等。
六)易于程式設計。
需要設計一套簡單好用的API,便于應用程式的開發。API必須是自完備的,應用開發者不需要太費力就能記住的。
應用開發人員不再關心分庫分表問題,不再關心緩存問題, 特别是緩存清除問題。甚至不再關心後端的資料庫是MySQL,還是Oracle,或者是其它。
七)可定制、可擴充、可維護的架構設計。
像連接配接池元件、緩存元件、查詢分析元件、消息隊列元件、通訊協定等等不應該寫死,應設計成可友善定制的。還應該提供足夠的鈎子用于擴充。隻有這樣,DAL 的架構才是靈活的、擁抱變化的。簡單說,我們定的是機制,提供的是政策;機制是軟體目标和宗旨的展現,一般是不能輕易改變的,而政策則應當是能比較簡單地進行切換的。
這裡面,每一點都可以說說,還是在以後的部落格裡,再來詳細和大家讨論吧。
JavaEye:5.分布式(Distributed)資料通路層(Data Access Layer)應用的主要場景是什麼?能否詳細比較一下分布式(Distributed)資料通路層(Data Access Layer)和類似産品比如hibernate的差別嗎?
許超前:DAL比較适用于大中型網站,對于想提高系統負載能力及響應速度的小型網站也是适用的,但可能獲得的好處不如大中型網站那麼明顯。
DAL和Hibernate兩者不具有可比性,從出發點來看就不同,DAL一開始是為了提高網站的負載能力,而Hibernate則是為了能更快地開發Java應用。手機之家采用混合程式設計,上層應用不一定是用Java寫的,要讓(非Java)程式員對每個子產品涉及到的表結構都用Java實體類寫一遍,不太現實。相反,我們采取了不同的思考方式,我們的程式員面向的是表和記錄,而不是實體類和實體對象。雖然,DAL也有Mapping的概念,但是它的Mapping是指邏輯表到實體表的Mapping,而不是Java對象到資料庫模式的Mapping。DAL的邏輯表可能對應着多個實體表,程式員看到的是邏輯表,不用關心後面有多少個實體表。
MySQL Proxy也提供了一些類似的特性,DAL與它的第一個不同在于,我們的緩存處理是内置的,我們從設計之初就特别認真地考慮緩存這塊,而MySQL Proxy得自己寫Lua腳本。第二個不同在于,我們針對的不僅僅是MySQL這一種資料庫。而且,我們還有很多其它的事情要做。
另外,國内還有一個開源項目叫Amoeba。Amoeba關注的領域是切分,在這個領域,Amoeba對概念的抽象還是不錯的。DAL更像是一個完整的系統,當然,也可以隻用DAL來做切分,其它的邏輯自己編寫,想擁有哪些特性都是可配置的。這樣設計一個是為了易用,一拿來就能用,另一個是為了能更好的和現有的解決方案(如Hibernate)內建,雖然DAL在很多方面都可以取代它們(如Hibernate)。
最後,我相信,肯定還存在很多類似的解決方案,隻是我們不曾得知。或許是過于定制化了,或許是還不夠成熟。。。
JavaEye:6.目前大概有多少使用者在使用分布式(Distributed)資料通路層(Data Access Layer)?
許超前:目前DAL主要用在手機之家網站上面,當然,還有其它的項目也在用。
JavaEye:7.目前分布式(Distributed)資料通路層(Data Access Layer) 開發的技術難點是哪裡?
許超前:要說技術難點,我覺得有以下幾點:
一)如何降低CPU負載及減少記憶體占用。
二)如何提高查詢條件的分析速度。
三)如何更有效地路由到相應的庫和表上。
四)如何提高緩存的命中率。
五)如何更有效的進行資料複制。
JavaEye:8.你每周大概花多少時間在分布式(Distributed)資料通路層(Data Access Layer)項目上面?
許超前:每周大概80個小時左右。
JavaEye:9.開發分布式(Distributed)資料通路層(Data Access Layer)帶給你最大的收獲是什麼?
許超前:一)貴在堅持。一個長開發周期的軟體,到了後面,不僅是對開發人員體力、智力的綜合考驗,更是對開發人員心理承受能力的考驗,因為這時會有來自各方的及自發的壓力。如果能堅持下去,扛過這一關,事情往往就成了一半。
二)找一些和你有共同目标的人一塊共事。否則會耗費大量的溝通成本。
三)用資料說話。事務都在變化當中,幾年前的經驗,也許到今天就不靈了。而且很多事情并不是像我們想象得那樣去發展。
四)中國不打折。
JavaEye:10.開發分布式(Distributed)資料通路層(Data Access Layer)的roadmap是什麼?近期遠期的開發計劃計劃是什麼?
許超前:接下來的版本要做的事有這幾個方面:
一)更多的協定開發,這樣才能作為透明代理使用,比如我們的PMA也可以使用了。
二)資料庫廠商中立的資料複制。
三)嵌入式API,考慮和Spring、Guice等內建,友善Java應用開發人員的使用。
JavaEye:11.你的開發環境是什麼? 使用什麼作業系統,和IDE?
許超前:一直用Linux作業系統,現在是Ubuntu,IDE用Eclipse。
JavaEye:12.開發分布式(Distributed)資料通路層(Data Access Layer)項目是如何推廣的?未來有什麼推廣方面的計劃嗎?
許超前:DAL目前隻在内部項目中使用。等足夠成熟了,我們會采取一系列辦法進行推廣的。
JavaEye:13.通過開發開發分布式(Distributed)資料通路層(Data Access Layer)項目 ,你對中國的開源軟體現狀有什麼看法?對國内軟體開發人員做開源項目有什麼感受和想法嗎?
許超前:我們的IT行業起步晚,開源文化還不夠深入人心,再加上我們中的大部份人還在為生計發愁,是以對開源事業上心的人還是少數。是以,和歐美發達國家比起來,我們的開源事業相對滞後。
我由衷地敬佩那些做開源項目的開發人員,如果可能,我也希望多做些開源軟體和大家一塊分享。
JavaEye:14.作為一個JavaEye的會員,你對JavaEye網站有什麼建議和意見嗎?
許超前:想辦法讓老人多發言,同時也給新人提供一個學習成長的地方。比如可以弄個師徒頻道(有點SNS的味道),老人可以招學徒,新人可以拜師傅。
許超前,男,畢業于華中師範大學計算機科學與技術系,現居住在北京。98年開始喜歡上計算機,曾有過存儲、搜尋、Java NIO架構、Java Cache系統、消息隊列等等的研發經驗。一畢業就任職于手機之家(中國手機使用者最受推崇的品牌),前後已經4年了,目前擔任架構師一職,負責分布式資料通路層(Data Access Layer, 簡稱DAL)軟體的架構、設計和開發工作。
除了技術方面,爬山是最大的愛好,喜歡攝影,偶爾打打太極柔力球。
由于許超前太低調,隻提供了一張背影給我們遐想 :