一致性相關知識的索引
01-30
計算機能夠提供的價值
- 平台價值
- 提供信息交換的平台,讓發布方可以通過平台發布信息,傳遞給很多人
- 提供交易的平台,讓多方可以在線交易,執行契約
- 提供信息檢索的平台,讓海量的數據能夠快速被檢索到
- 人工智慧的價值:實現獲取信息,推理,到決策的過程。做為機器人,和其他肉身的人類在平台上協作
海量的信息獲取這一塊(右側那個紅框),在互聯網的推動下有了極大的發展。所謂互聯網公司的海量流量的牛b技術,主要是把索引和分散式搞好了。可以極強地進行水平擴展,高效地檢索信息。
左側的兩個紅框,就是交易平台。它在這個體系下提供的作用就是,向上承接多種角色的交易請求(寫入操作)。協調多方,解決角色之間的衝突。然後把交易的結果發布給信息檢索平台。當沒有衝突需要解決的情況下,交易平台就退化成了一個簡單的信息交換平台。
交易平台
交易平台為了提供它的兩個業務價值,對一致性提出了兩個需求:
- 一致性讀取:最強的一致性讀取需求就是線性一致性讀取。要求寫入成功之後,立馬就可以被讀取到。這個前和後是說的是牆上的時間。
- 一致性寫入:最強的一致性寫入的需求就是線性一致性寫入。寫入操作分成read-write兩個階段,要求read的時候可以看到所有之前已經write成功的改動。然後要求write如果要成功,不能在read-write中間有其他的寫入插入進來。
多對象
多對象寫入有兩種情況
- 多個對象對應真實世界中的不同實體:比如轉賬時的多個賬戶,對應了多個用戶的錢包。
- 真實世界的同一個實體在虛擬空間的多種投影:因為計算機的檢索計算效率,需要用多種對象來代表同一個東西。比如一個3個欄位的對象,按照每個欄位做一次排序,就可以有3個副本。不同的排序滿足了不同欄位的檢索效率的需求。
一個實體被投影成了多個對象之後就引入了複製問題,或者叫「冗餘欄位」問題
這種冗餘又可以分為兩種:
- 需要強一致的冗餘:比如發單的時候判斷是否有未支付訂單。我們需要維護訂單狀態和是否有未支付訂單這樣的冗餘關係。這個需要強一直。
- 需要弱一致的冗餘:訂單狀態和乘客歷史訂單與司機歷史訂單之間不需要太強的一致性。
保持一致性的兩種思路
- 寫入時就判斷是否一致:也就是能檢測衝突,並反饋是否寫入成功
- 讀取時「歸總」寫入的情況,得到一個一致的視圖:當業務邏輯本身沒有衝突檢測的需求(比如就是+1,無論什麼前提條件都+1),可以隨意寫入,總是成功。讀取的時候讀多個副本內容,merge出結果。比如CRDT的流派
寫入時保持一致性的四種方法
- 用CPU保障單機的一致性,故障切換等場景下容忍錯誤
- 排隊到單個線程里去處理
- mfence/sfence 保證一致性讀
- lock cmpxchg 保證一致性寫
- 代表資料庫:redis
- 對單對象的改動在一個log里進行排序
- shared log:共享一份全局的日誌
- 讓歷史靜止(v版本,以及v-1, v-2, .. 0的版本都靜止),然後讀 v 版本
- 讀完了之後進行業務邏輯版判斷,決定 v+1 版本進行寫入
- 讓歷史靜止由占坑來實現。坑要保證自己只能被佔一次。
- 單對象的模型,需要用「對賬」機制來保證多個對象之間的數據一致性。
- 把多個對象靜態捆綁成一個對象,然後把操作在一個log里排序
- zookeeper/etcd為代表的資料庫
- hyperledge的read-write set就是一種對這樣場景下的優化
- 把多個對象動態捆綁成一個對象,然後改完了,再解綁
- spanner/cockroach/tidb 的模型
- 多key的背後是多log
- 多key之間的事務靠2pc提交。動態捆綁對象成一個就是靠2pc。
推薦閱讀:
※raft 經典場景分析
※事件和時間:Time, Clocks, and the Ordering of Events in a Distributed System 讀後感
※小議分散式系統的一致性模型
※state machine replication vs primary backup system
TAG:分布式一致性 |