ViewService

在分布式系统中,最常见的场景就是主备架构。但是如果主机不幸宕机,如何正确的通知客户端当前后端服务器的状况成为一个值得研究的问题。本文描述了一种简单的模型用于解决此问题。

背景

以一个分布式的Key-Value数据库为背景。数据库对外提供3个接口

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

客户端对数据库的操作请求必须发往主机, 只有当主机不可访问(主机宕机或网络问题)时,备机代替主机,并且再从集群中选一个新的机器作为备机。问题来了客户端如何知道当前谁是主机谁是备机?

目的

为了保证客户端与服务器就谁是主机谁是备机这个问题达成共识。

整体架构

为了解决这个问题,我们在Server和Clint中间加入一个ViewServer。viewserver的作用相当于一个中介。举个例子,当客户端想要执行Put操作时,需要先向viewserver询问当前的Primary是谁,随后客户端根据viewserver的回复将Put请求发到相应的server。

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

View

viewserver返回给客户端的信息需要包含至少3条信息:

  1. 当前主机是谁
  2. 当前备机是谁
  3. 当前状态的版本号我们将这3个信息称为viewserver的当前View。
    typedef struct View {
        Viewnum int
        Primary string
        Backup string
    }

Server

在多个server中,只有一个主机,一个备机,其余的server都处于空闲状态。所有的server都需要每隔一段时间向viewserver发送Ping消息,以证明自己还活着。并且通过Ping的返回值,得到当前viewserver认为的主机和备机是谁。这样,如果主机和备机都正常,在一段时间之后,后端server都会有一致的主机和备机。

Client

在操作后端server之前,先讯问viewserver当前主机是谁.

ViewService

viewserver的功能比较复杂,主要负责:

  1. 回复客户端当前View
  2. 检测后端的server的存活情况
  3. 保证当前主机得到最新的View

在检测后端server存活情况时,有几种情况

  1. 主机Primary失联
  2. 备机Backup失联
  3. 空闲机器失联当检测到主机或者备机失联时,viewserver应该对当前View做调整。

如果主机失联,则把备机选做主机,然后从空间机器中挑选一个作为备机。如果备机失联,只从空闲机器中选择一个作为备机即可。但是,这两种情况都需要对View的版本号进行增加。这个View版本号只有后端server关心,客户端只关心当前主机。加入这个版本号的目的,主要是为了确保当前主机得到了最新的View。比如备机的更换会需要主机向备机做数据拷贝,如果主机得不到这个消息,整个主备系统就失效了。

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

上图描述了两台server与viewserver之间的通信.每次server端Ping需要包含一个参数,用于表示当前这个server所了解到了View版本号.

  1. 在初始状态,server1向viewserver发送Ping,并且用0做为参数.由于初始状态viewserver还没有选择主机和备机,所以先到先得,选择server1为主机.于是返回给server1的View为[server1, NULL, 1], 表示当前主机为server1, 备机为NULL, 望的到的版本号为1(希望一段时间后当前的主机Primary以这个新版本号发起Ping).
  2. server2此时加入了集群,向viewserver发送了Ping. 由于server2与server1没有联系,所以Ping的参数还是用0,表示这是新加入的机器.虽然此时viewserver发现又有了一台机器加入,并且当前只有主机,没有备机,但是还不能选择server2做为备机.因为server1还没有用1做为参数发起Ping, 说明viewserver当前的这个View(主机为server1,备机为NULL)可能还没有被当前主机(server1)收到.因此返回给server2的View为[server1, NULL, 1].
  3. server1顺利收到viewserver返回的View,得知viewserver想要版本号为1的Ping, 于是隔一个PingInerval再向viewserver发起Ping,同时以1为参数. viewserver顺利收到这个Ping, 发现正是自己希望得到的(当前主机以新版本号发起的Ping), 并且了解到一个事实:当前主机server1已经知道了当前最新的主备情况.于是viewserver将View的版本号更新.返回给server1[server1, NULL, 2].
  4. server2在一个PingInterval后再次向viewser发起Ping, 因为之前一次Ping返回的ViewNum为1, 因此用1为参数.当viewserver顺利收到Ping时,由于viewserver知道当前主机server1以经获得了它目前保存的这个状态,因此将server2选为备机, 构成了一个新的状态(主机为server1, 备机为server2), 这个状态还没有任何server知道, 当前的主机server1显然也不知道.因此ViewNum不能更新.于是返回[server1, server2, 2]给server2.
  5. server1向viewserver发起Ping(2), viewserver通过这个Ping得知当前主机server1以经获得了自己最新的状态.然后server1失联.
  6. server2向viewserver发起Ping(2)在长期没有的到server1的Ping后,viewserver会认为server1以经不能继续对外提供服务了,于是选择备机server2做为主机,如果有其他空闲机器,可以从中选一个做为新的备机.viewserver之所以选择server2做为备机是因为确定server2可以万全代替以经失联的server1, 因为server2做为备机这个信息server1以经收到了,确保server2的状态与server1相同是server1的工作,比如主机会向备机发送数据做数据同步.

存在的问题

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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 部分内容转载自搜狗百科 cmd是command的缩写.即命令提示符(CMD),是在OS / 2 , Windows...
    青冥之上阅读 2,351评论 0 24
  • win7 cmd管理员权限设置 net localgroup administrators 用户名 /add 把“...
    f675b1a02698阅读 4,983评论 0 11
  • 你必须如同亲吻 你的爱人那般的 亲吻一棵雨中的树 亲吻她繁茂的枝叶 如同她绿色的灵魂 清新而湿润的气息 会穿透你的...
    他叫我七月阅读 249评论 6 4
  • 我路过你的路过,刚好看见的生活 生活如此惬意
    闽洞秋沙阅读 147评论 0 0