ViewService——一种保证客户端与服务端同步的方法
简介在分布式系统中,最常见的场景就是主备架构。但是如果主机不幸宕机,如何正确的通知客户端当前后端服务器的状况成为一个值得研究的问题。本文描述了一种简单的模型用于解决此问题。
背景
以一个分布式的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 intPrimary stringBackup string}Copy
Server
在多个server中,只有一个主机,一个备机,其余的server都处于空闲状态。所有的server都需要每隔一段时间向viewserver发送Ping消息,以证明自己还活着。并且通过Ping的返回值,得到当前viewserver认为的主机和备机是谁。这样,如果主机和备机都正常,在一段时间之后,后端server都会有一致的主机和备机。
Client
在操作后端server之前,先讯问viewserver当前主机是谁.
ViewServer
viewserver的功能比较复杂,主要负责:
回复客户端当前View
检测后端的server的存活情况
保证当前主机得到最新的View
在检测后端server存活情况时,有几种情况
主机Primary失联
备机Backup失联
空闲机器失联
当检测到主机或者备机失联时,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——一种保证客户端与服务端同步的方法
简介在分布式系统中,最常见的场景就是主备架构。但是如果主机不幸宕机,如何正确的通知客户端当前后端服务器的状况成为一个值得研究的问题。本文描述了一种简单的模型用于解决此问题。背景以一个分布式的Key-Value数据库为背景。数据库对外提供3个接口Ge…...
使用STM32F103ZE开发贪吃蛇游戏
目录 前言 一、设置FreeROTS用户任务 (1)事件event任务 (2)按键输入方向控制任务 (3)果实食物任务 (4)显示任务函数 (3)开始任务 二、主函数 三、ADC采样…...
如何利用Web3D技术打造在线虚拟展览馆
随着Web3D技术的不断发展,越来越多的企业和组织开始将其应用于虚拟展览馆的建设中。虚拟展览馆可以为观众提供高度沉浸式的展览体验,让观众可以随时随地参观各种展览,同时也为展览组织者提供了更多的展示方式和机会。下面将介绍如何利用Web3D…...
第二十三章 opengl之高级OpenGL(实例化)
OpenGL实例化实例化数组绘制小行星带实例化 综合应用。 如果绘制了很多的模型,但是大部分的模型包含同一组顶点数据,只是不同的世界空间变换。 举例:一个全是草的场景,每根草都是一个包含了几个小三角形的模型。需要绘制很多根草…...
C++ String类总结
头文件 #include <string>构造函数 default (1) basic_string();explicit basic_string (const allocator_type& alloc); copy (2) basic_string (const basic_string& str);basic_string (const basic_string& str, const allocator_type& alloc); su…...
内网升级“高效安全”利器!统信软件发布私有化更新管理平台
随着数字化的深度推进,信息安全重要性进一步凸显。建设自主可控的国产操作系统,提升信息安全自主能力,已成为国家重要战略之一。 操作系统安全对计算机系统的整体安全发挥着关键作用,各类客户往往需要在第一时间获取更新与安全补…...
JAVA开发(自研项目的开发与推广)
https://live.csdn.net/v/284629 案例背景: 作为JAVA开发人员,我们可以开发无数多的web项目,电商系统,小程序,H5商城。有时候作为技术研发负责人,项目做成了有时候也需要对内进行内测,对外进行…...
Mysql用户权限分配详解
文章目录MySQL 权限介绍一、Mysql权限级别分析(1)全局级别(1.1) USER表的组成结构(1.1.1) 用户列(1.1.2) 权限列(1.1.3) 安全列(1.1.4)…...
【TypeScript 入门】13.枚举类型
枚举类型 枚举类型:定义包含被命名的常量的集合。比如 TypeScript 支持枚举数字、字符两种常量值类型。 使用方式: enum + 枚举名字 + 花括弧包裹被命名了的常量成员: enum Size {S,M,L } const a = Size.M console.log(Size, Size)...
Python科学计算:偏微分方程1
首先,我们来看初边值问题:伯格斯方程:假设函数是定义在上的函数,且满足:右侧第一项表示自对流,第二项则表示扩散,在许多物理过程中,这两种效应占据着主导地位,为了固定一…...
PLS-DA分类的实现(基于sklearn)
目录 简单介绍 代码实现 数据集划分 选择因子个数 模型训练并分类 调用函数 简单介绍 (此处取自各处资料) PLS-DA既可以用来分类,也可以用来降维,与PCA不同的是,PCA是无监督的,PLS-DA是有监督的…...
常用hook
Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。理解:hook是react提供的函数API官方提供的hook基础hookuseState APIconst [state, setState] useState(initialState); //返回state值 以及更新state的方法 …...
TryHackMe-GoldenEye(boot2root)
GoldenEye 这个房间将是一个有指导的挑战,以破解詹姆斯邦德风格的盒子并获得根。 端口扫描 循例nmap Web枚举 进入80 查看terminal.js 拿去cyberchef解码 拿着这组凭据到/sev-home登录 高清星际大战 POP3枚举 使用刚刚的凭据尝试登录pop3 使用hydra尝试爆破 这…...
Elasticsearch基本安全加上安全的 HTTPS 流量
基本安全加上安全的 HTTPS 流量 在生产环境中,除非您在 HTTP 层启用 TLS,否则某些 Elasticsearch 功能(例如令牌和 API 密钥)将被禁用。这个额外的安全层确保进出集群的所有通信都是安全的。 当您在模式下运行该elasticsearch-ce…...
C语言-程序环境和预处理(2)
文章目录预处理详解1.预定义符号2.#define2.1#define定义的标识符2.2#define定义宏2.3#define替换规则注意事项:2.4#和###的作用##的作用2.5带副作用的宏参数2.6宏和函数的对比宏的优势:宏的劣势:宏和函数的一个对比命名约定3.undef4.条件编译…...
JVM 收集算法 垃圾收集器 元空间 引用
文章目录JVM 收集算法标记-清除算法标记-复制算法标记-整理算法JVM垃圾收集器Serial收集器ParNew收集器Parallel Scavenge /Parallel Old收集器CMS收集器Garbage First(G1)收集器元空间引用强引用软引用弱引用虚引用JVM 收集算法 前面我们了解了整个堆内存实际是以分代收集机制…...
clip精读
开头部分 1. 要点一 从文章题目来看-目的是:使用文本监督得到一个可以迁移的 视觉系统 2.要点二 之前是 fix-ed 的class 有诸多局限性,所以现在用大量不是精细标注的数据来学将更好,利用的语言多样性。——这个方法在 nlp其实广泛的存在&…...
vue 首次加载慢优化
目前使用的是vue2版本 1.路由懒加载(实现按需加载) component: resolve > require([/views/physicalDetail/index], resolve)2.gzip压缩插件(需要运维nginx配合) 第一步,下载compression-webpack-plugin cnpm i c…...
WuThreat身份安全云-TVD每日漏洞情报-2023-03-21
漏洞名称:CairoSVG 文件服务器端请求伪造 漏洞级别:严重 漏洞编号:CVE-2023-27586 相关涉及:CairoSVG 在 2.7.0 版本之前 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-06718 漏洞名称:WP Meta SEO WordPress 授权不当导致任意重定向 漏洞级…...
【Android -- 开发工具】Xshell 6 安装和使用教程
一、简介 Xshell 其实就是一个远程终端工具,它可以将你的个人电脑和你在远端的机器连接起来,通过向 Xshell 输入命令然后他通过网络将命令传送给远端Linux机器然后远端的Linux机器将其运行结果通过网络传回个人电脑。 二、Xshell 6 的安装 首先&#…...
探索分子世界的三维画笔:PyMOL开源版如何让你成为分子艺术家?
探索分子世界的三维画笔:PyMOL开源版如何让你成为分子艺术家? 【免费下载链接】pymol-open-source Open-source foundation of the user-sponsored PyMOL molecular visualization system. 项目地址: https://gitcode.com/gh_mirrors/py/pymol-open-so…...
python-flask-djangol框架的高校毕业生就业信息实习管理系统
目录需求分析与功能规划技术选型与架构设计数据库模型设计功能模块实现数据统计与可视化测试与部署文档与维护项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析与功能规划 明确系统核心目标为管理高校毕业生就业和实习信…...
Dual-Tree Agent RAG:可控、可解释、可验证
从文本检索到方法推理的跃迁 传统RAG系统将文档切分为平面文本块,通过向量相似度检索来增强大模型生成。这种模式在简单事实问答中表现良好,却难以应对需要全局结构理解、跨章节整合和方法论复用的复杂创新任务。现有改进方案如RAPTOR(层次摘…...
HunyuanVideo-Foley音效生成:支持中文prompt理解的城市环境音效精准生成
HunyuanVideo-Foley音效生成:支持中文prompt理解的城市环境音效精准生成 1. 产品概述 HunyuanVideo-Foley是一款专为视频内容创作设计的AI音效生成工具,能够根据中文文本描述精准生成各类环境音效。本镜像为RTX 4090D 24GB显存显卡深度优化的私有部署版…...
手把手教你用51单片机实现蓝牙+WiFi双模控制智能小车(附OLED显示速度)
从零构建51单片机智能小车:双模无线控制与速度显示实战指南 引言 想象一下,当你坐在沙发上,用手机就能遥控一台自制的小车在房间里自由穿梭,同时还能实时查看它的行驶速度——这种极客般的体验其实并不遥远。基于51单片机的智能…...
ROS2新手必看:用turtlesim小乌龟快速入门机器人仿真(附完整安装指南)
ROS2实战入门:从turtlesim小乌龟探索机器人仿真世界 引言:为什么选择turtlesim作为ROS2的起点? 在机器人操作系统(ROS)的学习道路上,很多开发者都会遇到一个共同的困境:理论概念抽象难懂,而直接上手复杂项…...
Python多线程真能并行了吗?(GIL绕过技术全图谱:subprocess/numba/multiprocessing/cython/rustpy)
第一章:Python无锁GIL环境下的并发模型面试题汇总Python 的全局解释器锁(GIL)长期被视为多线程并发的瓶颈,但近年来随着 CPython 3.13 引入实验性无锁 GIL(--without-pymalloc 配合 --with-per-object-gil 原型&#x…...
告别SQLite!用ObjectBox为Flutter应用打造高性能本地存储(含常见报错解决方案)
告别SQLite!用ObjectBox为Flutter应用打造高性能本地存储(含常见报错解决方案) 在移动应用开发中,本地数据存储方案的选择直接影响着用户体验和应用性能。对于Flutter开发者来说,SQLite长期以来都是默认选择࿰…...
Beyond Compare 5密钥生成器:专业文件对比工具的永久激活方案
Beyond Compare 5密钥生成器:专业文件对比工具的永久激活方案 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 你是否正在为Beyond Compare 5的30天评估期到期而烦恼?这款…...
PyTorch 2.8镜像保姆级教程:vim配置Python开发环境+代码补全+调试快捷键
PyTorch 2.8镜像保姆级教程:vim配置Python开发环境代码补全调试快捷键 1. 环境准备与快速验证 在开始配置vim开发环境前,我们先确认PyTorch 2.8镜像已正确运行。打开终端,执行以下命令验证GPU是否可用: python -c "import…...
