優(yōu)惠活動 - 12周年慶本月新客福利
優(yōu)惠活動 - 12周年慶本月新客福利
優(yōu)惠活動 - 12周年慶本月新客福利

什么是有把握的網(wǎng)站數(shù)據(jù)庫架構(gòu)?

下面的數(shù)據(jù)庫架構(gòu),以我的經(jīng)驗,是比較有把握的。
 
單主服務器,多從服務器。

對于主要是讀操作的應用,傳統(tǒng)的伸縮方法是對數(shù)據(jù)進行復制一一有的時候是多個復制這時候的伸縮可以很好地工作。使用復制從服務器分擔主服務器的負載,并在從服務器上執(zhí)行那些CPU耗時的操作。

對于從服務器,要比你執(zhí)行例行運維任務所需要的數(shù)量要多加一臺,將這臺服務器用于特定任務。從這臺服務器上做備份,然后再將備份恢復回去,測試看有沒有問題。在這臺服務器上運行耗時的cron作業(yè),以對數(shù)據(jù)進行匯總,將這些匯總數(shù)據(jù)用于數(shù)據(jù)分析的查詢,然后將結(jié)果導出,再批量導人到主服務器。使用基于會話的讀寫分離策略,以分擔主服務器的 SELECT查詢。這些事情要在應用程序生命周期的早期就開始做。假如一臺從服務器失效了,將這臺從服務器的工作轉(zhuǎn)到另一臺從服務器即可,因為從服務器之間并沒有什么區(qū)別。對這種簡單的失效轉(zhuǎn)移,可以使用各種負載均衡器來實現(xiàn)。



雖然這種架構(gòu)很好,但仍然存在一些令人頭痛的問題:不容易實現(xiàn)離線的數(shù)據(jù)庫模式更新,因為通常數(shù)據(jù)庫模式更新是在主服務器上完成的,在更新時會阻塞對正在進行更新的表的訪問。而在 ALTER TABLE命令復制到從服務器上時,復制可能會延遲,這樣所分擔的主服務器負載的數(shù)據(jù)就會過期或延遲。這種主-從架構(gòu)很難自動實現(xiàn)主服務器的故障轉(zhuǎn)移,因為主服務器和從服務器的配置是不一樣的,所以,一旦主服務器失效,則必須手工進行失效轉(zhuǎn)移。不過,這種單一故障點實際上并不那么脆弱,隨著從服務器越來越多,從服務器的失效會比主服務器的失效更為常見。

主服務器一主服務器復制,外加從服務器。

這種方式實際上與ー臺主服務器加多臺從服務器的架構(gòu)一樣,但這時候主服務器本身也成為了從服務器。這種架構(gòu)的主要優(yōu)點是,在協(xié)同同的主服務器之間更容易實現(xiàn)失效轉(zhuǎn)移和失效轉(zhuǎn)回。這解決了那些令人頭痛的問題,如在線更新數(shù)據(jù)庫模式。主要的缺點是,向兩臺主服務器進行寫人存在風險,會導致數(shù)據(jù)存在某種不一致性,這種不一致很難防范,出現(xiàn)了不一致也很難解決。除非你特別小心,并使用特權(quán)級別進行限制,否則,簡直就是期待著導致這種不一致的錯誤的發(fā)生。

功能分區(qū)。

隨著應用的增長,這倒是個好主意。將應用中成本最高的那些部分移到特定的服務器或特定服務器的集群上,例如,將會話存儲從主服務器上分離。我經(jīng)??吹?ldquo;會話”表吃掉了與其作用不成比例例的大量時間。為分析查詢另外建立一個集群,如果需要的話,使用同樣的導出導人策略,將匯總結(jié)果導入主應用程序集群。將 Sphinx或Solr集群用于搜索。時間以及測量工具會告訴你,應用中哪些部分的成本最高,如果預先不清楚,則造成延遲的那部分就是了。這種架構(gòu)對應用的支持會比較長久。

