日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

隨著移動互聯(lián)網(wǎng)技術的快速發(fā)展,在新業(yè)務、新領域、新場景的驅(qū)動下,基于傳統(tǒng)大型機的服務部署方式,不僅難以適應快速增長的業(yè)務需求,而且持續(xù)耗費高昂的成本,從而使得各大生產(chǎn)廠商以及企業(yè)只能望洋興嘆。此時,分布式系統(tǒng)的出現(xiàn)無疑給大家?guī)砹诵┰S振奮。而后隨著大數(shù)據(jù)、區(qū)塊鏈技術以及云計算技術的蓬勃發(fā)展,將分布式系統(tǒng)推向新的高潮。

據(jù)不完全統(tǒng)計,截止目前,幾乎在全球的任何一家互聯(lián)網(wǎng)企業(yè),無論規(guī)模大小,或多或少都有使用到分布式技術。基于不同的業(yè)務場景以及實現(xiàn)方案,有些可能注重計算,有些或許注重存儲。無論是基于具體哪種場景、模型,無不表明分布式系統(tǒng)在企業(yè)技術發(fā)展過程中的重要性以及必要性。

在本文中,我將主要圍繞 Etcd 這一個分布式 K-V 數(shù)據(jù)庫為主,探討一下分布式存儲技術的核心原理以及源碼實現(xiàn)。

首先,我們來了解下什么是Etcd ?

Etcd 是一個分布式的,一致的 Key-Value 存儲,主要用于共享配置和服務發(fā)現(xiàn)。Etcd由 CoreOS 開發(fā)并維護,通過 Raft 一致性算法處理日志復制以保證強一致性。Raft 是一個來自 Stanford 的新的一致性算法,適用于分布式系統(tǒng)的日志復制,Raft 通過選舉的方式來實現(xiàn)一致性,在 Raft 中,任何一個節(jié)點都可能成為 Leader。google 的容器集群管理系統(tǒng)Kubernetes、開源 PaaS 平臺 Cloud Foundry 以及 CoreOS 的 Fleet 均已廣泛使用Etcd。

正如上述所述,Etcd 是一個 K-V 存儲,其 Etcd Server 采用樹形的結(jié)構(gòu)來組織儲存數(shù)據(jù),類似 linux 的文件系統(tǒng),其也具備目錄和文件的分層結(jié)構(gòu),我們稱之為 Nodes 。下面我們了解下 Etcd Key 的相關操作以及目錄情況,具體如下所示:

[administrator@JAVALangOutOfMemory ~ ]% Docker exec etcd /bin/sh -c "/usr/local/bin/etcd --version"
etcd Version: 3.3.8
Git SHA: 33245c6b5
Go Version: go1.9.7
Go OS/Arch: linux/amd64
[administrator@JavaLangOutOfMemory ~ ]% docker exec etcd /bin/sh -c "export ETCDCTL_API=3 ; /usr/local/bin/etcdctl endpoint health"
127.0.0.1:2379 is healthy: successfully committed proposal: took = 3.0925ms
[administrator@JavaLangOutOfMemory ~ ]% docker exec etcd /bin/sh -c "export ETCDCTL_API=3 ; /usr/local/bin/etcdctl put /luga/foo /luga/bar"
OK
[administrator@JavaLangOutOfMemory ~ ]% docker exec etcd /bin/sh -c "export ETCDCTL_API=3 ; /usr/local/bin/etcdctl get / --prefix "
/luga/foo
/luga/bar

基于上述的命令行操作,我們可以看出,當創(chuàng)建某個 Key 時,若不指定路徑,則默認創(chuàng)建到根目錄 “/” 下面,若指定目錄的話,則創(chuàng)建的 Key 位于所指定的目錄下。

我們現(xiàn)在了解下 Etcd 的架構(gòu),具體簡要架構(gòu)如下圖所示:

分布式系統(tǒng) Etcd 解析

 

基于上述架構(gòu)圖,基于分層的形式,我們可以將 Etcd 分為以下4層,依次為表現(xiàn)層、網(wǎng)絡層、應用層、數(shù)據(jù)層。具體如下:

表現(xiàn)層

此層級主要包含相關命令行操作工具,以及 Restful 的 Api。客戶端可以通過命令行或者是 Restful Api 的方式與 Etcd 集群進行通信。

網(wǎng)絡層

此層級主要包含代理和 SDK ,ETCD 提供了基于三種協(xié)議的通信方式,分別為 HTTP、TCP以及 gRPC等。

應用層

應用層主要包含Raft協(xié)議、復制狀態(tài)機、多版本并發(fā)控、Watch、K-V 數(shù)據(jù)存儲、分布式事務等核心功能。強一致性算法的具體實現(xiàn),是Etcd 的核心算法。

數(shù)據(jù)層

