Zeebe服務學習3 Raft演算法與集群部署

2022-01-15 23:09:58 字數 2653 閱讀 9052

1.背景

zeebe集群裡面保證分布式一致性問題,是通過raft實現的,其實這個演算法用途比較廣泛,比如consul閘道器,也是通過raft演算法來實現分布式一致性的。

首先簡單介紹一下raft:

在學術界,解決分布式一致性最耀眼的演算法是paxos,同時,這個演算法也是最晦澀。而raft演算法就是基於這個背景被提出來,相對paxos,raft比較容易上手。

2.raft演算法介紹

集群每個節點都有三個狀態:follower,leader,candidate(leader候選人)三個狀態之間是可以互換的。

集群中每個節點都會維護乙個資料結構(term,leader):現在term是多少,leader是誰。

(1)正常情況下,leader(a)正常執行,每個節點上都有乙個倒計時器(election timeout),時間隨機在150ms到300ms之間。

leader定期會廣播心跳訊息(term,leadera),告訴follower自己還活著,當follower接收到心跳資訊後,

發現自己維護的term等於發來的訊息裡面的term,按下躁動的心,重置倒計時器。

(2)leader掛了,此時follower們都在倒計時,一旦某個follower(b)倒計時到了,沒有leader的心跳訊息鎮壓,

這個follower就會率先構造訊息(term+1,leaderb),進行廣播;其他的follower(包含leadera),都會接收到該心跳訊息,

發現自己維護的term小於這個新的term,則用新的去更新舊資料,然後返回ok資訊給leaderb。

b收到大多數節點的投票後(vote > (n-1)/2),就變成下一任leader,狀態由candidate變成leader。

(3)如果兩個follower同時構造訊息(term+1,leaderb),(term+1,leaderc);

其他follower也是在接收到訊息後去更新自己維護的資料,因為term數值一樣,其實就是看訊息廣播速度,

誰先占領更新其他follower,最後以少數服從多數處理。

比如b的訊息傳遞到d節點上,d發現自己term小於傳遞來的訊息,

就會更新自己的資料值,然後重置倒計時器;此時c的訊息也來了,

d發現term並不比自己維護的大,此時,d不會管c的訊息了。

如果c獲得的支援數少,最後失敗後,狀態會從candidate變成follower,然後接收leaderb的心跳訊息,

更新自己的資料,安安心心當小弟。

可以參考:

3.部署zeebe集群

部署zeebe集群,由於測試與正式機器的差異,我經歷了很多曲折,當然也是一筆財富,至少坑我都趟了一遍了。

(1)部署帶有monitor的集群(win-docker環境)

這是在我本機上,我本機是win10系統,所有就搞了乙個win-docker,本想著通過docker-compose.yaml檔案把monitor也部署上去,

根據榮鋒亮大神的部落格,按照一步一步的來,最後還是失敗了,最後請教了大神,他說不建議在win-docker上部署,

然後現在最新版的zeebe整合monitor需要改配置…..,最後放棄這條路。

(2)只部署集群 (win-docker環境)

既然最新版對monitor整合不友好,我們的目標是部署集群,所以我們就捨棄monitor部署,只部署zeebe集群,

通過官網github:找到cluster,進行本機部署,非常簡單,只需要在cd該資料夾,然後輸入

docker-compose up
命令即可。

(3)只部署集群 (k8s-aliyun環境)

本機沒有問題,那就部署到阿里雲上去吧,因為我們都是用阿里雲的k8s,第一步就遇到困難了,因為沒有找到k8s的yaml檔案,

然後一頓搜,終於找到了組織:zeebe官方論壇在裡面請教了jwulf關於在k8s部署zeebe cluster的問題,回覆很及時。

jwulf給出乙個github位址(又是github!)這裡面包含了如何在k8s上部署的步驟,非常全。

但是,這些都是針對於azure和google cloud的,沒有aliyun,所以有被擋住了。

接下來,給阿里雲提了乙個工單,上面jwulf給的yaml比較全,就是缺了03_storeclass-*的配置檔案,

阿里雲的技術支援給了我乙個基於阿里雲的k8s的yaml,然後我把它跟上面的yaml統一打包放在github:裡面了。

這個經過驗證是完全可以在阿里雲k8s上部署的。

然後,應該皆大歡喜吧,其實不然,我在本機訪問不通這個集群,因為我在阿里雲裡面配置的ingress有問題,

訪問網域名稱報錯,即使ingress已經註解了(這個大家有解決方案可以告訴我,不勝感激)。

nginx.ingress.kubernetes.io/backend-protocol: "grpc"
最後,我在同事的幫助下,為集群建立了乙個slb負載均衡服務,通過負載上的ip,埠號可以呼叫到zeebe集群了。

至此部署結束,以上如流水賬一樣把我的每一步寫下來,如果能幫助到你,那非常榮幸。

swoole學習 3 搭建UDP服務

本文只簡單實現使用swoole搭建udp伺服器例項,具體流程引數配置詳情請參照swoole官網。udp.php 建立server物件 監聽127.0.0.1 9502埠 伺服器型別為upd udp newswoole server 127.0.0.1 9502 swoole process swoo...

機器學習第5章第3節 LMS的學習率退火演算法

模擬退火演算法 於固體退火原理,退火就是講材料加熱後再經過特定速率冷卻,目的是增大晶粒的體積,並且減少晶格的缺陷。材料中的原子原來會停留在使內能有區域性最小值的位置,加熱使能量變大,原子會離開原來的位置,而隨機在其他位置中移動。退火冷卻時速度較慢,徐徐冷卻時粒子漸趨有序,原子有可能找到內能比原先更低...

Nginx學習(3) 作為靜態web服務

即非伺服器動態執行生成的檔案 型別種類 瀏覽器端渲染 html,css,js jpeg,gif,png flv,mpeg 檔案名詞解釋cdn content delivery network 內容分發網路 tcp nopush 壓縮版本 語法 gzip http version 1.0 1.1 ht...