宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見(jiàn)問(wèn)題
產(chǎn)品動(dòng)態(tài)
精選推薦

ViewService——一種保證客戶(hù)端與服務(wù)端同步的方法

管理 管理 編輯 刪除

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

背景

以一個(gè)分布式的Key-Value數(shù)據(jù)庫(kù)為背景。數(shù)據(jù)庫(kù)對(duì)外提供3個(gè)接口Get(key)Put(key, value)Append(key, value)客戶(hù)端對(duì)數(shù)據(jù)庫(kù)的操作請(qǐng)求必須發(fā)往主機(jī), 只有當(dāng)主機(jī)不可訪問(wèn)(主機(jī)宕機(jī)或網(wǎng)絡(luò)問(wèn)題)時(shí),備機(jī)代替主機(jī),并且再?gòu)募褐羞x一個(gè)新的機(jī)器作為備機(jī)。問(wèn)題來(lái)了 客戶(hù)端如何知道當(dāng)前誰(shuí)是主機(jī)誰(shuí)是備機(jī)?

目的

為了保證客戶(hù)端與服務(wù)器就誰(shuí)是主機(jī)誰(shuí)是備機(jī)這個(gè)問(wèn)題達(dá)成共識(shí)。

整體架構(gòu)

1e969202303171822408279.png

為了解決這個(gè)問(wèn)題,我們?cè)赟erver和Clint中間加入一個(gè)ViewServer。viewserver的作用相當(dāng)于一個(gè)中介。舉個(gè)例子,當(dāng)客戶(hù)端想要執(zhí)行Put操作時(shí),需要先向viewserver詢(xún)問(wèn)當(dāng)前的Primary是誰(shuí),隨后客戶(hù)端根據(jù)viewserver的回復(fù)將Put請(qǐng)求發(fā)到相應(yīng)的server。

View

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

1. 當(dāng)前主機(jī)是誰(shuí)

2. 當(dāng)前備機(jī)是誰(shuí)

3. 當(dāng)前狀態(tài)的版本號(hào)

我們將這3個(gè)信息稱(chēng)為viewserver的當(dāng)前View。

typedef struct View {
  Viewnum int
  Primary string
  Backup string
}

Server

在多個(gè)server中,只有一個(gè)主機(jī),一個(gè)備機(jī),其余的server都處于空閑狀態(tài)。所有的server都需要每隔一段時(shí)間向viewserver發(fā)送Ping消息,以證明自己還活著。并且通過(guò)Ping的返回值,得到當(dāng)前viewserver認(rèn)為的主機(jī)和備機(jī)是誰(shuí)。這樣,如果主機(jī)和備機(jī)都正常,在一段時(shí)間之后,后端server都會(huì)有一致的主機(jī)和備機(jī)。

Client

在操作后端server之前,先訊問(wèn)viewserver當(dāng)前主機(jī)是誰(shuí).

ViewServer

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

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

在檢測(cè)后端server存活情況時(shí),有幾種情況

  1. 主機(jī)Primary失聯(lián)
  2. 備機(jī)Backup失聯(lián)
  3. 空閑機(jī)器失聯(lián)

當(dāng)檢測(cè)到主機(jī)或者備機(jī)失聯(lián)時(shí),viewserver應(yīng)該對(duì)當(dāng)前View做調(diào)整。如果主機(jī)失聯(lián),則把備機(jī)選做主機(jī),然后從空間機(jī)器中挑選一個(gè)作為備機(jī)。如果備機(jī)失聯(lián),只從空閑機(jī)器中選擇一個(gè)作為備機(jī)即可。但是,這兩種情況都需要對(duì)View的版本號(hào)進(jìn)行增加。這個(gè)View版本號(hào)只有后端server關(guān)心,客戶(hù)端只關(guān)心當(dāng)前主機(jī)。加入這個(gè)版本號(hào)的目的,主要是為了確保當(dāng)前主機(jī)得到了最新的View。比如備機(jī)的更換會(huì)需要主機(jī)向備機(jī)做數(shù)據(jù)拷貝,如果主機(jī)得不到這個(gè)消息,整個(gè)主備系統(tǒng)就失效了。

6ff70202303171824091172.png

