­

從單體到分散式,必須解決的四個問題

一般來說,為了應對高並發和高可用,應用伺服器都會由單體向分散式演變。而從單體到分散式,通常會遇到四個問題必須要去解決。

一,session共享

首先第一個要解決的就是sesison共享的問題,如下圖。

通常有兩種解決方案,第1種是配置nginx的負載集群策略為ip_hash,第2種是將session存儲到其它地方,一般推薦放到redis中。

第1種方案適合於臨時解決或者是為了兼容歷史項目,但是從應用伺服器無狀態的角度考慮,推薦把用戶會話session放到redis,如下圖。

二,本地快取

如果使用本地快取,當從單體遷移到集群後,就會面臨快取同步的問題,如下圖。

最佳實踐是上分散式快取,既解決了快取同步的問題,也釋放了應用伺服器的記憶體資源,如下圖。

三,文件服務

應用伺服器在上集群之前,文件通常會放在本地,或者單獨的文件伺服器上,因為文件服務需要佔用大量的硬碟空間,以上兩種方案都無法很好的解決硬碟擴容的問題,最佳實踐是放到雲存儲上,比如阿里雲的OSS,或者騰訊雲的COS上,這樣可以做到按需擴容,如下圖。

四,分散式環境下執行緒同步問題

在單機環境下,使用lock就可以解決執行緒同步的問題,一旦上了集群之後,lock就不管用了,這時需要上分散式鎖,分散式鎖的解決方案也有很多,我這裡推薦使用redis的setnx,需要注意的是,如果redis是集群部署的,需要考慮這種情形:假設我們在redis的主節點上添加了一把分散式鎖,不幸的是主節點掛掉了,而且主節點上的鎖還沒有同步到從節點上,如果此時有客戶端來請求獲得同一把鎖,那麼它將順利地獲得鎖,之前那把鎖會被無情地忽視掉,這就是分散式鎖在Redis集群中遇到的麻煩。

為了解決這個問題,Redis的作者提出了Redlock的演算法來解決這個問題,推薦大家直接使用這個開源項目://github.com/samcook/RedLock.net

 

那麼,順利解決了以上四個問題之後,我們的系統架構就演變成以下這個樣子。

歡迎大家掃描下方二維碼獲取我的最新原創文章: