ViewService

在分布式系統(tǒng)中,最常見的場景就是主備架構(gòu)敛助。但是如果主機不幸宕機秒梅,如何正確的通知客戶端當前后端服務(wù)器的狀況成為一個值得研究的問題。本文描述了一種簡單的模型用于解決此問題瘤睹。

背景

以一個分布式的Key-Value數(shù)據(jù)庫為背景升敲。數(shù)據(jù)庫對外提供3個接口

  • Get(key)
  • Put(key, value)
  • Append(key, value)

客戶端對數(shù)據(jù)庫的操作請求必須發(fā)往主機, 只有當主機不可訪問(主機宕機或網(wǎng)絡(luò)問題)時默蚌,備機代替主機冻晤,并且再從集群中選一個新的機器作為備機苇羡。問題來了客戶端如何知道當前誰是主機誰是備機绸吸?

目的

為了保證客戶端與服務(wù)器就誰是主機誰是備機這個問題達成共識。

整體架構(gòu)

為了解決這個問題设江,我們在Server和Clint中間加入一個ViewServer锦茁。viewserver的作用相當于一個中介。舉個例子叉存,當客戶端想要執(zhí)行Put操作時码俩,需要先向viewserver詢問當前的Primary是誰,隨后客戶端根據(jù)viewserver的回復(fù)將Put請求發(fā)到相應(yīng)的server歼捏。

http://upload-images.jianshu.io/upload_images/919414-1e37130d61aeb92c.jpg?imageMogr2/auto-orient/strip

View

viewserver返回給客戶端的信息需要包含至少3條信息:

  1. 當前主機是誰
  2. 當前備機是誰
  3. 當前狀態(tài)的版本號我們將這3個信息稱為viewserver的當前View稿存。
    typedef struct View {
        Viewnum int
        Primary string
        Backup string
    }

Server

在多個server中,只有一個主機瞳秽,一個備機瓣履,其余的server都處于空閑狀態(tài)。所有的server都需要每隔一段時間向viewserver發(fā)送Ping消息练俐,以證明自己還活著袖迎。并且通過Ping的返回值,得到當前viewserver認為的主機和備機是誰。這樣燕锥,如果主機和備機都正常辜贵,在一段時間之后,后端server都會有一致的主機和備機归形。

Client

在操作后端server之前托慨,先訊問viewserver當前主機是誰.

ViewService

viewserver的功能比較復(fù)雜,主要負責:

  1. 回復(fù)客戶端當前View
  2. 檢測后端的server的存活情況
  3. 保證當前主機得到最新的View

在檢測后端server存活情況時连霉,有幾種情況

  1. 主機Primary失聯(lián)
  2. 備機Backup失聯(lián)
  3. 空閑機器失聯(lián)當檢測到主機或者備機失聯(lián)時榴芳,viewserver應(yīng)該對當前View做調(diào)整。

如果主機失聯(lián)跺撼,則把備機選做主機窟感,然后從空間機器中挑選一個作為備機。如果備機失聯(lián)歉井,只從空閑機器中選擇一個作為備機即可柿祈。但是,這兩種情況都需要對View的版本號進行增加哩至。這個View版本號只有后端server關(guān)心躏嚎,客戶端只關(guān)心當前主機。加入這個版本號的目的菩貌,主要是為了確保當前主機得到了最新的View卢佣。比如備機的更換會需要主機向備機做數(shù)據(jù)拷貝,如果主機得不到這個消息箭阶,整個主備系統(tǒng)就失效了虚茶。

http://upload-images.jianshu.io/upload_images/919414-7f3b436e148802f7.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

