面試被問到在百萬級請求的情況下,伺服器如何保證可用性,我一順嘴就說了訪問量大了會崩潰,面試官就說為什麼會崩潰呢,處理慢點不就行了。我一時語塞,訪問量大了為啥會伺服器會崩潰呢?還是壓根就是反應慢而已?還是因為死鎖或者太熱了硬體受不了?


作為一個穩定的系統是不會崩潰的,這輩子都不會,要不怎麼能叫穩定呢。

那為什麼實踐中我們確實會遇到訪問量過大而伺服器趴窩呢?因為實際情況比較複雜。

第一個是內存的問題。

服務每個請求都是要吃內存的,請求越多內存用量越大,但內存畢竟是有限的,可能是物理內存確實用光了,也可能是OS或者中間層的限制。但不管怎樣,一旦發生後果嚴重。

daemon大概率會被os殺死,或者內部出現了問題導致完全失去響應。伺服器就趴窩了。

第二個是設計上的局限。

有些東西設計上就不是為大負載高並發來做的。比如早年的mysql/myisam。速度快不快?飛快。但一定資料庫大到一定程度,性能就會直線下降。雖然在這個階段還只是反應慢,伺服器沒有趴窩,但這種慢並非是線性增長的,而是近似於指數那這樣增長方式。比如100個請求的時候每個請求1秒,200個請求的時候每個1.5秒,300個請求的時候每個5秒,到了1000個的時候就每個一個小時了。

就像高速公路,車少的時候大家都能跑到法定速度。車一旦增多就會堵車。更嚴重的是即使堵車之後即使進入的車流沒有繼續增加,因為出高速的車流越來越慢,堵車也會越來越嚴重,最後堵到所有人都堵死。

到這個程度就可以認為是事實上的趴窩了,因為幾乎所有人的請求都會因為超時而掛掉。

第三個是設計上的缺陷

其實說第二個問題的時候已經提到這個問題了,雖然擁堵本身是等一等就能消解,但一旦系統負荷增大到遠超預期,那就不一定會發生什麼事。比如大量的擁堵導致緩衝區爆了,導致了一連串連鎖反應,比如前面提過的內存也爆了,進而引發一些不可逆的後果,最後導致伺服器宕機。


現實生活中,情況可能會更複雜,宕機可能是多重作用的結果。

比如一個系統有4個節點做負載分散,哪怕4個死了3個也不會完全宕機。

結果一波高峰導致其中兩個節點暫時負荷變高,反映變慢。然後導致接下來短時間所有的流量都被導入剩下的兩個節點,把剩下兩個節點搞到完全不動了。

這個時候雖然前兩個反應過來了,但面對海量的求情也很快就趴窩了。畢竟是是需要四個人才能搞定的活,現在兩個兄弟趴了,剩下兩個孤軍奮戰趴也是遲早的事。

這樣伺服器就全趴了。


面試被問到在百萬級請求的情況下,伺服器如何保證可用性

這很難說,隨便講講我能給你講一整天。

如果要一句話回答這個問題的話:那就是具體看是什麼樣的系統。

完全靜態的還是請求特別複雜特別重的那種。前者倒是簡單,後者你要每秒出1百萬張火車票12306也一樣做不到。


你的應用有加防禦嗎,,瀏覽量大不大,並發數多嗎,還有你的伺服器配置咯這些都是問題,我也是做伺服器有問題也可以交流交流,我是做香港伺服器的。


訪問量大了,理論上不會崩潰,只是理論上。

訪問量大了,你的內存滿了、TCP連接到頂了(比如time_wait太多,無法接受新連接)、CPU已經忙不過來了——這一切的理論後果是處理速度慢了,或者直接拒絕新的服務請求。

但如果你的伺服器代碼有缺陷,比如內存無法分配,拋出異常,而你沒有處理這異常(大家都知道,一些情況下處理各種錯誤的代碼甚至可能會佔你代碼量的一半,非常繁瑣),會造成進程的退出——崩潰;或者無法建立新的TCP連接,你又沒有處理這種異常——崩潰;磁碟滿了——崩潰……程序一大這種細小的問題會多如牛毛。甚至你依賴的基礎軟體,如JVM,內存不足也可能導致崩潰。雖然有交換分區的存在,但也只是延遲了內存分配失敗的時間,但此時性能已經急劇下降,與崩潰無異——完全沒響應了。

