github地址:
https://github.com/canezk/MIT-6.824/tree/master/src/viewservice
Part A: The Viewservice
mit-6.824 lab2 文檔
這個(gè)版本實(shí)現(xiàn)的是View Service
(僅供學(xué)習(xí)使用)
系統(tǒng)角色
- View Server (管理集群的節(jié)點(diǎn),控制primary的切換,保證集群只有一個(gè)primary,提升idle為backup,提升backup為primary)
- Primary (store server的集群主節(jié)點(diǎn))
- BackUp (可以理解為slave,需要sync -> Primary,最有一個(gè))
- Idle server (只是和VS ping,合適的時(shí)候提升為backup)
關(guān)于角色切換的說(shuō)明
vs的存在是為了切換primary,保證primary 掛機(jī)之后選擇新的primary,有以下情況
1. primary crash然后reboot,ping VS
> (1) primary為當(dāng)前view的情況,已經(jīng)被ack了(就是primary在down之前,已
經(jīng)知道自己就是當(dāng)前view的primary)
> 這個(gè)時(shí)候,假如有backup,就promote為新的primary,返回給server;同
時(shí),選擇idle隊(duì)列的一個(gè)server為新的backup
> 沒(méi)有backup,那么集群就掛機(jī),由于idle不為空的話一定為保證有backup,所有假如沒(méi)有backup,說(shuō)明集群只有一個(gè)節(jié)點(diǎn),不正常服務(wù)也是對(duì)的
> (2) primary還沒(méi)有ack當(dāng)前的view,那么集群必須等到這個(gè)primary reboot之后才會(huì)正常服務(wù)
2. primary ping
> 更新ttl
3. 非backup ping
> 放到idle隊(duì)列,更新ttl(VS后臺(tái)需要提供任務(wù),定時(shí)清理down掉的idle server)
4. backup ping
> 更新ttl
系統(tǒng)功能
> *內(nèi)存*kv數(shù)據(jù)存儲(chǔ)
view
> view是集群的當(dāng)前視圖,表明集群哪個(gè)節(jié)點(diǎn)是Primary,哪個(gè)是BackUp
節(jié)點(diǎn)狀態(tài)
- active
- recovering
- down
如果down -> active,需要給primary匯報(bào)這個(gè)信息(方法使用過(guò)特殊的ping參數(shù))
tips
> 1. 集群每個(gè)節(jié)點(diǎn)需要在固定時(shí)間間隔之內(nèi)ping VS(View Server的簡(jiǎn)稱)
> 2. 只有三種情況可以更新view,也就是view的number遞增(詳細(xì)參考上面的鏈接)
> 3. 如果primary不能返回ping acknowledges給VS,集群將無(wú)法自動(dòng)恢復(fù) ### 測(cè)試
> cd到viewsercice目錄,執(zhí)行*go test*