6.824-lecture4

主备复制

主题

  • 容错的主从复制
  • VMware FT的案例研究 这个主意的实现版本

容错

  • 我们想要一个一个服务出现错误也能继续运行
  • 一些理想的模型
    • 高可用:尽管一些错误,但是仍然能用
    • 强一致性:看起来就像单机服务
    • client透明
    • server 软件透明
    • 有效率

我们需要处理哪些错误?

  • 崩溃
  • 独立的失败
  • 网络丢包
  • 网络分区

但不包括

  • 执行不正确
  • 不相关的错误
  • 配置错误
  • 恶意代码

行为

  • 可用 (如服务器崩溃)
  • 等待(网络错误)
  • 永远停止(多个服务器崩溃)
  • 故障(软硬件错误,软件故障)

核心思想:冗余

  • 多个服务器
  • 每个复制保持服务所需要的状态
  • 一个复制失败了,其他的还能顶上去

例子:容错的mapreduce 主节点

  • lab1 workers是容错的,但是主节点不是,有单点故障
  • 如果我们有两个master,会有失败吗
  • 状态
    • worker list
    • 哪个job工作
    • 呢个worker idle
    • tcp 链接状态
    • 程序内存和栈
    • cpu寄存器

大问题

  • 要复制什么状态?
  • 主服务器是否必须等待备份?
  • 什么时候切换到备份?
  • 转换时是否可见异常?
  • 如何加快更换速度?

两个主要方法

  • 状态转移
    “主”副本执行服务
    主服务器将[新]状态发送到备份
  • 复制状态机
    所有副本执行所有操作
    如果相同的开始状态,
    相同的操作
    相同的顺序
    确定性的
    然后相同的结束状态

状态转移更简单

  • 但是状态可能很大,转移缓慢

  • VM-FT使用复制状态机

复制状态机可以更高效

  • 如果操作比数据小

  • 但是复杂操作才能正确

  • 实验2/3/4使用复制状态机

在什么级别定义复制状态机?

  • K / V put gey?
    “应用程序级” RSM
    通常需要修改服务器和客户端
    可以有效率 主服务器仅将高级操作发送到备份
  • x86指令?
    可能允许我们复制任何不带修改的现有服务器!
    但需要更详细的主/备份同步
    而且我们必须处理中断,DMA,奇怪的x86指令
The design of a Practical System for Fault-Tolerant Virtual Machines
Scales, Nelson, and Venkitachalam, SIGOPS OSR Vol 44, No 4, Dec 2010

非常雄心勃勃的系统:

  • 目标:现有服务器软件的容错

  • 目标:client不应注意到失败

  • 目标:无需更改客户端或服务器软件

  • 很有野心!

总览
[应用程序,操作系统,VM-FT,共享磁盘,网络,客户端]
单词:

  • 虚拟机监控程序监视器 VMM(虚拟机监视器)
    应用程序和操作系统是在虚拟机中运行的“宿主”

  • 两台计算机,主计算机和备用计算机

  • 共享磁盘用于持久存储

  • 共享,这样可以更快地创建新备份

  • 主数据库通过日志记录通道将所有输入发送到备份

为什么这个想法行得通?

  • 这是一个复制状态机

  • 具有相同初始状态的主启动和备份启动(内存,磁盘文件)
    相同的指令,相同的输入->相同的执行

  • 在所有其他条件相同的情况下,主数据库和备份数据库将保持不变

我们必须注意哪些差异来源?

  • 保证许多指令在主要和备份上执行完全相同的操作

  • 只要内存+寄存器是相同的,我们就通过归纳法来假设。

什么时候在主数据库上执行与备份上可能有所不同?

  • 来自外部世界(网络)的输入。

  • 从存储服务器读取的数据。

  • 中断时间。

  • 不是纯粹的状态功能的指令,例如循环计数器。

  • 竞争

分歧的例子?

  • 它们听起来都像是“如果主数据库发生故障,客户端将看到备份中出现的存储不一致”。

  • 锁定服务器将锁定授予客户端C1,拒绝来自C2的后续请求。

  • 主服务器和备用服务器最好在输入顺序上达成共识!

  • 否则,主服务器将失败,备份现在会告诉客户端C2持有该锁。

  • 锁定服务器在一分钟后撤消锁定。

  • 假设C1保持锁定,并且分钟几乎精确到了。

  • C2请求锁定。

  • Primary可能会在计时器中断之前立即看到C2的请求,拒绝。

  • 定时器中断后,准时备份可能会看到C2的请求。

  • 因此:备份必须在指令流的同一点以相同的顺序看到相同的事件。

示例:计时器中断
目标:主要和备份应该在执行的完全相同的点看到中断
ie 同一对已执行指令之间
主:
FT产生定时器中断
FT从CPU读取指令号
FT在记录通道上发送“指令X的计时器中断”
FT向主节点传递中断,然后恢复
(这依靠CPU的特殊支持来计数指令,在X之后中断)
备份:
忽略自己的计时器硬件
FT在“备份”到指令X之前*看到日志条目
FT告诉CPU在指令X处中断
FT模拟计时器中断,恢复备份