上圖描述了兩臺(tái)server與viewserver之間的通信.
每次server端Ping需要包含一個(gè)參數(shù),用于表示當(dāng)前這個(gè)server所了解到了View版本號(hào).
1. 在初始狀態(tài),server1向viewserver發(fā)送Ping,并且用0做為參數(shù).由于初始狀態(tài)viewserver還沒(méi)有選擇主機(jī)和備機(jī),所以先到先得,選擇server1為主機(jī).于是返回給server1的View為[server1, NULL, 1], 表示當(dāng)前主機(jī)為server1, 備機(jī)為NULL, 望的到的版本號(hào)為1(希望一段時(shí)間后當(dāng)前的主機(jī)Primary以這個(gè)新版本號(hào)發(fā)起Ping).
2. server2此時(shí)加入了集群,向viewserver發(fā)送了Ping. 由于server2與server1沒(méi)有聯(lián)系,所以Ping的參數(shù)還是用0,表示這是新加入的機(jī)器.雖然此時(shí)viewserver發(fā)現(xiàn)又有了一臺(tái)機(jī)器加入,并且當(dāng)前只有主機(jī),沒(méi)有備機(jī),但是還不能選擇server2做為備機(jī).因?yàn)閟erver1還沒(méi)有用1做為參數(shù)發(fā)起Ping, 說(shuō)明viewserver當(dāng)前的這個(gè)View(主機(jī)為server1,備機(jī)為NULL)可能還沒(méi)有被當(dāng)前主機(jī)(server1)收到.因此返回給server2的View為[server1, NULL, 1].
3. server1順利收到viewserver返回的View,得知viewserver想要版本號(hào)為1的Ping, 于是隔一個(gè)PingInerval再向viewserver發(fā)起Ping,同時(shí)以1為參數(shù). viewserver順利收到這個(gè)Ping, 發(fā)現(xiàn)正是自己希望得到的(當(dāng)前主機(jī)以新版本號(hào)發(fā)起的Ping), 并且了解到一個(gè)事實(shí):當(dāng)前主機(jī)server1已經(jīng)知道了當(dāng)前最新的主備情況.于是viewserver將View的版本號(hào)更新.返回給server1[server1, NULL, 2].
4. server2在一個(gè)PingInterval后再次向viewser發(fā)起Ping, 因?yàn)橹耙淮蜳ing返回的ViewNum為1, 因此用1為參數(shù).當(dāng)viewserver順利收到Ping時(shí),由于viewserver知道當(dāng)前主機(jī)server1以經(jīng)獲得了它目前保存的這個(gè)狀態(tài),因此將server2選為備機(jī), 構(gòu)成了一個(gè)新的狀態(tài)(主機(jī)為server1, 備機(jī)為server2), 這個(gè)狀態(tài)還沒(méi)有任何server知道, 當(dāng)前的主機(jī)server1顯然也不知道.因此ViewNum不能更新.于是返回[server1, server2, 2]給server2.
5. server1向viewserver發(fā)起Ping(2), viewserver通過(guò)這個(gè)Ping得知當(dāng)前主機(jī)server1以經(jīng)獲得了自己最新的狀態(tài).然后server1失聯(lián).
6. server2向viewserver發(fā)起Ping(2)
在長(zhǎng)期沒(méi)有的到server1的Ping后,viewserver會(huì)認(rèn)為server1以經(jīng)不能繼續(xù)對(duì)外提供服務(wù)了,于是選擇備機(jī)server2做為主機(jī),如果有其他空閑機(jī)器,可以從中選一個(gè)做為新的備機(jī).viewserver之所以選擇server2做為備機(jī)是因?yàn)榇_定server2可以萬(wàn)全代替以經(jīng)失聯(lián)的server1, 因?yàn)閟erver2做為備機(jī)這個(gè)信息server1以經(jīng)收到了,確保server2的狀態(tài)與server1相同是server1的工作,比如主機(jī)會(huì)向備機(jī)發(fā)送數(shù)據(jù)做數(shù)據(jù)同步.

存在的問(wèn)題

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 views even if it 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.


請(qǐng)登錄后查看

CRMEB-慕白寒窗雪 最后編輯于2023-03-17 18:25:23

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點(diǎn)贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無(wú)簡(jiǎn)介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
998
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見(jiàn)問(wèn)題 產(chǎn)品動(dòng)態(tài) 精選推薦 首頁(yè)頭條 首頁(yè)動(dòng)態(tài) 首頁(yè)推薦
取 消 確 定
回復(fù)
回復(fù)
問(wèn)題:
問(wèn)題自動(dòng)獲取的帖子內(nèi)容,不準(zhǔn)確時(shí)需要手動(dòng)修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請(qǐng)輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊(cè)

切換手機(jī)號(hào)登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊(cè)
暫不綁定
CRMEB客服

CRMEB咨詢(xún)熱線 咨詢(xún)熱線

400-8888-794

微信掃碼咨詢(xún)

CRMEB開(kāi)源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服