嘿!其實我們不用太過於擔心的單點故障

tianxiaoxu發表於2018-06-08

不知道從什麼時候開始,我們們的面試問題清單裡,就明明白白寫了,如何處理大流量高併發問題,如何實現高可用?所以,我也經常會去考慮這些問題(哈哈,當然不是為了面試)。

  大流量,高併發問題,好像已經成了教科書類的問題,無非就是叢集,分散式,快取,讀寫分離,分庫分表,主備,活動預熱……

  如果自己僅停留在這些教科書式的回答,那就顯得太膚淺或者不屑回答這種問題了,不管怎麼樣,我還是沒明白其中的好多問題。所以我也經常會問自己。。。

  叢集怎麼做?有什麼問題?

  首先,叢集的概念,個人感覺和負載均衡是一致的,就是讓一個服務背後有n個伺服器在提供服務,使外部請求能夠分擔到多個機器,主要目的在於減輕單機壓力。那麼,該怎麼做呢?如果是自己搭,那麼,入門級nginx這種工具是一目瞭然的產品,網上一搜都是這麼幹的,一個nginx可以支援幾千甚至上萬的請求,所以應對一時的壓力自是沒有問題了。如果不是自建呢,比如用阿里雲,這裡面提供的服務就比較全了,slb提供天然的叢集能力,點點按鈕就搞定,你要做的就是把n臺伺服器部署成完全一致的樣子,讓器能夠呼叫過來就行。所以,簡單的叢集已經不是問題了,解決初步的流量增長,妥妥的。但是,叢集有什麼問題嗎?或者說是注意的點?主要注意叢集和單機的不同,單機做session之類的東西是沒有問題的,但是叢集就不能簡單這樣幹了,應儘量脫離會話保持這種架構,雖然類似slb這樣服務都會提供會話保持功能,但是都是以犧牲效能為代價的。日誌的列印,線上服務的日誌是一個重要的排查依據,但是隨著叢集的部署,打在本機的日誌就會不全,導致你查某個問題時,無法很好收集到需要的日誌。當然解決方案是有的,你可以透過拉取所有機器上日誌,一臺臺搜尋就可以得到想要的了(太low),salt搜尋(高階),日誌中心(高階)……

  分散式是什麼?怎麼做?

  分散式和叢集是比較容易搞混的,到少我以前是這麼覺得。分散式表現也是多個伺服器同時提供一個功能,不同的是分散式應該是使用不同的應用提供不同的服務,最終被聚合到一處對外表現出一個功能。分散式分應用分散式和資料分散式。應用分散式,其實轉為當下流行的詞就叫,微服務,拆分現有的功能為一個個小功能,使其各司一小領域,減小複雜度提高可用性。資料分散式主要是將資料分佈在不同的地方,從而減輕放在一處帶來的在儲存壓力,透過某種關係關聯起來提供完整服務。

  快取這麼重要嗎?

  是的,快取很重要。所有的服務都不敢保證不怕壓力的,功夫再高也怕菜刀。減少不必要的訪問壓力是對自己的一種保護更是一種提升能力的方式。梳理使用者的訪問路徑,逐級快取應用,到最後基本壓力就沒了。比如,大名鼎鼎的dns服務就是這樣,全世界那麼多的訪問都透過dns進行解析,隨隨便便同時訪問上億,想想都覺得這個壓力可怕吧,但是透過逐級快取,使所有的dns伺服器都壓力小了很多。可見快取的重要性。同樣,在應用層面也可以做到逐級快取,cdn,預載入,應用1..n級伺服器快取,資料快取。具體到技術層面有,前端localstorage,本地快取,cdn就近內容快取,上級應用快取下級應用資料,redis,memcache,mongo,本地快取,熱點資料快取,資料庫設定查詢快取策略。如此,把真正最重要的資料落到最後的壓力上,應對壓力就沒問題了!

  問題:如果單機應用是單點,負載均衡器不也是單點嗎?

  是的,負載均衡其實也只是用一個單點去代替了另一個單點,但是這個代價是值得的。因為負載均衡器無需處理業務邏輯,只是負載請求轉發,所以能夠承受的壓力自然大得多,所以此時的單點就先不要再去考慮了。同理,如果再在負載均衡器上面再加一層lvs之類的,其原理也只是用一個單點代替了另一個單點罷了。重點在於,新的單點是否優於原有單點。起點也是終點,最終的壓力都可以仍至dns去解決。

  資料庫分庫分表怎麼樣?

  這個技術的根本目的在於減輕單表資料量變大的壓力,意義還是比較大的。但是真正到單表壓力特別大的時候,可能也是公司需要尋找新的資料儲存解決方案的時候了。說回分庫分表,分庫分表後,就基本做不到關聯查詢了,資料庫提供的許多高階工具可能會因此而失效,因此,在做分庫分表時,一定會面臨一場浩浩蕩蕩的技術改造過程。當然還有人在專案初期就已經考慮進去了,那就沒啥問題了。

  讀寫分離怎麼樣?

  讀寫分離還是很棒的,有比較大的業務都是讀佔主要部分,做了讀寫分離後,資料庫就可以做主從叢集了,壓力就會分攤。但是,一個重要的問題就是,如何保證讀到資料是準確的?另外,寫資料庫壓力依然沒變,對寫場景沒有一點好處。

  資料庫成為單點了怎麼辦?

  隨著叢集功能的便捷易用,伺服器擴充套件已經不是問題,外部壓力大,只要加機器就可以,但是到了資料庫呢?經常擔心這些問題,其實也是多慮了。都說了做到多級快取,到資料庫時壓力也不大了。把分散式應用的資料庫分散到多個資料伺服器上,天然的叢集。歸檔無用的資料,減輕單表壓力。資料庫的單點還是存在的,那麼就把資料庫伺服器配置搞好點唄。mycat做路由做分散式資料庫。

  雖然我們們會面臨這麼多問題,但是不要擔心單點問題

  單點問題永遠是存在的,只要沒有達到你的預警值,就不要太操心。比如,我們往往擔心叢集后,資料庫是單點,感覺很麻煩,然後就想分庫分表,讀寫分享,其實還是沒必要的,看具體資料再說話。遇到問題了,總能解決。

  技術預載入,預熱……



【該文轉自部落格園 作者:等你歸來去  連結https://www.cnblogs.com/yougewe/p/9153257.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31137683/viewspace-2155867/,如需轉載,請註明出處,否則將追究法律責任。

相關文章