分布式系统
Paxos选举协议以及两阶段提交
基本概念
异常
异常类型
理解一致性可以从两个角度:用户/存储系统
客户端:
- 强一致
- 弱一致
- 最终一致性: 最终一致有一个“不一致窗口”,不一致窗口大小以来以下几个因素:交互延迟,系统负载,以及复制协议要求同步的副本数
最终一致性描述比较粗略,其他常见的变体如下:
读写(Read-your-writes)一致性: 如果客户端A写入了最新的值,那么A的后续操作都会读取到最新的值,但是其他用户可能要过一会儿才能看到
会话(session)一致性: 要求客户端和存储系统交互的整个会话期间保证读写一致性,如果原有会话因为某种原因失效,会话之间的操作要回滚掉
单调读一致性: 如果客户端A已经读取了对象的某个值,那么后续操作将不会读取到更早的值
单调写一致性: 客户端A的写操作按顺序我拿成,这意味着对与同一个客户端的操作,存储系统的多副本也要按照与客户端相同的顺序完成
从存储系统角度看:
- 副本一致性:
- 更新顺序一致性
数据分布
分布式系统区别于传统单机系统在于能够数据分布到多个节点,并在多个节点之间实现负载均衡.
数据分布方式主要有两种:
- 哈希分布,如一致性哈希
- 顺序分布
哈希分布
衡量机器负载设计很多因素:如机器load,cpu,内存,磁盘以及网络等资源,分布式存储需要能够自动识别负载高的节点,当某台机器负载高时,实现自动迁移
传统哈希分布,当服务器上下线时,N值发生变化,数据映射完全被打乱.几乎所有数据需要重新分布,这将带来大量的数据迁移
一致性哈希有点在于节点加入/删除是只会影响到在哈希环中相邻的节点,而对其他节点没影响
顺序分布
将大表顺序划分为连续的范围,每个范围称为一个子表,总控服务器负责将这些子表按照一定的策略分配到存储节点上.
负载均衡
- 分布式系统每个集群中一般都有个总恐怖节点,其他节点为工作节点,工作节点通过心跳包将节点负载信息(如cpu,内存,磁盘,网络等信息)发送到主控节点.主控节点计算出工作节点的负载以及需要迁移的数据,生成迁移任务放入迁移队列中等待执行.
- 负载均衡操作需要控制节奏,因为在迁移过程中机器服务能力会下降,一般新加机器迁移过程会持续300分钟到1个小时
- 分布式存储一版是多副本,主副本对外提供服务,迁移备副本不会对服务造成影响,迁移主副本可以先将数据的读写服务切换到其他备副本,再迁移
复制
主副本将写请求复制到其他备副本,最常见的做法是同步操作日志,主副本确定操作的顺序并写入到日志中复制给其他副本
复制协议分为两种:
- 强同步协议要求: 主备同步完成后才能返回客户端写成功.假设所有副本的个数为N,且N>2, 那么实现强同步协议时,主副本只要并发地发给所有备副本并等待回复,只要至少1个备副本返回成功就可以回复客户端成功.
- 异步复制: 主副本不需要等待备副本的回应,只需要在本地修改成功就可以告知客户端写操作成功
基于复制协议,要求任何时刻只能有一个副本为主副本,由它来确定写操作之间的顺序.如果主副本故障,需要选举一个备副本成为新的主副本,这步操作称为选举,经典的选举协议为(Paxos协议)
一致性与可用性
CAP理论: 一致性(Consistency),可用性(Availability)以及分区可容忍性(Tolerance of network Partition)三者不能同时满足.
- 一致性: 读操作总能读取到之前完成的写操作结果,满足这个条件的系统称为强一致性系统
- 可用性: 读写操作在单台机器发生故障情况下仍然能正常执行
- 分区可容忍性: 机器故障,网络故障情况下仍能满足一致性和可用性
最大可用性模型: 正常情况下强同步模式,异常情况切换为异步复制模式
容错
故障检测往往通过租约协议
故障检测
故障检测最自然想到的是心跳机制,但还是存在问题(没有收到心跳包并不一定能100分确认发生故障并停止了服务)
传统心跳机制存在问题在于: 机器A和机器B之间需要对“机器B是否应为被认为发生故障且停止服务”达成一致.
租约机制就是带有超时时间的一种授权,假设机器A需要检测机器B是否发生故障,机器A可以给机器B发放租约,机器B持有的租约的有效期范围内才允许提供服务,否则主动停止复制.机器B的租约快到期时向A重新申请租约来延长有效期.
增加提前量,假设B机器租约有效期是10s,A机器必须啊哟加一个提前量,比如11s,才能任务机器B的租约过期.
故障恢复
常见分布式存储系统分为两种结构:单层结构/双层结构.
可扩展性
通过数据分布,复制以及容错等机制,能够将分布式存储系统部署到成千上万台服务器
总控节点
总控节点一般用于维护数据分布信息,执行工作机管理,数据定位,故障检测与恢复,负载均衡等全局调度工作,那么总控节点是否会成为性能瓶颈呢?
不太可能,而且可以通过一些手段来避免
分布式协议:
两阶段提交协议:
A组织B,C,D三人去爬长城,如果所有人同意去爬长城,那么活动将举行,如果有一个人不同意去爬长城,则活动取消.
但是
两阶段提交协议是阻塞协议,执行过程需要锁住其他更新,且不能容错