所以,始於Erlang的「就讓它崩潰」思路,在這是有用的。它不會因為一些事情導致你的整個程序退出,而是某個「進程」(erlang的「進程」你可以粗略理解為一個線程)退出,並讓父「進程」捕獲到這個錯誤。等這些破事過去,你的伺服器就又像以前一樣歡快了。

那麼,如何防止這些崩潰?一方面你的程序要健壯,不會因為這些錯誤而導致整個程序的退出,將錯誤限制在工作線程或子進程里。另一方面,你的系統要做限流。


宕機是個計算機術語。多指些網站、遊戲、網路應用等伺服器種區別於正常運行的狀態,也叫「Down機」、「當機」或「死機」。宕機狀態不僅僅是指伺服器「掛掉了」、「死機了」狀態,也包括伺服器假死、停用、關閉等些原因而導致出現的不能夠正常運行的狀態。

  大多數的宕機,是指些網路伺服器,因為受到攻擊、訪客暴增、高負載、高並發等資源耗盡而出現的假死機狀態。比如:LOL遊戲伺服器,因為活動,使同時在線遊戲玩家,伺服器帶寬、CPU等資源耗盡,從而導致伺服器宕機,經常出現lol伺服器無法連接,無法登錄的狀況。   還有些宕機,是因為些網路應用所承載的伺服器內部系統錯誤,而導致的連接中斷、無法連接等狀況。比如:2015年3月11日5點起,蘋果用戶反應AppStore、MacAppStore、iTunesStore均為宕機狀態,iTunesConnect無法登陸,iBooks商店沒有響應,iOS和Mac的應用商店也出現了大面積癱瘓,並顯示為「所有用戶不可用」,長達11個小時服務中斷狀況。   當然,通常我們常會遇到的宕機,如:空間宕機,以及VPS宕機等,則由於其他客戶或自身的原因,導致VPS宿主伺服器的操作系統出現問題或崩潰,運營商需要對伺服器的停機維護而出現的,實際上並不算是真正意義上的宕機,同樣影響比較小,且可控。

  理論上來說,因為沒有絕對安全的系統,也沒有絕對夠用的資源,更不會有絕對就不出問題的伺服器及應用程序,所以,宕機也就不可避免。不過我們可以通過伺服器日常維護及優化工作有效降低宕機概率,同也可以通過宕機監控和警報等系統有效降低宕機所帶來的不利影響。

伺服器宕機的原因通常有哪些呢?1、伺服器環境的客觀原因。比如機房斷電導致的伺服器斷電、機房溫度過高,導致的伺服器死機、關機等。不過這種情況般很少發生,因為像景安雲機房等數據中心,通常都有很好預防措施,比如備用電路、備用發電機、全時段機械及自然製冷、只能恆溫系統等。2、伺服器不堪負重。這種情況是比較常見的主要原因,網站流量暴增、程序中毒、遭受攻擊等大規模高消耗伺服器資源情況,而導致的伺服器資源耗盡不敢負重,終無法響應和死機。3、就是不合理的應用了。比如種很常見的現象就是,由於考慮成本,些站長常會租用較低配置的VPS、雲伺服器等,用來建設網站,但又同時安裝諸多與網站建設毫無相關的其他大型軟體,讓伺服器以小轎車之能,擔負大貨車的負載,結果可想而知,宕機死機屬常事才是應該。總之,宕機的常見原因也還有很多細節原因,比如,錯誤的環境配置、陷於死循環的錯誤程序、資料庫索引缺失、資料庫丟失等都會無端消耗大量伺服器CPU、內存等資源,從而導致的伺服器死機宕機等。不過,基本大多數宕機的原因都不出以上三種常見原因範疇。

從大概2014年左右接觸伺服器,web開發,四五年下來,伺服器用過很多,因為硬體宕機的先例至少我是沒有碰到過(比如沒有外力水災地震打雷因素),但是機房網路確實比較容易出問題,不過幾年來也不過五六次,這還是多家伺服器商加起來一共五六次,再就是如果伺服器被攻擊,比如cc,ddos,那肯定會宕機,這也算外力因素。還有就是管理員自身配置部署的軟體環境有問題,程序經常假死。


主要先理清楚以下幾個問題:

什麼是伺服器宕機?

伺服器宕機指的是伺服器由於某些原因導致伺服器無法正常運轉,造成網路無法使用,對於網站來說,伺服器宕機帶來的影響很大,他不但造成訪客對網站無法訪問,甚至影響到網站在搜索引擎上的排名。

在伺服器的使用過程中,伺服器的宕機隨時都有可能出現,首先我們要找到伺服器宕機的原因,才能找到對應的解決方案

伺服器出現故障的常見原因:

1.在運行環境問題上,最常見的是硬碟資源消耗殆盡

2.在性能問題上,最普遍的伺服器宕機原因確實是運行很糟糕的SQL,但也不一定是這個原因,比如也有很多問題是由於伺服器bug或者錯誤的行為導致的

3.糟糕的 Schema 和 索引 設計是第二大影響性能的問題

4.複製問題通常是由於主備數據不一致導致

5.數據丟失問題通常是由於drop table 導致的,並總是伴隨著缺少可用備份的問題

如何查看伺服器宕機的原因?

1.是否是應用程序導致內存溢出或者泄露導致,out of memory導致?

2.是否是進程過多或不斷創建,導致資源耗盡導致?

3.是否是資料庫程序死鎖,或者連接數過多導致?

4.是否是應用程序異常導致?

5.是否是流量負載過大導致?

6.是否是遭到黑客入侵導致?

7.是否是操作有誤導致?

伺服器宕機如何解決?

可以準備兩個網站空間,他們存放的內容相同,而ip地址不相同,並且機房的地理位置不同,這樣兩個主機,同時出現宕機的可能性就大大降低了。第一時間發現伺服器宕機問題後,可以迅速的通過修改http://dnspod.com中的域名記錄,指向目前正常的網站空間,

dnspod解析生效的時間是實時的,而一般的dns伺服器刷新時間比較長,對外聲稱24小時生效,但是按照實際經驗來看,差不多30分鐘內生效,否則就要檢查域名綁定是否正確了


伺服器出現宕機的常見原因

1.在運行環境的問題中,最普遍的問題時磁碟空間耗盡。

2..在性能問題中,最普通的伺服器宕機原因確實是運行很糟糕的SQL,但也不一定都是這個原因,比如也有很多問題時由於伺服器Bug或錯誤的行為導致的。

3..糟糕的Schema和索引設計是第二大影響性能的問題。

4..複製問題通常由於主備數據不一致導致。

5.數據丟失問題通常由於drop table的錯誤操作導致,並總是便隨著缺少可用備份的問題。


ddos攻擊。

數據量過多,機器性能跟不上。

硬碟用的太多,報警了。

臉不好,新買沒幾個月的機子主板壞了。


知名雲廠商客戶經理,謝邀。

個人認為雲主機會宕機除了一些不當的操作,火災等無法控制的因素外,最大的原因就是跑滿,結果就崩潰了。

一般來說一台物理機來做虛擬化,會有一定的虛擬比例,比如1台物理機最後虛擬成20個雲主機,但由於虛擬比例,內存並沒有物理機本身的內存了,於是在業務到高峰期時,這20個雲主機很容易跑滿,然後掛掉。


百萬級請求需要巨量的伺服器資源進行訪問應答,會消耗伺服器的CPU、內存、帶寬等資源,造成網路擁堵,如果只有一台伺服器,自然是會宕機的,如果想要保障伺服器本身的可用性,就要考慮負載均衡和伺服器集群,通過負載均衡可以實現訪問量的分布和帶寬資源的增加、分配,降低單台伺服器的訪問壓力,同時防止網路擁堵;伺服器集群則可以增強伺服器整體群落的應答性能,從而相對有效提升伺服器的可用性。


推薦閱讀:
相关文章