設計數據密集型應用(8-9):從單機到分散式
- 2020 年 4 月 1 日
- 筆記
這兩章的內容介紹從單機轉向分散式系會遇到的問題,簡單提煉一下幾個重要概念。
分散式系統中的問題
從單機到分散式會遇到很多新的問題。
1、網路。
網路是不可靠的,隨時可能丟包。
網路是有延遲的,而且延遲可能很高。
所以,當你通過網路發送一個數據包的時候,程式必須考慮到這個數據包可能丟失、也可能延遲。
同樣的,如果對端沒回復,也不一定是因為對方掛了,有可能是網路問題。
2、時鐘。
在分散式系統中,不同機器的時鐘是無法完全同步的,並且機器的時鐘有可能向前或向後跳躍,不保證單調遞增。就算是 Google Spanner 中採用的 GPS + 原子鐘,也只能保證不同機器的時鐘誤差是在一個幾毫秒的範圍內。
3、部分故障(partial failures)。
可能出現部分節點故障,這是分散式與單機的最大不同。分散式系統不能因為少部分節點的故障而影響整個系統的可用性。
分散式環境下,只能通過網路通訊來檢測節點是否故障,但是網路又是不可靠的,所以只能通過「節點超時未應答」來判定節點故障——實際上有可能是網路問題,這種情況如果沒有處理好,可能會影響數據一致性。
4、超時。
在單機環境下,一個請求只有成功 or 失敗兩種狀態。
在分散式環境下,還存在第三種狀態——超時。
超時的請求,就是一隻薛定諤的貓——有可能是成功,也有可能是失敗。只能再發個請求去確定一下。
對於一些非常重要的請求,一般將其設計成冪等的來解決,遇到超時可以繼續重試。
線性一致性(Linearizability)
Linearizability 是一種強一致性的模型,這個概念一開始應該是出自並發編程領域,感興趣的話可以參考論文:Linearizability: A Correctness Condition for Concurrent Objects。
對於提供線性一致性的的分散式系統,在這個系統中:
- 多副本的多份數據在外部看起來就像是一份數據。
- 所有操作在外部看起來都是原子的。
實現線性一致性的分散式共識演算法主要有:
- Paxos
- Raft
分散式事務
前面講到了分片和事務,分散式事務其實就是跨分片的事務。
有不少開源資料庫實現了分散式事務,比如:
- TiKV
- CockroachDB
- FoundationDB
- Calvin
想要深入了解分散式事務,這裡推薦一些論文:
- Omid 四部曲:
- Omid: Lock-free Transactional Support for Distributed Data Stores
- Omid, Reloaded: Scalable and Highly-Available Transaction Processing
- A Critique of Snapshot Isolation
- Taking Omid to the Clouds: Fast, Scalable Transactions for Real-Time Cloud Analytics
- Google 家的實現
- Large-scale Incremental Processing Using Distributed Transactions and Notifications
- Spanner: Google』s Globally Distributed Database
- Deterministic Database
- Calvin: Fast Distributed Transactions for Partitioned Database Systems