分布式系统基本副本协议
一、中心化副本控制协议
中心化副本控制协议的基本思路是由一个中心节点协调副本数据的更新、维护副本之间的一致性。
优点:协议相对较为简单,所有的副本相关的控制交由中心节点完成。并发控制也由中心节点完成。
缺点:系统的可用性依赖于中心化节点,当中心节点异常时存在一定的停服务时间。
primary-secondary协议
primary-secondary协议(也称 primary-backup)是中心化副本控制协议的非常常用的一种。在 primary-secondary 类型的协议中,副本被分为两大类,其中有且仅有一个副本作为 primary 副本,除 primary 以外的副本都作为 secondary 副本。
维护 primary 副本的节点作为中心节点,中心节点负责维护数据的更新、并发控制、协调副本的一致性。
Primary-secondary 类型的协议一般要解决四大类问题:数据更新流程、数据读取方式、Primary副本的确定和切换、数据同步(reconcile)。
1、数据更新的基本流程
①数据更新都由 primary 节点协调完成。
②外部节点将更新操作发给 primary 节点
③primary 节点进行并发控制即确定并发更新操作的先后顺序
④primary 节点将更新操作发送给 secondary 节点
⑤primary 根据 secondary 节点的完成情况决定更新是否成功并将结果返回外部节点
其中第4步,如果由primary节点同时将更新数据发送给其他secondary副本,则其他secondary副本的的更新受primary网络带宽的影响,最大为1/N.为了解决这个问题,有些系统(GFS)使用接力的方式同步数据。
2、数据读取方式
①如果只需要最终一致性,则读取任何副本都可以满足需求。
②如果需要会话一致性,则可以为副本设置版本号,每次更新后递增版本号,用户读取副本时验证版本号,从而保证用户读到的数据在会话范围内单调递增。
primary-secondary 比较困难的是实现强一致性,以下是2中思路:
①如果始终只读 primary 副本的数据,可以实现强一致性,但是secondary将不提供读服务。实践中,如果副本不与机器绑定,以数据段为副本的基本单位,将副本分散到集群中个,假设primary 也是随机的确定的,那么每台机器上都有一些数据的 primary 副本,也有另一些数据段的 secondary 副本,从而每台服务器实际都提供读写服务。
②由 primary 控制节点 secondary 节点的可用性。当 primary 更新某个 secondary 副本不成功时,primary 将该 secondary 副本标记为不可用,不可用的secondary 副本可以继续尝试与 primary 同步数据直到同步成功,primary将副本标记为可用。这种方式依赖于一个中心元数据管理系统,用于记录哪些副本可用,哪些副本不可用。
3、primary副本的确定和切换
确定副本:在 primary-secondary 类型的分布式系统中,哪个副本是 primary 这一信息都属于元信息,由专门的元数据服务器维护。
切换副本的难点:
①如何发现primary节点异常,Lease 机制(后面介绍)
②切换primary后如何做到不影响副本的一致性。如何确定一个 secondary 副本使得该副本上的数据与原primary一致?
由于分布式系统中可靠的发现节点异常是需要一定的探测时间的,这样的探测时间通常是 10秒级别,在这 10 秒时间内,由于没有 primary,系统不能提供更新服务,甚至不能提供读服务。因此,primary-backup 类副本协议的最大缺点就是primary切换带来的一定的停服务时间。
4、数据同步
通常不一致的形式有三种:
①由于网络分化等异常,secondary 上的数据落后于 primary 上的数据。回放 primary 上的操作日志。
②在某些协议下,secondary 上的数据有可能是脏数据,需要被丢弃。脏数据是由于primary 副本没有进行某一更新操作,而 secondary 副本上反而进行的多余的修改操作,从而造成secondary 副本数据错误。可以设计一些基于 undo 日志的方式(后期分享)从而可以删除脏数据。
③secondary 是一个新增加的副本,完全没有数据,需要从其他副本上拷贝数据。直接拷贝 primary 副本的数据,但拷贝数据时 primary 副本需要能够继续提供更新服务,这就要求 primary 副本支持快照(snapshot)功能。即对某一刻的副本数据形成快照,然后拷贝快照,拷贝完成后使用回放日志的方式追快照形成后的更新操作。
二、去中心化副本控制协议
去中心化副本控制协议没有中心节点,协议中所有的节点都是完全对等的,节点之间通过平等协商达到一致。从而去中心化协议没有因为中心化节点异常而带来的停服务等问题。
缺点:协议过程通常比较复杂、效率低
Paxos 是唯一在工程中得到应用的强一致性去中心化副本控制协议。
实例:
①GFS 系统的副本控制协议是典型的 Primary-Secondary 型协议,Primary 副本由 Master 指定,Primary 副本决定并发更新操作的顺序。虽然在 GFS 中,更新操作的数据由客户端提交,并在各个副本之间流式的传输,及由上一个副本传递到下一个副本,每个副本都即接受其他副本的更新,也向下更新另一个副本,但是数据的更新过程完全是由 primary 控制的,所以也可以认为数据是由primary 副本同步到 secondary 副本的。
②Zookeeper 使用了基于 Paxos 的去中心化协议(后期分享)选出 primary 节点,但完成 primary节点的选举后,这两个系统都转为中心化的副本控制协议,即由 primary 节点负责同步更新操作到secondary 节点。
参考资料:《分布式系统原理介绍》作者:刘杰
如有错误欢迎指正!
分布式系统基本副本协议相关推荐
- 分布式系统原理 之2 基本副本协议
分布式系统原理 基本副本协议 副本控制协议指按特定的协议流程控制副本数据的读写行为,使得副本满足一定的可用性和一致性要求的分布式协议. 副本控制协议要具有一定的对抗异常状态的容错能力,从而使得系统具有 ...
- 分布式系统概念:一致性协议、一致性模型、拜占庭问题、租约、副本协议
1,一致性协议 两阶段提交协议与Raft协议.Paxos协议 ①两阶段提交协议 在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败.当一个事务跨越多个节 ...
- 博文推荐|深入解析 BookKeeper 多副本协议(一)
本文翻译自<A Guide to the BookKeeper Replication Protocol (TLA+ Series Part 2)>,作者 Jack Vanlightly. ...
- 分布式系统的一致性协议之 2PC 和 3PC
在分布式系统领域,有一个理论,对于分布式系统的设计影响非常大,那就是 CAP 理论,即对于一个分布式系统而言,它是无法同时满足 Consistency(强一致性).Availability(可用性) ...
- 分布式系统:一致性协议
一致性模型本质上是进程与数据存储的约定,通过一致性模型我们可以理解和推理在分布式系统中数据复制需要考虑的问题和基本假设.那么,一致性模型的具体实现有一些呢?本文会介绍一致性协议实现的主要思想和方法. ...
- 区块链共识机制:分布式系统的Paxos协议
前言:第一次接触paxos可能很多人不理解这玩意儿有啥用,近几天一直在研究paxos,不敢说理解的多到位,但是把自己理解的记录下来,供大家参考.文章主要参考知行学社的<分布式系统与Paxos算法 ...
- 分布式系统概念 | 一致性协议:拜占庭将军问题、Paxos、Raft
文章目录 拜占庭将军问题 Paxos 问题描述 执行过程 Prepare阶段 Accept阶段 Learner获取提案 活锁问题 Raft 状态机 执行流程 主节点选举 数据同步 拜占庭将军问题 拜占 ...
- 分布式系统多副本复制的问题与解决方案
文章目录 单主复制.多主复制和无主复制介绍 单主复制的问题与解决方案 读己之写 单调读 一致前缀读(因果倒置) 多主复制和无主复制并发写入与因果写入 并发写入与因果写入 因果关系倒置解决方案 并发写入 ...
- 分布式系统协议Paxos、Raft和ZAB
分布式系统协议Paxos.Raft和ZAB 文章转载自:https://zhuanlan.zhihu.com/p/147691282 首先得放在开头,分布式系统的一致性协议一直是分布式系统的难题,本人 ...
最新文章
- Entity Framwork CodeFirst 学习笔记一:EF 概念和初次接触CodeFirst
- python爬取本地天气信息_用Python写一个爬取中国天气网的终端版天气预报爬虫
- 【Python】参考ggplot2,Seaborn将迎来超大版本更新!
- (巴什博弈 sg函数入门1) Brave Game -- hdu -- 1846
- WIFI无线传输模块使用 ESP8266芯片方案接入云平台的方法
- python类属性和实例属性_Python 类属性与实例属性,类对象与实例对象用法分析...
- html日期自动更新,原生javascript实现自动更新的时间日期_javascript技巧
- bzoj2588: Spoj 10628. Count on a tree 主席树
- 在c语言Windows窗口添加按钮,C语言用windows.h创建按钮的问题
- win10环境下python3如何使用PyV8
- python确定样本量(总体比例)
- 高精度反正切函数的实现
- VTK:生成网格(附完整源码)
- 大数据信息资料采集:淘宝飞猪旅游酒店客栈旅社公寓数据信息采集
- jetson连接PCF8591读取模拟电压值
- 如何将Oracle11g卸载干净
- Windows 文本大文件查看工具
- 【codeforces】Round #269 ABCD
- android 多人视频,Android QQ 5.0 正式版:全新界面、精彩动态、多人视频/音频
- python数据分析与挖掘——航空数据模型
热门文章
- java数据同步处理_Java如何处理多线程的数据同步问题
- mysql的explain的用途,利用Explain来分析和优化你的mysql
- Python中的join()函数和split()函数的用法
- CreateProcess启动游戏注入DLL
- 缓冲区溢出漏洞攻击——Shellcode编写
- [Windows驱动开发](二)基础知识——数据结构
- chromium net android移植
- 计算机网络 | IP协议相关技术与网络总结 :DNS、ICMP、DHCP、NAT/NAPT、通信流程
- 如何设计订单系统?不妨看看这篇文章
- 苹果公布WWDC20大会安排、Snapchat上线小程序功能、QUIC和HTTP/3 将定稿|Decode the Week...