分布式入门之3:副本控制

按某特定流程控制副本数据的读写行为,使副本满足一定的可用性及一致性的分布式协议。

中心化副本控制协议:

primary-secondary协议

只有一个副本作为主副本,其余都是从副本。主副本作为中心节点负责数据更新、控制协调一致性。

四大问题:

1. 写

> 写由主完成

> 外部写请求发给主

> 主进行并发控制,即确定并发请求的先后顺序

> 更新操作发给从节点

GFS采用接力方式传递数据,以控制出口带宽。如果是最终一致性的系统,主从是可以不一致的,只需要后续慢慢同步到一致状态。

Quorum:只需要完成W个副本的更新。

> 根据从节点完成情况,决定怎么返回给外部

2. 读

最终一致:那随便读哪个副本

会话一致:在写/更新时,设置副本版本号,读时验证版本号即可保证在会话内单调递增

强一致性实现思路:

只读主副本。这在副本以数据段为单位时,并不会浪费机器资源,因为各副本的主也是分散在各机器上的。

主节点控制:主节点在更新从节点的数据时,如果失败标记其为不可用。使用一个中心元数据管理系统来记录哪些不可用。外部查中心元数据确定哪个可用。

Quorum机制:除了只读主,还可以按quorum中提及的,读R个,取最高版本号,直到读到W个副本。

3. 主副本确定及切换

切换要解决的无非两个问题:

a. 如何确定主节点异常?

lease机制。

b. 异常后应该切到哪个从节点?

异常后强一致性的服务要求是目标从节点必须与原主节点的数据一致。这其实与强一致性下读从节点是同一问题。可用Quorum机制,读R个,取最高版本号,再同步至W个节点,造成最高版本号的数据已经写了W份的结果,满足quorum机制写成功的要求。

primary-secondary协议的缺点就是主从切换时,会由于探测主节点异常存在时间窗口,而导致服务暂时不可用。

4. 数据同步

不一致的情况下,需要同步。不一致的情况主要有3种:

1. 网络分化等导致从节点上数据落后于主节点数据;

回放主上日志

2. 从节点上是脏数据;

设计分布式协议以不产生从节点上脏数据

3. 从节点是新增节点。

设置快照,拷贝快照;再回放快照后的部分

例:GFS,PNUTS,Niobe,

去中心化副本控制协议:

没有中心副本,各节点通过协商达到某种一致状态,因此避免了primary-secondary协议中主从切换时带来的停服务问题。

但流程复杂。paxos。

例:Dynamo/Cassandra一致性hash,一致性模型有问题,使应用使用复杂度上升。

Chubby/Zookeeper:基于类paxos,选中primary,随后转为primary-secondary控制协议。

Megastore:完全paxos,不转为主从控制。

时间: 2024-10-11 14:48:11

分布式入门之3:副本控制的相关文章

erlang分布式入门(一)-ping pong

erlang分布式入门(一)-ping pong 测试环境和http://willvvv.iteye.com/blog/1523918 一样,192.168.0.182(centos-182)和192.168.0.183(centos-183), 1.按照上面链接(步骤1-4)设置通过ssh hostname 免输入密码直接登录. 2.设置erlang的magiccookie,由于都是以root账号操作,分别在两台机子上执行以下命令 cd /root vi .erlang.cookie 输入 S

分布式入门之2:Quorum机制

1.  全写读1(write all, read one) 全写读1是最直观的副本控制规则.写时,只有全部副本写成功,才算是写成功.这样,读取时只需要从其中一个副本上读数据,就能保证正确性. 这种规则需要解决一个问题:如果是一个kv系统,对某个key的第i次写如果只有部分成功,那么系统中既存在次i次写的结果,又存在着第i-1次写的结果.而根据规则,生效的仅仅是第i-1个版本.因此,需要全局性地记录某个key对应的数据目前的版本号i-1.这个元数据可能为是系统的瓶颈. 可用性:对于写操作,虽然有N

arduino入门学习实现语音控制LED灯

需要的准备的硬件arduino+PC+麦克风实现语音命令控制LED灯的亮灭. 首先需要将写好的arduino程序烧录到arduino uno主板中,下面是代码如下: int val;//定义变量val int ledpin=10;//定义数字接口13 void setup() { Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致.当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致. pinMode(ledpin,OUTPUT);//设置数字10

Python3.5入门学习记录-条件控制

Python的条件控制同C#一样,都是通过一条或多条语句的执行结果(True OR False)来决定执行的代码块. if 语句 Python中if语句的一般形式如下所示: if condition_1: statement_block_1 elif condition_2: statement_block_2 else: statement_block_3 如果 "condition_1" 为 True 将执行 "statement_block_1" 块语句 如果

分布式版本控制系统Git------版本控制(文末有一个小疑问)

版本控制 之前自己使用Git客户端版在Windows平台乱搞的时候,因为之前在Github上有一个一样的项目仓库.然后手贱点击了reset按钮(应该是这个)结果发现Android Studio整个项目都没见了,吓得我半死.赶快百度百度,最后在shell里面使用了git reset命令解救了项目,吓得我赶快备份.这也给了我一个教训,做事情一定要谋定后动,没有完全了解之前不要随意使用. 言归正传,今天写的是关于git的版本控制的,简单说就是版本退回和返回现在. 在git的仓库之中,有一个名为HEAD

分布式入门之4:二阶段提交

1. 背景: 初时提出,是为解决分布式数据库的事务问题.单机数据库事务可靠日志技术,MVCC技术实现.分布式情况下,就需要额外的手段来保证,这才出现了二阶段提交. 2. 流程: 从角色上,二阶段提交分为两种角色:协调者(coordinate),参与者(participant).流程思路上很简单: 1. 协调者询问询问所有参与者,能否提交:参与者返回是否能提交的结果: 2. 协调者根据参与者的返回结果决定是否提交事务,并通知参与者执行. 但实际上,二阶段提交需要考虑不少异常场景: 对照上图: 1

Shell入门教程:流程控制(1)命令的结束状态

在Bash Shell中,流程控制命令有2大类:“条件”.“循环”.属于“条件”的有:if.case:属于“循环”的有:for.while.until:命令 select 既属于“条件”,也属于“循环”.不管是哪一种,均需进行条件测试,再根据测试结果,决定程序流程进行的方向. 以下逐一说明这些命令的用法. 第一节:命令的结束状态 Bash Shell Script 可由许多命令组成.每一个命令执行后,都会传回一个结束状态值,如果执行成功,传回0,如果执行失败,则传回非0值.执行失败,也分成许多状

Jenkins 初步入门---安装和用户控制

Jenkins 官网:http://jenkins-ci.org/ 安装说明:https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins On RPM-based distributions, such as Red Hat Enterprise Linux (RHEL), CentOS, Fedora or Scientific Linux, you can install Jenkins through yum. Recent

HTML入门 一般标签 格式控制标签

font 的属性       <font>内容</font> 双标签            color 字体颜色       face 选择字体        size 字体大小 格式控制          <b></b>  字体加粗          <i></i>  倾斜         <u></u> 下划线 原文地址:https://www.cnblogs.com/wangxiao233/p/82056