分布式(Distributed)數據訪問層(Data Access Layer)(以下簡稱DAL)是綜合MySQL Proxy、Memcached、集群等等技術優點而構建的一個軟件系統。目的是為了解決在構建大中型網站時遇到的和數據訪問有關的諸多問題,如怎么使得切庫分表透明化,如何使得緩存存取清除自動化,怎樣才能更好地防止服務單點故障等等。DAL是手機之家團隊近幾年在開發和運營上的經驗的總結以及智慧的結晶。
許超前 是手機之家一位資深的開發者和架構師, JavaEye非常榮幸的采訪了他。
許超前博客:http://www.longker.org/
歡迎大家推薦更多開源項目和業界專家給我們,支持中國的IT發展,發站內短信給JavaEye管理員或者發信到webmaster@javaeye.com,謝謝。
許超前 是手機之家一位資深的開發者和架構師, JavaEye非常榮幸的采訪了他。
許超前博客:http://www.longker.org/
歡迎大家推薦更多開源項目和業界專家給我們,支持中國的IT發展,發站內短信給JavaEye管理員或者發信到webmaster@javaeye.com,謝謝。
采訪分布式數據訪問層(Data Access Layer)作者許超前(十四) 
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的味道),老人可以招學徒,新人可以拜師傅。
許超前:簡單說來,分布式數據訪問層(以下簡稱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的味道),老人可以招學徒,新人可以拜師傅。
安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢】