隔離是指将系統或資源分割開,系統隔離是為了在系統發生故障時能限定傳播範圍和影響範圍,即發生故障後不會出現滾雪球效應,進而保證隻有出問題的服務不可用,其他服務還是可用的;而資源隔離有髒資料隔離、通過隔離後減少資源競争提升性能等。我遇到的比較多的隔離手段有線程隔離、程序隔離、叢集隔離、機房隔離、讀寫隔離、動靜隔離、爬蟲隔離等。而出現系統問題時可以考慮負載均衡路由、自動/手動切換分組或者降級等手段來提升可用性。
線程隔離
線程隔離主要有線程池隔離,在實際使用時我們會把請求分類,然後交給不同的線程池處理,當一種業務的請求處理發生問題時,不會将故障擴散到其他線程池,進而保證其他服務可用。

我們會根據服務等級劃分兩個線程池,以下是池的抽象:
程序隔離
在公司發展初期,一般是先進行從0到1,不會一上來就進行系統的拆分,這樣就會開發出一些比較大而全的系統,系統中的一個子產品/功能出現問題,整個系統就不可用了。首先想到的解決方案是通過部署多個執行個體,然後通過負載均衡進行路由轉發,但是這種情況無法避免某個子產品因bug而出現如oom導緻整個系統不可用的風險。是以此種方案隻是一個過渡,較好的解決方案是通過将系統拆分為多個子系統來實作實體隔離。通過程序隔離使得某一個子系統出現問題不會影響到其他子系統。
叢集隔離
随着系統的發展,單執行個體服務無法滿足需求了,此時需要服務化技術,通過部署多個服務,形成服務叢集來提升系統容量,如下圖所示
随着調用方的增多,當秒殺服務被刷會影響到其他服務的穩定性,此時應該考慮為秒殺提供單獨的服務叢集,即為服務分組,進而當某一個分組出現問題不會影響到其他分組,進而實作了故障隔離,如下圖所示
比如注冊生産者時提供分組名:
消費時使用相關的分組名即可:
機房隔離
随着對系統可用性的要求,會進行多機房部署,每個機房的服務都有自己的服務分組,本機房的服務應該隻調用本機房服務,不進行跨機房調用;其中一個機房服務發生問題時可以通過dns/負載均衡将請求全部切到另一個機房;或者考慮服務能自動重試其他機房的服務進而提升系統可用性。
一種辦法是根據ip(不同機房ip段不一樣)自動分組,還一種較靈活的辦法是通過在分組名中加上機房名解決:
讀寫隔離
如下圖所示,通過主從模式将讀和寫叢集分離,讀服務隻從從redis叢集擷取資料,當主redis叢集出現問題時,從redis叢集還是可用的,進而不影響使用者通路;而當從redis叢集出現問題時可以進行其他叢集的重試。
動靜隔離
當使用者通路如結算頁時,如果js/css等靜态資源也在結算頁系統中時,很可能因為通路量太大導緻帶寬被打滿導緻出現不可用。
是以應該将動态内容和靜态資源分離,一般應該将靜态資源放在cdn上,如下圖所示
爬蟲隔離
在實際業務中我們曾經統計過一些頁面型應用的爬蟲比例,爬蟲和正常流量的比例能達到5:1,甚至更高。而一些系統是因為爬蟲通路量太大而導緻服務不可用;一種解決辦法是通過限流解決;還一種解決辦法是在負載均衡層面将爬蟲路由到單獨叢集,進而保證正常流量可用,爬蟲流量盡量可用。
比如最簡單的使用nginx可以這樣配置:
實際場景我們使用了openresty,不僅僅對爬蟲user-agent過濾,還會過濾一些惡意ip(統計ip通路量,配置閥值),将他們分流到固定分組。還有一種辦法是種植cookie,通路特殊服務前先種植cookie,通路服務時驗證該cookie,如果沒有或者不對可以考慮出驗證碼或者分流到固定分組。
熱點隔離
秒殺、搶購屬于非常合适的熱點例子;對于這種熱點是能提前知道的,是以可以将秒殺和搶購做成獨立系統或服務進行隔離,進而保證秒殺/搶購流程出現問題不影響主流程。
資源隔離
最常見的資源如磁盤、cpu、網絡;對于寶貴的資源都會存在競争問題。
預設cpu的排程政策在一些追求極緻性能的場景下可能并不太适合,我們希望通過綁定cpu到特定程序來提升性能。如我們一台機器會啟動很多個redis執行個體,通過将cpu通過taskset綁定到redis執行個體上可以提升一些性能;還有nginx提供了worker_processes和worker_cpu_affinity來綁定cpu。還有如系統網絡應用比較繁忙的話,可以考慮綁定網卡irq到指定的cpu來提升系統進行中斷的能力,進而提升性能。
還有如大資料計算叢集、資料庫叢集應該和應用叢集隔離到不同的機架,并盡量隔離網絡;因為大資料計算或資料庫同步時時會有比較大的網絡帶寬,可能擁塞網絡導緻應用響應慢。
還有一些其他類似的隔離術,如環境隔離(測試環境、預釋出環境/灰階環境、正式環境)、壓測隔離(真實資料、壓測資料隔離)、abtest(為不同的使用者提供不同版本的服務)、緩存隔離(有些系統混用緩存,而有些系統會扔大位元組值到如redis,造成redis慢查詢)、查詢隔離(簡單、批量、複雜條件查詢分别路由到不同的叢集)等。通過隔離後可以将風險降低到最低、性能提升至最優。
原文連結:[http://wely.iteye.com/blog/2354485]