聊聊分散式

1、分散式概述

分散式的定義在百度一搜有一堆,這裡就不複製了,分散式是一個很大的概念,它的本質是什麼呢?不同的人對分散式下的定義描述不一樣,但在本質上是相同的,分散式的本質是:拆分+連接。這次從拆分角度來聊聊自己的一點感想。

2、拆分產生的一致性問題

拆分是將一個大的業務邏輯拆分成多個獨立的子業務邏輯,每個子業務邏輯又可以獨立部署在多台機器上(冗餘,冗餘可以做負載勻衡,提升可靠性),這樣一來就產生了一致性問題(更新一個節點的數據,其它的節點點還沒有更新),其實一致性問題由來已久,經典的CAP理倫由此展示:

C:一致性,這裡指的是強一致性;

A:可用性,在單位時間內要響應;

P: 分區容錯性,部分節點失敗不影響整體。

在分散式中分區容錯性是必須的,一般在一致性和可用性之間進行選擇。後來人們發現選擇一個事物不再是"是"和"不是"的離散選擇,而是一個連續區間的選擇,如可用,是10%可用,還是50%可用,還是100%可用。所以基本這樣的考慮,又有BASE理倫出來了,它提出了最終一致性的思想,這個特別有意思,在很多問題中,它具有極強的指導思想和意義。

那麼一致性怎麼解決呢?很自然的想到了兩種:

1)強一致性:等所有的節點都完成之後,再做下一步操作;

2)最終一致性:這裡又有兩種實現方式:

a. 大部分成功,剩下的慢慢同步;

b. 一個成功,然後通知剩下的進行同步(為了安全起見,還會每隔一段時間進行全量dump操作)。

這裡以最終一致性為例討論實現方案,一種以master接受寫的思路,另一種是節點完全對等的思路。第一種思路以Zookeeper為代表,後面一種是以Diamond為代表。說一下自己的感受:

1) 節點失敗沒有想像的那麼多,失敗了並不可怕;

2)分散式要注重重試、冪等、沖正(回滾)操作。

3、拆分產生的分散式事務

分散式事務是一個非常頭痛的問題,因為在目前互聯網技術中,只有少數的幾家做出自己的分散式事務框架,對外沒有開源,傳統的分散式事務處理適合小型數據量處理,一到高並發的場景並不實用,所以看到大的公司一般都是自己研發分散式事務框架。

要想分散式事務處理框架,有以下幾種:

1) 傳統二階段處理:prepare和commit,JTA為代表,所以的操作先進行prepare,全部通過後再統一做commit;

2)日誌+補償處理:其實資料庫給了我們一個很好的提示,有redo和undo日誌,依據它們可以做重試和回滾操作,所以上面說了分散式中節點失敗不可怕。在做每個子事務之前先寫日誌,成功了刪除日誌,失敗了做回滾操作。

網上還有基於消息來實現分散式事務的,大家也可以考慮下。

4、結語

目前在講分散式是一個公司從小到大發展進程中一定會遇到的,從集中型轉分散式,一定會遇到各種各樣的挑戰。最近結合自己幾年的經驗和接觸到的一些框架,總結分散式相關的內容,如分散式配置中心、分散式任務調度、分散式事務、分庫分表、分散式消息中間件、分散式數據複製技術、分散式調用跟蹤和全鏈路壓測,這一整套構成了完整體系的中間件技術(當然還有更多其它的技術體系),自己花了大量的時間進行思考和實踐,對其中的關鍵實現原理有自己的解決思路,後續一一和大家分享,也歡迎技術愛好者與我一起交流討論,可以加我的手機微信13512717641。


推薦閱讀:

用zookeeper來構建的一種一致性副本協議
快速打造分散式深度學習訓練平台
論文筆記:[SRDS 2004] The Phi Accrual Failure Detector
利用DB實現分散式鎖的思路
論文筆記:[DSN 2002] Scalable Weakly-consistent Infection-style process group Membership protocol

TAG:分散式系統 | 分散式事務 | 分散式一致性 |