嘿!不用太過於擔心的單點故障
不知道從什麽時候開始,咱們的面試問題清單裏,就明明白白寫了,如何處理大流量高並發問題,如何實現高可用?所以,我也經常會去考慮這些問題(哈哈,當然不是為了面試)。
大流量,高並發問題,好像已經成了教科書類的問題,無非就是集群,分布式,緩存,讀寫分離,分庫分表,主備……
如果自己僅停留在這些教科書式的回答,那就顯得太膚淺或者不屑回答這種問題了,不管怎麽樣,我還是沒明白其中的好多問題。所以我也經常會問自己。。。
- 集群怎麽做?有什麽問題?
首先,集群的概念,個人感覺和負載均衡是一致的,就是讓一個服務背後有n個服務器在提供服務,使外部請求能夠分擔到多個機器,主要目的在於減輕單機壓力。那麽,該怎麽做呢?如果是自己搭服務器,那麽,入門級nginx這種工具是一目了然的產品,網上一搜都是這麽幹的,一個nginx可以支持幾千甚至上萬的請求,所以應對一時的壓力自是沒有問題了。如果不是自建呢,比如用阿裏雲,這裏面提供的服務就比較全了,slb提供天然的集群能力,點點按鈕就搞定,你要做的就是把n臺服務器部署成完全一致的樣子,讓負載均衡器能夠調用過來就行。所以,簡單的集群已經不是問題了,解決初步的流量增長,妥妥的。但是,集群有什麽問題嗎?或者說是註意的點?主要註意集群和單機的不同,單機做session之類的東西是沒有問題的,但是集群就不能簡單這樣幹了,應盡量脫離會話保持這種架構,雖然類似slb這樣服務都會提供會話保持功能,但是都是以犧牲性能為代價的。日誌的打印,線上服務的日誌是一個重要的排查依據,但是隨著集群的部署,打在本機的日誌就會不全,導致你查某個問題時,無法很好收集到需要的日誌。當然解決方案是有的,你可以通過拉取所有機器上日誌,一臺臺搜索就可以得到想要的了(太low),salt搜索(高級),日誌中心(高級)
- 分布式是什麽?怎麽做?
分布式和集群是比較容易搞混的,到少我以前是這麽覺得。分布式表現也是多個服務器同時提供一個功能,不同的是分布式應該是使用不同的應用提供不同的服務,最終被聚合到一處對外表現出一個功能。分布式分應用分布式和數據分布式。應用分布式,其實轉為當下流行的詞就叫,微服務,拆分現有的功能為一個個小功能,使其各司一小領域,減小復雜度提高可用性。數據分布式主要是將數據分布在不同的地方,從而減輕放在一處帶來的在存儲壓力,通過某種關系關聯起來提供完整服務。
- 緩存這麽重要嗎?
是的,緩存很重要。所有的服務都不敢保證不怕壓力的,功夫再高也怕菜刀。減少不必要的訪問壓力是對自己的一種保護更是一種提升能力的方式。梳理用戶的訪問路徑,逐級緩存應用,到最後基本壓力就沒了。比如,大名鼎鼎的dns服務就是這樣,全世界那麽多的訪問都通過dns進行解析,隨隨便便同時訪問上億,想想都覺得這個壓力可怕吧,但是通過逐級緩存,使所有的dns服務器都壓力小了很多。可見緩存的重要性。同樣,在應用層面也可以做到逐級緩存,cdn,預加載,應用1..n級服務器緩存,數據緩存。具體到技術層面有,前端localstorage,本地緩存,cdn就近內容緩存,上級應用緩存下級應用數據,redis,memcache,mongo,本地緩存,熱點數據緩存,數據庫設置查詢緩存策略。如此,把真正最重要的數據落到最後的壓力上,應對壓力就沒問題了!
- 問題:如果單機應用是單點,負載均衡器不也是單點嗎?
是的,負載均衡其實也只是用一個單點去代替了另一個單點,但是這個代價是值得的。因為負載均衡器無需處理業務邏輯,只是負載請求轉發,所以能夠承受的壓力自然大得多,所以此時的單點就先不要再去考慮了。同理,如果再在負載均衡器上面再加一層lvs之類的,其原理也只是用一個單點代替了另一個單點罷了。重點在於,新的單點是否優於原有單點。起點也是終點,最終的壓力都可以乃至dns去解決。
- 數據庫分庫分表怎麽樣?
這個技術的根本目的在於減輕單表數據量變大的壓力,意義還是比較大的。但是真正到單表壓力特別大的時候,可能也是公司需要尋找新的數據存儲解決方案的時候了。說回分庫分表,分庫分表後,就基本做不到關聯查詢了,數據庫提供的許多高級工具可能會因為而失效,因此,在做分庫分表時,一定會面臨一場浩浩蕩蕩的技術改造過程。當然還有人在項目初期就已經考慮進去了,那就沒啥問題了。
- 讀寫分離怎麽樣?
讀寫分離還是很棒的,有比較大的業務都是讀占主要部分,做了讀寫分離後,數據庫就可以做主從集群了,壓力就會分攤。但是,一個重要的問題就是,如何保證讀到數據是準確的?另外,寫數據庫壓力依然沒變,對寫場景沒有一點好處。
- 數據庫成為單點了怎麽辦?
隨著集群功能的便捷易用,服務器擴展已經不是問題,外部壓力大,只要加機器就可以,但是到了數據庫呢?經常擔心這些問題,其實也是多慮了。都說了做到多級緩存,到數據庫時壓力也不大了。把分布式應用的數據庫分散到多個數據服務器上,天然的集群。歸檔無用的數據,減輕單表壓力。數據庫的單點還是存在的,那麽就把數據庫服務器配置搞好點唄。mycat做路由做分布式數據庫。
- 雖然咱們會面臨這麽多問題,但是不要擔心單點問題
單點問題永遠是存在的,只要沒有達到你的預警值,就不要太操心。比如,我們往往擔心集群後,數據庫是單點,感覺很麻煩,然後就想分庫分表,讀寫分享,其實還是沒必要的,看具體數據再說話。遇到問題了,總能解決。
嘿!不用太過於擔心的單點故障