這裏的架構跟設計模式存在很多問題,有些隻用于十分(fēn)有限的多少種環境中(zhōng),之所以在這多少種環境中(zhōng)有用,是因爲你真的明白(bái)在做什麽。要是這樣的話,你可能跳過這章不讀。但爲了使我(wǒ)的說法可能保險地實用于所有情況,我(wǒ)倡導你不要利用這些架構。
分(fēn)片
經常可能聽到這樣的倡導: ;要盡早分(fēn)片,經常分(fēn)片。網站設計網站頻道就是網站的大(dà)框架,也就是主體部分(fēn),比如:首頁,公司簡介,新聞動态,産品展示,在線留言,聯系我(wǒ)們等,這是标準的企業網站的内容。如果你有特定的框架,請您一(yī)一(yī)列出,這樣方便我(wǒ)們設計。 ;我(wǒ)的倡導則大(dà)爲不同 ;除非不得已,不要分(fēn)片 ;。假如有足夠的教訓,明白(bái)不得不分(fēn)片,那就要對分(fēn)片做好準備,但仍然要等到須要分(fēn)片的時候再進行分(fēn)片。分(fēn)片存在一(yī)些問題。
重要問題是分(fēn)片當初已經很盛行,而且人們分(fēn)片做得太早、太頻繁。我(wǒ)看到的大(dà)多數體系,要麽已經做了分(fēn)片,要麽正在考慮做分(fēn)片,實際上基本就不須要逐個隻須要對目前可用的商(shāng)品硬件進行充分(fēn)利用即可。以我(wǒ)的觀點看來,對一(yī)個中(zhōng)等範圍的利用,就要将其構建在超出數百台低檔機器的分(fēn)片架構上,試圖供給無窮伸縮才幹,是十分(fēn)愚笨的。切實,隻須要購買多少台足夠好的機器,在工(gōng)程上多做些考慮,就足夠了。對每個睜大(dà)眼睛、指着分(fēn)片的勝利故事的人(我(wǒ)曾經就是其中(zhōng)之一(yī)),我(wǒ)可能給你看一(yī)些不利用分(fēn)片的大(dà)範圍利用,隻是靠了多少個聰慧的人,就能運維這種大(dà)範圍利用。我(wǒ)的共事,還有我(wǒ),也曾經看到過大(dà)量的最盛行的分(fēn)片利用,透過名義景象,内部卻是資源的極大(dà)揮霍。
分(fēn)片架構比你料想的要昂貴得多,甚至在短期内也是如此,長期則一(yī)定如此。這方面的例子有:分(fēn)片一(yī)旦樹破,則無奈爲了從新均衡的目标而再次構建;或者利用一(yī)種過于簡單的方法,如用簡單的取模算法作爲分(fēn)片函數。用拙劣的工(gōng)程方法構建分(fēn)片架構,無疑是一(yī)種短視行動,從而也是基本無奈實現可伸縮的。對真正重要的事件也就很難考慮跟設計,如常見的生(shēng)效情況。假如要在很多台機器上散布利用,或哪怕隻有多少台,都要認真地考慮生(shēng)效轉移跟故障後回切。利用程序也可能須要考慮生(shēng)效的容錯性,假如一(yī)局部數據集不可用,要可能降級運行。
分(fēn)片的第三個問題波及适度設計(overengineering)的危險。大(dà)多數事件都很難做到正好,不是做過火(huǒ)了,就是不做到位。懼怕架構不足夠的機動性,或懼怕不曉得怎麽做到正好,很輕易導緻适度設計。這不僅使事件過于龐雜,還會産生(shēng)無休止的麻煩。
寫入多台主服務器
存在很多引誘性的陷阱,其中(zhōng)之一(yī)就是,将複制拓撲中(zhōng)的多台服務器配置成可寫的,你認爲這樣做就萬事大(dà)吉了。網站建設前期網站定位、内容差異化、頁面溝通等戰略性調研,這些确立後,再去(qù)注冊域名、租用空間、網站風格設計、網站代碼制作五個部分(fēn),這個過程需要網站策劃人員、美術設計人員、WEB程序員共同完成。通常的主意是, ;這樣就可能進步寫操作的機能 ;或者 ;所有節點都是等同的,從而生(shēng)效轉移就輕易實現了。 ;然而,這兩者都是錯誤的。
在主-主配置中(zhōng),通過向兩台主服務器寫,是無奈進步機能的。所有的寫操作都要通過複制發送給從服務器,在每個節點上都要重複履行該寫操作,所以,寫操作從哪台服務器上發出,是無關緊要的。
因爲複制是異步履行的8,在多個位置進行寫操作十分(fēn)輕易出錯,而且多少乎判斷在很多情況下(xià)都會産生(shēng)麻煩,這些情況包含生(shēng)效轉移、利用程序錯誤、程序員錯誤,以及大(dà)量的其餘常見情況。通常導緻的結果有喪失數據,以及長時光的、沒日沒夜的苦幹,試圖将體系恢複到公道的、一(yī)緻的狀況。試圖說服你的老闆或共事不要這樣做,判斷很艱苦,但一(yī)定要試試。
多級複制
假如可能的話,盡量不要利用多級複制。網站建設前期網站定位、内容差異化、頁面溝通等戰略性調研,這些确立後,再去(qù)注冊域名、租用空間、網站風格設計、網站代碼制作五個部分(fēn),這個過程需要網站策劃人員、美術設計人員、WEB程序員共同完成。利用一(yī)台主服務器跟N台從服務器,而不是從服務器的從服務器的從服務器,要簡單得多。麻花鏈鏈的從服務器結構,有的時候是有優點的,但可能的話最好避免利用。孫子輩的從服務器跟重孫子輩的從服務器很難治理,假如在這些從服務器跟位于金字塔頂真個主服務器之間的旁邊級别上産生(shēng)問題的話。常見的問題有複制延遲、服務器瓦解、錯誤以及網絡問題。
環形複制(多于兩個節點)
要像躲避瘟疫一(yī)樣避免利用環形複制,其生(shēng)效情況,不管是數量還是龐雜度,都大(dà)得超乎設想。就在多少天前,我(wǒ)接到一(yī)個懇求支撐的電話,那是由5台服務器形成的環,在試圖移掉其中(zhōng)一(yī)台而用另外(wài)的服務器調換時,卻産生(shēng)了語句逝世輪回的問題。這種架構十分(fēn)懦弱,随時都會引發災害。
依附于DNS
我(wǒ)已經說過這一(yī)點,但仍然值得再重複一(yī)次。DNS很懦弱,依附于DNS終極會自食苦果。将DNS用于域名查問是沒問題的,但DNS不應當受生(shēng)效轉移的影響。不要将輪回DNS∞用于負載均衡。同理,也不要利用/letc/hosts,對這個文件的版本變革、治理以及安排都要是原子操作。
所謂的實體一(yī)屬性一(yī)值(EAV)設計模式
每當有人對我(wǒ)說, ;我(wǒ)有一(yī)個托管的多租戶Saas利用… ;我(wǒ)都可能彌補他的下(xià)半句: ;你利用的是EAV,而且有機能問題。 ;在你不曉得終極的數據模式是什麽,或者基本就不終極的數據模式時,EAV是有引誘力的。這往往出當初 ;托管的、多租戶的SaaS利用 ;中(zhōng),這隻是因爲公司想銷售有機動性的貨色。他們想這樣告訴客戶: ;不管你的數據是什麽樣的,都會适合咱們的體系的。 ;但這并不是關聯數據庫的工(gōng)作方法。因爲很快就會産生(shēng)100個表的自連接(self-joins),而産生(shēng)的查問盤算除了因爲搜查全部磁盤而産生(shēng)的随機IO之外(wài),不會做更多的事件。這些搜查在網站建設索引中(zhōng)找到一(yī)點兒數據,而後将這些簡單的值按行拼接起來逐個這個進程很慢(màn)的。在 MYSQL中(zhōng),你是無奈做100個連接的, MYSQL的限度是每個查問隻能最多對61個表做連接,實際上不到20個表的時候就已經有問題了,因爲履行盤算的盤算太龐雜了。