ViewService——一种保证客户端与服务端同步的方法

ViewService最新版.zipWindows系统服务(Service)安装卸载管理删除工具 ViewService最新版 Windows系统服务(Service)安装卸载管理删除工具Windows系统服务(Service)安装卸载管理删除工具 ViewService最新版Windows系统服务(Service)安装卸载管理删除工具 ViewService最新版 立即下载

原文链接:https://segmentfault.com/a/1190000004846986

简介

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

背景

以一个分布式的Key-Value数据库为背景。数据库对外提供3个接口
Get(key)
Put(key, value)
Append(key, value)
客户端对数据库的操作请求必须发往主机, 只有当主机不可访问(主机宕机或网络问题)时,备机代替主机,并且再从集群中选一个新的机器作为备机。
问题来了 客户端如何知道当前谁是主机谁是备机?

目的

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

整体架构


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

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当前主机是谁.

ViewServer

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

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

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

  1. 主机Primary失联
  2. 备机Backup失联
  3. 空闲机器失联

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



上图描述了两台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 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.

ViewService创建winservice服务的工具 ViewService创建winservice服务的工具,里面具有启动服务,停止服务、创建服务、删除服务功能。 立即下载

相关推荐

viewservice

该程序可对windows系统服务进行管理 还可删除windows系统服务

view,control,service,dao,model层的关系及作用(实用)

 原文出处:https://blog.youkuaiyun.com/zdwzzu2006/article/details/6086829 view层:    结合control层,显示前台页面。 control层:业务模块流程控制,调用service层接口。 service层:业务操作实现类,调用dao层接口。 dao层:     数据业务处理,持久化操作 model层: pojo,OR maping,...

chelen_jak的专栏 1万+

ViewService 删除Windows服务

非常的好用。可以轻松地卸载、删除、启动、停止等等Windows服务,查看服务注册表、查看服务文件等。

推荐开源项目:ViewServer - 让你的Android应用调试更轻松

推荐开源项目:ViewServer - 让你的Android应用调试更轻松 1、项目介绍 ViewServer是一个轻量级的Android库,它使得在旧版Android系统中能够利用HierarchyViewer工具进行界面检查和调试变得可能。虽然在新版Android中已有替代工具Layout Inspector,但对于还在使用较早Android版本的开发者来说,ViewServer仍是一项实用的...

gitblog_00032的博客 443

ViewService - windows服务管理器

ViewService是一款windows服务管理器,可以启动、停止系统服务,如果遇到流氓程序添加的服务,还可以用它来删除流氓服务进程。

开启view server的方法

开启view server的方法 包含文件setpropex 亲测有效 内含详细的步骤,但是可能只支持部分机型 楼主用的是4.2的华为HWY516是可以的

使用ViewServer检测布局复杂性

ViewServer.java : /*  * Copyright (C) 2011 The Android Open Source Project  *  * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance

kejia90的专栏 604

ViewServer-解决View Hierarchy不能启动

解决The standalone version of hieararchyviewer is deprecated.问题的文件,有源码,也有打好的apk文件

viewserver打开关闭和状态查看

打开View Server:adb shell service call window 1 i32 4939关闭View Server:adb shell service call window 2 i32 4939查询View Server状态:adb shell service call window 3若返回值是:Result: Parcel(00000000 0000...

weixin_34315665的博客 460

Android代码-ViewServer

ViewServer is a simple class you can use in your Android application to use the HierarchyViewer inspection tool. ViewServer requires the Android SDK r12 or higher. http://developer.android.com/sdk/index.html Quick Start Verify that you need this library(newer versions of Android don't) If you do need this library then follow these directions: Include the ViewServer library(easy directions found here) Your application must require the INTERNET permission The recommended way to use this API is

ViewServer

需要在manifest中配置网络权限 onCreate加入ViewServer.get(this).addWindow(this);

ViewServer源码分析

ViewServer源码分析

Javasus的专栏 2640

Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包

联网情况下在命令终端CMD中输入“pip install numpy”即可自动安装,pandas和matplotlib同理一样方法进行自动安装。 工作的电脑不能上外网,所以不能通过直接输入pip命令来安装。 环境:电脑上已经安装了Python(没有安装的请参考其他教程)。 Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包的步骤如下: ...

dayou7738的博客 4944

View体系之四大组件——Service详解

 View体系之四大组件——Service详解        在学习Service之前,我们先提出以下几个问题:        1、什么是Service?Service的作用是什么?        2、Service有哪几种状态,其生命周期是什么?        3、Service如何使用?(同一进程/跨进程)        4、Service如何保活(进程保活)?        5、对Inten...

大喵爱吃鱼的博客 1367

STM32H7+LAN8720A之ETH与LWIP配置问题(End)

开篇介绍 由于项目中需要使用到STM32H7系列的芯片,且该系列无法移植ST的标准库,只能使用ST的HAL库,通过STM32Cube生成HAL库的基本代码。在项目开发中需要使用到STM32板载的ETH口,在简化的四层模型中充当着数据链路层的角色,我们只需添加PHY并配置好IP,即可实现基本的TCP主从机通信、UDP通信等等。 一、激光雷达3i-T1 由于使用了一款只具有网口通信的单线激光雷达,其具有TCP和UDP方式的通信方式,为了避免进行TCP中的socket报文解析和繁琐的通信握手过程,我们首先将雷达配

weixin_42024702的博客 1万+

基于STM32的智能火灾报警系统设计:多传感器融合与远程控制实现

本文详细介绍基于STM32单片机的智能火灾报警系统设计,采用多传感器融合技术(烟雾、温度、火焰检测)实现高精度火灾识别。系统集成远程控制与手机APP监控,通过加权决策算法降低误报率,提供多级响应策略,确保火灾预警的准确性与可靠性。

u5v6w7的博客 1104
上一篇: nodejs-koa框架的中间件级联
下一篇: golang中net包用法
hellochenlu
博客等级 码龄14年 97粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值