示例:磁盘/网络输入
主要和备用两者都要求硬件读取
FT拦截,在备份时忽略,在主节点上给出真实的硬件
主:
FT告诉硬件将DMA数据存入FT的专用“反弹缓冲区”
在一些时候,硬件执行DMA,然后中断
FT收到中断
FT暂停了主要
FT将退回缓冲区复制到主数据库的内存中
FT模拟主要中断,然后恢复
FT将数据和指令#发送到备份
备份:
FT从日志流中获取数据和指令#
FT告诉CPU在指令X处中断
FT在中断期间复制数据

为什么需要跳动缓冲区bounce buffer?
也就是说,为什么要等到主/备份未执行后再复制数据?
我们希望数据在内存中的同一位置出现
执行主数据库和备份数据库。
否则它们可能会分歧。

请注意,备份必须滞后一个事件(一个日志条目)
假设primary在指令X之后得到中断或输入
如果备份已在X以后执行,则无法正确处理输入
因此,备份FT在看到第一个日志条目之前根本无法开始执行
然后,它仅执行该日志条目中的指令#
并等待下一个日志条目,然后重新启动备份

示例:非功能指令
即使主数据库和备份数据库具有相同的内存/寄存器,
一些指令仍然执行不同
例如,读取当前时间或周期数或处理器序列号
主:
FT将CPU设置为在主要执行该指令时中断
FT执行指令并记录结果
将结果和指令#发送到备份
备份:
备份在尝试执行该指令时也会中断
FT提供了primary获得的价值

磁盘/网络输出如何?
主和备用都执行输出指令
Primary的FT实际上执行输出
备份的FT放弃输出

但是:论文的“输出规则”(第2.2节)说,主要的首要的
在产生输出时告诉备份,并延迟输出直到
备份说它已经收到日志条目。

为什么要使用输出规则?
假设没有输出规则。
主服务器立即发出输出。
假设主要对象看到输入I1 I2 I3,然后发出输出。
备份已在日志上收到I1和I2。
主要崩溃,网络丢失了I3的数据包。
现在,备份无需处理I3就可以上线。
但是某些客户端看到的输出反映了执行I3的主要对象。
这样,如果客户端再次与服务对话,则该客户端可能会看到异常状态。
因此:主节点在知道备份之前不会发出输出
已经看到所有输入,直到该输出为止。

输出规则很重要
在所有复制系统中以某种形式发生
严重限制性能 性能的敌人
特定于应用程序的智能区域
例如。也许不需要主服务器等待回复只读操作
FT没有应用级知识,必须保守

问:如果主服务器在从备份获得ACK后立即崩溃,
但是在主要发出输出之前?
这是否意味着将永远不会生成输出?

答:这是当主节点发生故障而备份接管时发生的情况。
备份从主数据库获取一些日志条目。
备份继续执行那些输出被抑制的日志条目。
在最后一个日志条目之后,备份开始发出输出
在我们的示例中,最后一个日志条目是I3
因此,在输入I3之后,客户端将开始发出输出
因此,它将发出主要节点未能发出的输出

问:但是如果主服务器在发出输出之后崩溃了怎么办?
备份会在第二秒内发出输出吗?

答:可以。
对于TCP,单击“确定”,因为接收者将忽略重复的序列号。
可以写入共享磁盘,因为备份会将相同的数据写入相同的块#。

转换时复制输出在复制系统中非常普遍
客户&c并非总是可能忽略重复项
例如,如果输出是从ATM机上赚钱

问:FT可以应对网络分区吗?它会遭受脑裂吗?
例如,如果主服务器和备用服务器都认为对方故障了。
他们俩都会“生活”吗?

答:共享磁盘打破了常规。
共享磁盘服务器支持原子测试和设置。
主/备份中只有一个可以成功测试并设置。
如果只有一个人还活着,它将赢得测试和设定并开始上线。
如果两者都尝试,一个将失败并停止。

共享存储是单点故障
如果共享存储关闭,则服务关闭
也许他们想到了一个复制的存储系统

问:为什么他们不支持多核?

绩效(表1)
FT/Non-FT:令人印象深刻!
有点慢
日志带宽
直接反映磁盘读取率+网络输入率
对于MySQL,速度为18 Mbit / s
这些数字对我来说似乎很低
应用程序可以至少400 Mbps的速度读取磁盘
因此他们的应用程序不是很占用磁盘

FT何时会具有吸引力?
关键但强度较低的服务,例如名称服务器。
软件不方便修改的服务。

高吞吐量服务的复制呢?
人们将应用程序级复制状态机用于例如数据库。
状态只是DB,而不是全部的内存和磁盘。
事件是数据库命令(放置或获取),而不是数据包和中断。
结果:更少的细粒度同步,更少的开销。
GFS使用应用程序级复制,如Lab 2&c一样

摘要:
主备份复制
VM-FT:干净的例子
如何应对没有单点故障的分区?
下一场演讲
如何获得更好的性能?
应用程序级复制状态机


VMware KB(#1013428)讨论了多CPU支持。VM-FT可能已切换
从复制状态机方法到状态转移方法,但是
不清楚这是真的还是假的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值