請教下一主多從,讀寫分離,負載均衡,分散式,這些都是一個東西么?
這幾個概念一般是指提高資料庫系統性能和穩定性的手段,當然也不一定非要套用在資料庫系統上,對於任何基於網路的應用系統,比如Web服務之類的,都可以採用這些手段來優化。
我們假設以資料庫服務為例,最簡單的資料庫服務架構就是由一台資料庫伺服器提供所有的增刪查改服務,這是最方便、最穩定,同時也是最容易實現的架構。但隨著業務的發展,單一的伺服器通常會遇到性能瓶頸,往往不能滿足系統的需求。這時候提升伺服器的硬體配置,比如擴展內存,更換最新型號的CPU等等,的確是一個解決問題的方案,但不是長久之計,因為業務需求和數據量通常總是持續增長的,而單一伺服器的硬體裝備能力卻是有上限的。
另外,單一伺服器的架構也會存在安全性問題,如果這台伺服器因為故障損壞,或者被非法侵入,病毒感染等等,那麼就有可能給整個業務系統帶來毀滅性的災難。為了解決這些問題,就需要更多的技術手段來實現:
一主多從
一主多從從字面上理解,就是指在配備一台主伺服器的同時,再增加若干台從伺服器,主伺服器與從伺服器的內容完全相同。當發生增刪改等操作時,需要對這主伺服器與從伺服器之間的數據進行同步。
這種架構的好處是,主伺服器相當於多了幾台備份,特別是有的伺服器部署在異地時,等於是做了異地備份,對數據安全性的保障有了顯著的提高。當主伺服器發生故障時,任意一台從伺服器都能立即接替主伺服器的工作,保證業務系統的正常運行。
一主多從設計的難點在數據同步方面,一般有兩種同步方式,即實時同步和非實時同步。實時同步要求在每一次數據變化時,都能立即同步所有伺服器上的數據,而非實時同步則是在一個固定的時間,比如凌晨業務量較小的時候同步數據。兩種方式各有優缺點,前者能保證數據的實時性,但對系統性能要求更高,各種異常情況下如何保證數據同步的正確完成的實現難度也更大。而後者實現相對容易,對系統造成的負擔也比較小,但實時性差的缺點也很明顯。
兩種同步方式其實也無所謂好壞,要根據具體的應用場合來決定。比如對實時性要求比較高的場合,像論壇,在線遊戲等應用,就應該保證實時性。而像新聞發布類的偏靜態應用,則可以採用非實時同步的方式,以節省硬體資源。
另外,也可以採用兩種方式相結合的工作模式,比如近期數據,或者需要實時反饋的數據就要保證能夠實時同步,而歷史數據或者統計結算數據則可以用非實時同步的方式。
讀寫分離
讀寫分離也很好理解,一般的應用系統,特別是像新聞類的網站,對數據讀取的需求遠大於數據修改的需求。那麼,可以部署兩台伺服器,一台提供所有的數據增刪查改服務,另一台則只提供數據讀取的服務,並且當數據發生變化時,自動同步兩台伺服器的數據。
這麼做的好處就是將讀操作和寫操作分開了,一是相當於實現了雙機熱備份,提高了系統穩定性,讀伺服器崩潰時,寫伺服器能夠接替它的工作。而當寫伺服器崩潰時,讀伺服器至少還能保證系統的訪問。
由於多數系統的主要壓力都在讀取操作上,這種設計就會把大量的負擔放在了讀伺服器上,對讀伺服器的性能要求就會比較高。為了解決這個問題,可以部署多個讀伺服器,來分擔這種壓力。另外,讀伺服器的設計,不一定非要採用資料庫架構,比如有些數據會被反覆頻繁讀取,這時候可以把這部分數據緩存到內存中,所有的數據訪問請求都在內存中完成,可以大大提高系統性能。
負載均衡
負載均衡就是把系統的壓力均勻分布到不同的運算單元上,實際應用中常用的方法就是對於同一種應用,部署到多台相同功能的伺服器上,當需求響應業務請求時,自動分配到某一台伺服器來完成操作,再把結果發送給用戶。
這種系統架構的好處是充分分擔了系統壓力,同時大大提高了系統的容災性。負載均衡最簡單的調度演算法就是平均分配或者隨機分配,例如把請求平均分成若干份,可以按順序,也可以隨機分配任務到具體的某一台伺服器。
這是按照任務來分配資源的方式,還有一種是按數據來分配資源,將數據存儲在不同的伺服器上,分配的方式可以是隨機的,也可以是按某個演算法,比如按數據的Hash值來分配。還有一種是按業務模塊來分配,比如一個企業的管理系統,可以將財務模塊、生產模塊、人事管理模塊等分配到不同的伺服器上來實現負載均衡。對於超大型的系統來說,還可以在業務模塊的基礎上再次細分,比如人事系統可以按出勤、加班、工資等不同的子業務來細分。
負載均衡真正的難點在於複雜應用的調度演算法,比如一個視頻網站,如果將海量視頻平均分布在不同的伺服器上,其實並不能真正意義上的實現均衡負載。因為按照長尾理論,熱門的視頻只是少數,但卻有極高的播放量,而多數視頻播放量很小,卻佔用大多數的存儲空間。這時候難點就體現在怎麼樣均勻的分布熱門和冷門的視頻存儲,要知道這兩者的關係並不是固定的,熱門的視頻在關注期過去後,很可能成為冷門視頻。而冷門視頻也可能因為一個偶然的原因變得迅速熱門起來。
負載均衡實現的複雜性和業務系統的複雜性成正比,對於大型的網站和應用來說,還要結合其他多種手段來提高系統的穩定性的運行效率,比如各種數據緩存技術等等。
分散式
前文所述的這些概念,本質上都是分散式系統的實際應用模式。分散式系統是通過將硬體資源在物理層面進行分散化,然後通過計算機網路來實現信息交換。對於業務系統的用戶來說,系統是統一完整的,一般不會感受到數據或者邏輯資源是分散的。
打個比方,就好比要寫一本書,但是任務時間太緊,一個人無法在規定的時間內完成。這時候可以找一些擁有相同技能,但居住在不同地區的人,每個人寫一章,最後通過網路將寫好的文章匯總在一起,裝訂成冊,就變成了一本完整的書。這樣的分散式任務模式,大大提高了效率和安全保障,試想如果其中某一個人臨時退出,也不會對整個任務的完成造成太大的影響。
除了業務邏輯的分布,數據也可以分布存儲,這些在前文負載均衡中已經提到過。就好比一套異常珍貴的曠世巨作,因為種種原因只剩下了最後3套, 這時候把這3套書放在一個保險柜中並嚴密看護,遠不如把3套書分別存放在不同的地方來得安全。
分散式系統相比過去傳統的集中式系統擁有更高的性價比,以計算機硬體為例,一顆最強性能的CPU的價格,遠高於大量廉價的低性能CPU。但如果將這些廉價的CPU組成一個分散式系統,則性能未必就比最強配置的CPU差。
就好像要求一下子搬走1000塊磚頭,可能需要一個大力士才行,全世界也找不出幾個這樣的人,就算有,代價也是巨大的。但如果找1000個小朋友,每人只拿一塊磚,就可以輕鬆完成任務,所需要付出的代價可能只是一些棒棒糖。當然實際應用要複雜的多,不能這樣簡單的類比,比如調度好1000個小朋友,讓他們井然有序,不出意外,遠比指揮一個大力士要困難。
顯然概念不一樣。
看下圖,主從指的是伺服器之間的關係。
讀寫分離,指的是伺服器要麼只負責讀數據,要麼只負責寫數據。負責讀數據的可能是主伺服器,也可能是從伺服器;負責寫數據的可能是主伺服器,也可能是從伺服器。當然,由於讀數據多,寫數據少,通常主伺服器負責寫,從伺服器負責讀。
負載均衡,是指儘可能讓所有伺服器的工作強度一樣,因為這樣可以提高伺服器的利用率,從而獲得更快的響應速度。
分散式指的是多個伺服器一起協作的方式,如上訴的都是採用分散式協作的方式。
推薦閱讀:
※殲20有光電分散式孔徑系統嗎?
※想用MongoDB取代MySQL可以嗎?
※中國有沒有類似SETI@home的組織?
※除了 Hadoop 還有哪些分散式計算平台?優勢各自是什麼?