數(shù)據(jù)層主要涉及兩部分內(nèi)容:一部分為內(nèi)存數(shù)據(jù),一部分為磁盤數(shù)據(jù)。其中內(nèi)存中維護的數(shù)據(jù)主要是 Key 與 Revision 之間的 B-tree 索引。磁盤里面存儲的文件有三部分,一部分就是核心的數(shù)據(jù)文件,在 Snap下面的 db 文件中保存,還有就是 Raft 協(xié)議依賴的Wal 日志文件 和 Snap 快照文件。

針對架構(gòu)圖中的關鍵組件進行簡要描述如下:

HTTP Server:接受客戶端發(fā)出的 API 請求以及其它 Etcd 節(jié)點的同步與心跳信息請求。

Store:用于處理 Etcd 支持的各類功能的事務,包括數(shù)據(jù)索引、節(jié)點狀態(tài)變更、監(jiān)控與反饋、事件處理與執(zhí)行等等,是 Etcd 對用戶提供的大多數(shù) API 功能的具體實現(xiàn)。

Raft:強一致性算法的具體實現(xiàn),是 Etcd 的核心算法。

WAL(Write Ahead Log,預寫式日志):是 Etcd 的數(shù)據(jù)存儲方式,Etcd 會在內(nèi)存中儲存所有數(shù)據(jù)的狀態(tài)以及節(jié)點的索引,此外,Etcd 還會通過 WAL 進行持久化存儲。WAL 中,所有的數(shù)據(jù)提交前都會事先記錄日志。其中,Snapshot 是為了防止數(shù)據(jù)過多而進行的狀態(tài)快照;而 Entry 則表示存儲的具體日志內(nèi)容。

通常情況下,一個完整的工作流主要涉及以下活動:一個用戶的請求發(fā)送過來,會經(jīng)由 HTTP Server 轉(zhuǎn)發(fā)給 Store 進行具體的事務處理,如果涉及到節(jié)點數(shù)據(jù)的修改,則交給 Raft 模塊進行狀態(tài)的變更、日志的記錄,然后再同步給別的 Etcd 節(jié)點以確認數(shù)據(jù)提交,最后進行數(shù)據(jù)的提交,再次同步。

那么,Etcd 主要應用于哪些場景呢?

通過官網(wǎng)定義,Etcd 是一個高可用強一致性的鍵值數(shù)據(jù)庫在很多分布式系統(tǒng)架構(gòu)中得到了廣泛的應用,其最經(jīng)典的使用場景就是服務發(fā)現(xiàn)。那么有人問了,Zookeeper不香嗎?基于 Zookeeper 當前的業(yè)務使用場景,結(jié)合微服務體系及 云原生K8S 生態(tài)支持層面,綜合對比分析, Zookeeper 仍存在以下相關缺陷,具體如下:

1、復雜性,Zookeeper 基于Paxos 強一致性算法也以復雜難懂而聞名于世,除此之外,ZooKeeper 的使用也比較復雜,需要安裝客戶端,而且官方只提供了 Java 和 C 兩種語言的接口,其移植性及可擴展性有限。

2、生態(tài)發(fā)展滯后,無論是基于項目版本的更新還是所擁抱的生態(tài),都表現(xiàn)的差強人意,尤其是在容器化生態(tài)中。

3、笨重,Zookeeper 基于Java 語言開發(fā),面向企業(yè)級應用,故基于Java 生態(tài)體系時不時會引入大量的依賴,從而使得維護交往笨重。

相比較而言,Etcd 雖作為后起之秀,但其已經(jīng)融入云原生生態(tài)領域,并且基于 Go 語言開發(fā),高性能,基于 HTTP 作為接口使用簡單、方便,使用 Raft 算法保證強一致性讓用戶易于理解。除此,基于 Etcd 所默認的持久化機制與安全機制使得其在云原生生態(tài)領域能夠得到進一步的發(fā)展。

為什么 Etcd 在服務發(fā)現(xiàn)領域能夠獨占鰲頭呢?具體主要涉及以下:

1、強一致性、高可用。基于 Raft 算法的 Etcd 就是一個強一致性高可用的服務存儲目錄。

2、注冊服務和監(jiān)控服務健康狀態(tài)的機制。用戶可以在 Eetcd 中注冊服務,并且對注冊的服務設置 key TTL,定時保持服務的心跳以達到監(jiān)控健康狀態(tài)的效果。

3、查找和連接服務的機制。通過在 Etcd 指定的主題(由服務名稱構(gòu)成的服務目錄)下注冊的服務也能在對應的主題下查找到。

那么,Etcd 如何保證數(shù)據(jù)一致性呢?

首先,Etcd 使用 Raft 協(xié)議來維護 Cluster 內(nèi)各個 Nodes 狀態(tài)的一致性。也就是說,Etcd Cluster 是一個分布式系統(tǒng),由多個 Nodes 相互通信構(gòu)成整體對外服務,每個 Node 都存儲了完整的數(shù)據(jù),并且通過 Raft 協(xié)議保證每個 Node 維護的數(shù)據(jù)是一致的。