除了前面列出的有把握的架構(gòu)之外,我想下面的建議更有把握。同任何事情一樣,一旦你了解了規(guī)則,就會常常發(fā)現(xiàn)規(guī)則被破壞的情況,但我認為,除非有很好的理由,否則,這些想法不應該被丟棄。

失效轉(zhuǎn)移和負載均衡。

使用負載均衡器,或者浮動的虛擬P地址。就像你知道的,失效轉(zhuǎn)移是很難實現(xiàn)的。如果有高級的負載均衡器,就用上,或者使用對等的解決方案,即在服務器之間轉(zhuǎn)移IP地址,如果做得合適的話,這種方案很好,而且也不貴。

不用使用DNS或應用程序邏輯。一開始好像很合理,但馬上就會變成夢魘。使用DNS查詢P地址是沒問題的,但不要使用DNS去實現(xiàn)失效轉(zhuǎn)移。換言之,將DNS作為靜態(tài)的系統(tǒng)對待,不要依賴于更新DNS、配置文件、應用程序中的代碼或諸如此類的任何東西。

不要自動化得太多,只讀服務器很容易實現(xiàn)失效轉(zhuǎn)移,而可寫的服務器就難得多。不要試圖構(gòu)建自動化的失效轉(zhuǎn)移。有些事情應該由人來完成。凌晨3點被叫醒做失效轉(zhuǎn)移,總比6點的時候被叫醒,然后在接下來的3天沒日沒夜地試圖恢復數(shù)據(jù),要好得多。

ACID仍然是有意義的。

從一開始就使用全事務型系統(tǒng)。非事務型系統(tǒng)的假設可能已經(jīng)深深地植入了應用程序的代碼中,很難查找與解決了。而后期再切換為事務型系統(tǒng),會導致很多麻煩,如死鎖、鎖等待超時,以及其他預想不到的行為。

高可用性要求快速而可靠的災難恢復,所以在 MYSQL中,要使用 INNODB作為存儲引擎,但不要用外鍵、觸發(fā)器、視圖或存儲過程,因為這些東西會導致復制問題、性能問題、備份以及其他很多問題。不要將 MYISAM用于讀寫數(shù)據(jù),因為會導致災難,而恢復起來則需要相當長的時間。

使用正確的工具。

對每顆釘子來說,數(shù)據(jù)庫都可能成為錘子。這可不是個好主意。不要使數(shù)據(jù)庫處于關(guān)鍵路徑上,如不要將其用于隊列(隊列不能很好地映射到數(shù)據(jù)庫中,而且也是我看到的最常見的麻煩之一)。不要將應用程序的靜態(tài)信息放入數(shù)據(jù)庫中,如配置信息、可以放人緩存或應用程序代碼中的靜態(tài)查找信息、存儲映像。數(shù)據(jù)庫應該存儲數(shù)據(jù),而非應用程序本身。

將數(shù)據(jù)庫簡單化,因為這是最難于伸縮,也是最昂貴的資源。盡可能使用文件和cron作業(yè)。例如,在存入數(shù)據(jù)庫之前,將數(shù)據(jù)預先進行匯總。用簡單的腳本或GNU命令行工具

做匯總,比用網(wǎng)站建設數(shù)據(jù)庫快幾個數(shù)量級!要仔細研究UNIX的核心工具,如sed、awk、sort和unqo這種做法,跟從 Oracle或 SQL Serverl的世界中學到的做法比起來,簡直就是對著干。在 Oracle或 SQL Server的世界中,應用程序只是一種建立在大規(guī)模的數(shù)據(jù)庫之上的表現(xiàn)邏 輯,而數(shù)據(jù)庫充滿了表、視圖、觸發(fā)器、存儲過程以及每一項細小的業(yè)務邏輯。對于復雜的業(yè)務應用,這種集中化的做法有時候是合適的,而且我自己就在這樣的環(huán)境中工作過。但是,對于Web應用,我還是堅持我的觀點:分離應用程序和數(shù)據(jù)庫,將數(shù)據(jù)庫僅用來存儲和檢索數(shù)據(jù)。

本文地址:http://blackside-inc.com//article/3319.html
相關(guān)文章:
最新文章: