隨想(二)-- 基於負載均衡和本地鎖的分散式鎖
- 業務需求
- 現有架構
其中
- 使用者請求到WebServer之間是給予WebServer負載的負載均衡演算法
- WebServer到儲存Server之間,是根據文件Id Hash實現的定向演算法,目的既有實現負載均衡,同時也可以利用本地的鎖,對同一個檔案的讀寫進行控制(尤其是寫),實現文件的版本和內容統一,例如如果兩個人在非協同狀態下同時發出寫請求,我們會生成兩個版本,而不是後面覆蓋前面的。
- 文件同步問題
以上流程的問題在於如果對於同一篇文件Step2和Step3,在不同的web server併發執行,也就是說兩個請求都會導致讀取最新版本文件和寫入快取,如果這個時候,兩個請求之間,又有非協同的使用者,寫入了一個新的版本,就會導致兩個使用者獲得的協同內容不一致,從而導致協同失敗。
- 解決方案--分散式鎖
- 從這個業務需求來看,分散式鎖和文件讀取,都是這個業務的關鍵點,也就是隻要一個失效,這個業務流程就需要終止,否則會產生意料不到的錯誤,例如,如果鎖有問題,導致兩個用在在不同版本上進行協同,產生的結果肯定是錯誤的。所以可以考慮將分散式鎖和文件讀取都分佈到儲存server上。
- 從webserver到儲存server的RPC call,已經實現了基於文件Id的Hash定向,也就是說,從webserver到儲存server的rpc call,可以根據文件id, 定位到固定的儲存server上,所以可以用本地鎖來實現基於文件Id的分散式鎖
- 儲存server已經實現了容錯機制,不會出現單點實現的問題,當前的分散式鎖也就天然的繼承了這個能力
- 具體實現