其次,Etcd Cluster 中的每個 Node 都維護了一個狀態(tài)機,并且任意時刻,Cluster 中至多存在一個有效的主節(jié)點,即:Leader Node。由 Leader 處理所有來自客戶端寫操作,通過 Raft 協(xié)議保證寫操作對狀態(tài)機的改動會可靠的同步到其他 Follower Nodes。具體可參考下 Etcd 算法機制,如下所示:

分布式系統(tǒng) Etcd 解析

 

基于數(shù)據(jù)一致性問題,分布式系統(tǒng)中常見的三種一致性模型:

1、強一致性:當更新操作在某個副本上執(zhí)行成功后,之后所有的讀操作都要能夠獲得最新的數(shù)據(jù)。

2、弱一致性:當更新某數(shù)據(jù)時,用戶讀到最新的數(shù)據(jù)需要一段時間的延遲。

3、最終一致性:它是一種特殊的弱一致性,當某個數(shù)據(jù)更新后,在經(jīng)過一個時間片段,所有后續(xù)的操作能夠獲得新數(shù)據(jù),在這個時間片段內(nèi),數(shù)據(jù)可能是不一致的。

Raft 是分布式領域中的強一致性算法,當其中某個節(jié)點收到客戶端的一組指令時,它必須與其它節(jié)點溝通,以保證所有的節(jié)點以相同的順序收到相同的指令,最終所有的節(jié)點會產(chǎn)生一致的結(jié)果。

如何選舉 Leader 節(jié)點?

針對 Etcd ,Raft 通過『領導選舉機制』選舉出一個 Leader,由它全權(quán)管理日志復制來實現(xiàn)一致性。一個 Raft 集群包含若干個服務器節(jié)點,每一個節(jié)點都有一個唯一標識 ID,并且在任何時刻,每一個服務器節(jié)點都處于下面三個狀態(tài)之一:

1、Leader(領導人):Leader 處理所有的客戶端請求,在通常情況下,系統(tǒng)中只有一個Leader 并且其他節(jié)點都是 Follower。

2、Follower(跟隨者):Follower 不會發(fā)送任何請求,只是簡單地響應來自 Leader

Candidate 的請求,如果一個客戶端與 Follower 聯(lián)系,那么 Follower 會把請求重定向至 Leader。

3、Candidate(候選人):如果 Follower 接收不到來自 Leader 的消息,那么它就會變成 Candidate 并發(fā)起一次選舉,獲得集群中大多數(shù)選票(超過 n/2+1)的候選人將成為新的Leader。

假設 Etcd Cluster 中有 3 個 Node,Cluster 啟動之初并沒有被選舉出的 Leader。此時,Raft 算法使用隨機 Timer 來初始化 Leader 選舉流程。比如說上面 3 個 Node 上都運行了 Timer(每個 Timer 的持續(xù)時間是隨機的),而 Node1 率先完成了 Timer,隨后它就會向其他兩個 Node 發(fā)送成為 Leader 的請求,其他 Node 接收到請求后會以投票回應然后第一個節(jié)點被選舉為 Leader。成為 Leader 后,該 Node 會以固定時間間隔向其他 Node 發(fā)送通知,確保自己仍是 Leader。有些情況下當 Follower 們收不到 Leader 的通知后,比如說 Leader 節(jié)點宕機或者失去了連接,其他 Node 就會重復之前的選舉流程,重新選舉出新的 Leader。具體可參考如下所示:

分布式系統(tǒng) Etcd 解析

 

針對如何判斷寫入是否成功?

Etcd 通常情況下默認為寫入請求被 Leader 處理并分發(fā)給了其他的 “多數(shù)節(jié)點” 后,就是一個成功的寫入。“多數(shù)節(jié)點” 的數(shù)量的計算公式是 Quorum=N/2+1,N 為總結(jié)點數(shù)。也就是說,Etcd 并發(fā)要將數(shù)據(jù)寫入所有節(jié)點才算一次寫,而是寫入 “多數(shù)節(jié)點” 即可。

最后,我們來看下如何確定 Etcd Cluster 的節(jié)點數(shù)?

基于多數(shù)節(jié)點的計算公式,可以簡單理解,Etcd Cluster 推薦最少節(jié)點數(shù)為 3 個,因為 1 和 2 個 Instance 的容錯節(jié)點數(shù)都是 0,一旦有一個節(jié)點宕掉整個集群就不能正常工作了。

進一步的講,當我們需要決定 Etcd Cluster 中 Instances 的數(shù)量時,強烈推薦奇數(shù)數(shù)量的節(jié)點,比如:3、5、7、…等,具體依據(jù)實際的業(yè)務場景進行決策。

因時間有限,源碼解析以及剩余的部分內(nèi)容暫未在本文中詳述,后續(xù)將進行進一步的深入解析。

分享到:
標簽:分布式 系統(tǒng)
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定