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

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