上圖描述了兩臺server與viewserver之間的通信.每次server端Ping需要包含一個參數(shù),用于表示當前這個server所了解到了View版本號.

  1. 在初始狀態(tài)仇参,server1向viewserver發(fā)送Ping嘹叫,并且用0做為參數(shù).由于初始狀態(tài)viewserver還沒有選擇主機和備機,所以先到先得诈乒,選擇server1為主機.于是返回給server1的View為[server1, NULL, 1], 表示當前主機為server1罩扇, 備機為NULL, 望的到的版本號為1(希望一段時間后當前的主機Primary以這個新版本號發(fā)起Ping).
  2. server2此時加入了集群,向viewserver發(fā)送了Ping. 由于server2與server1沒有聯(lián)系怕磨,所以Ping的參數(shù)還是用0喂饥,表示這是新加入的機器.雖然此時viewserver發(fā)現(xiàn)又有了一臺機器加入,并且當前只有主機肠鲫,沒有備機员帮,但是還不能選擇server2做為備機.因為server1還沒有用1做為參數(shù)發(fā)起Ping, 說明viewserver當前的這個View(主機為server1,備機為NULL)可能還沒有被當前主機(server1)收到.因此返回給server2的View為[server1, NULL, 1].
  3. server1順利收到viewserver返回的View,得知viewserver想要版本號為1的Ping, 于是隔一個PingInerval再向viewserver發(fā)起Ping滩届,同時以1為參數(shù). viewserver順利收到這個Ping, 發(fā)現(xiàn)正是自己希望得到的(當前主機以新版本號發(fā)起的Ping), 并且了解到一個事實:當前主機server1已經(jīng)知道了當前最新的主備情況.于是viewserver將View的版本號更新.返回給server1[server1, NULL, 2].
  4. server2在一個PingInterval后再次向viewser發(fā)起Ping, 因為之前一次Ping返回的ViewNum為1, 因此用1為參數(shù).當viewserver順利收到Ping時集侯,由于viewserver知道當前主機server1以經(jīng)獲得了它目前保存的這個狀態(tài)被啼,因此將server2選為備機, 構(gòu)成了一個新的狀態(tài)(主機為server1, 備機為server2), 這個狀態(tài)還沒有任何server知道, 當前的主機server1顯然也不知道.因此ViewNum不能更新.于是返回[server1, server2, 2]給server2.
  5. server1向viewserver發(fā)起Ping(2), viewserver通過這個Ping得知當前主機server1以經(jīng)獲得了自己最新的狀態(tài).然后server1失聯(lián).
  6. server2向viewserver發(fā)起Ping(2)在長期沒有的到server1的Ping后棠枉,viewserver會認為server1以經(jīng)不能繼續(xù)對外提供服務(wù)了浓体,于是選擇備機server2做為主機,如果有其他空閑機器辈讶,可以從中選一個做為新的備機.viewserver之所以選擇server2做為備機是因為確定server2可以萬全代替以經(jīng)失聯(lián)的server1, 因為server2做為備機這個信息server1以經(jīng)收到了命浴,確保server2的狀態(tài)與server1相同是server1的工作,比如主機會向備機發(fā)送數(shù)據(jù)做數(shù)據(jù)同步.

存在的問題

If the view service has not yet received an acknowledgment for the current view from the primary of the current view, the view service should not change viewseven ifit thinks that the primary or backup has died. That is, the view service may not proceed from view X to view X+1 if it has not received a Ping(X) from the primary of view X.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贱除,一起剝皮案震驚了整個濱河市生闲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌月幌,老刑警劉巖碍讯,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扯躺,居然都是意外死亡捉兴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門录语,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倍啥,“玉大人,你說我怎么就攤上這事澎埠∷渎疲” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵蒲稳,是天一觀的道長氮趋。 經(jīng)常有香客問我,道長弟塞,這世上最難降的妖魔是什么凭峡? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任拙已,我火速辦了婚禮决记,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倍踪。我一直安慰自己系宫,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布建车。 她就那樣靜靜地躺著扩借,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缤至。 梳的紋絲不亂的頭發(fā)上潮罪,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音,去河邊找鬼嫉到。 笑死沃暗,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的何恶。 我是一名探鬼主播孽锥,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼细层!你這毒婦竟也來了惜辑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤疫赎,失蹤者是張志新(化名)和其女友劉穎盛撑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捧搞,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡撵彻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了实牡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陌僵。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖创坞,靈堂內(nèi)的尸體忽然破棺而出碗短,到底是詐尸還是另有隱情,我是刑警寧澤题涨,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布偎谁,位于F島的核電站,受9級特大地震影響纲堵,放射性物質(zhì)發(fā)生泄漏巡雨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一席函、第九天 我趴在偏房一處隱蔽的房頂上張望铐望。 院中可真熱鬧,春花似錦茂附、人聲如沸正蛙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乒验。三九已至,卻和暖如春蒂阱,著一層夾襖步出監(jiān)牢的瞬間锻全,已是汗流浹背狂塘。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鳄厌,地道東北人睹耐。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像部翘,于是被迫代替她去往敵國和親硝训。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理新思,服務(wù)發(fā)現(xiàn)窖梁,斷路器,智...
    卡卡羅2017閱讀 134,697評論 18 139
  • 部分內(nèi)容轉(zhuǎn)載自搜狗百科 cmd是command的縮寫.即命令提示符(CMD)夹囚,是在OS / 2 纵刘, Windows...
    青冥之上閱讀 2,394評論 0 24
  • win7 cmd管理員權(quán)限設(shè)置 net localgroup administrators 用戶名 /add 把“...
    f675b1a02698閱讀 5,216評論 0 11
  • 你必須如同親吻 你的愛人那般的 親吻一棵雨中的樹 親吻她繁茂的枝葉 如同她綠色的靈魂 清新而濕潤的氣息 會穿透你的...
    他叫我七月閱讀 257評論 6 4
  • 我路過你的路過,剛好看見的生活 生活如此愜意
    閩洞秋沙閱讀 158評論 0 0