今天看了周兆兆寫的“又拍網(wǎng)架構(gòu)中的分庫設計”從受益不少,又拍網(wǎng)是一個照片分享社區(qū),從2005年6月至今積累了260萬用戶,1.1億張照片,目前的日訪問量為200多萬,一個網(wǎng)站經(jīng)過精心經(jīng)營一定有很大的改進。下面是“又拍網(wǎng)架構(gòu)中的分庫設計”幾個要點。
盡量用開源產(chǎn)品
開源,免費都是我們最喜歡聽的產(chǎn)品,無論在哪個技術領域?,F(xiàn)在很多大型電子商務公司都大量使用開源產(chǎn)品,淘寶就是一個典型范例。現(xiàn)在好多web2網(wǎng)站都使用開源的,包括原來接觸過豆瓣網(wǎng)架構(gòu),手機之家的架構(gòu),facebook架構(gòu)等都是用大量開源產(chǎn)品又拍主要使用:包括MySQL、PHP、nginx、Python、memcached、redis、Solr、Hadoop和RabbitMQ等等。又拍網(wǎng)的服務器端開發(fā)語言主要是PHP和Python,其中PHP用于編寫Web邏輯(通過HTTP和用戶直接打交道), 而Python則主要用于開發(fā)內(nèi)部服務和后臺任務。在客戶端則使用了大量的Javascript, 主要使用MooTools這個JS框架。 另外,把圖片處理過程從PHP進程里獨立出來變成一個服務。這個服務基于nginx,但是是作為nginx的一個模塊而開放REST API。
數(shù)據(jù)庫分庫
通過主從數(shù)據(jù)庫,分解壓力,其實又拍從庫主要是做備份。其實他們大可以做讀寫分離來減輕壓力。不過使用了memcached來減輕壓力,還是不錯的選擇。把相對變化比較小的query數(shù)據(jù)放到memcached中。
我到建議他們開發(fā)獨立的搜索引擎系統(tǒng)。
數(shù)據(jù)水平劃分
數(shù)據(jù)垂直劃分很簡單,把數(shù)據(jù)安裝業(yè)務分開,又拍使用的按功能模塊拆分,比如可以將群組相關表和照片相關表存放在不同的數(shù)據(jù)庫中,這種方式多個數(shù)據(jù)庫之間的表結(jié)構(gòu)不同。
水平劃分
水平劃分是將原來一個庫的數(shù)據(jù)劃分到多個不同的數(shù)據(jù)庫中,每個庫的表結(jié)構(gòu)完全一樣。在文檔中題了幾種劃分方式:按照奇偶ID;按照id大小范圍,一定范圍在一個庫;建立映射關系表,又拍就是采用了該方法。通過memcached保存關系表來提高訪問速度。
其實水平劃分規(guī)則還有很多,也可以采取“ Memcached Consistent Hashin ”方法。還可以通過數(shù)字取取模等。
又拍總結(jié)了幾條水平劃分后出現(xiàn)的問題:不能執(zhí)行跨庫的關聯(lián)查詢;不能保證數(shù)據(jù)的一致/完整性;所有查詢必須提供數(shù)據(jù)庫線索;自增ID不能唯一。其實我倒不覺得是問題,根據(jù)業(yè)務的可以容忍度來做相應的處理就達到比較好的效果了。
在文檔中沒有提及圖片是怎么存儲的,我想又拍應該也開發(fā)了和豆瓣網(wǎng)差不多的圖片存儲系統(tǒng)(豆瓣使用doubanfs)。
看完又拍架構(gòu)文章后受益不少,任何一個成功的網(wǎng)站都是通過技術人員不斷耕耘,用加班和熬夜換來的成果,有苦有樂,從中獲取的不是切身不能體會。
感謝周兆兆的分享,文檔地址: http://www.infoq.com/cn/articles/yupoo-partition-database
?
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
