当前位置: 首页 > 编程日记 > 正文

分布式系统 一致性模型的介绍 以及 zookeeper的 “线性一致性“ 讨论

文章目录

    • 1. 一致性 概览
      • 1.1 分布式系统的 “正确性”
      • 1.2 线性一致性(Linearizability)
      • 1.3 顺序一致性(Sequential consistency)
      • 1.4 因果一致性(Casual consistency)
      • 1.5 最终一致性(Eventual consistency)
    • 2. Zookeeper 的 “线性一致性” 问题
    • 3. 参考

一致性算是分布式系统的定位,一个分布式系统拥有什么样的一致性决定了它能够拥有什么样的性能。

本节从理论(设计一些分布式系统) 层面来描述不通的一致性 的要求 以及 在性能上的取舍,最后再探讨一下一致性 对于 共识算法(一致性算法) 的影响。

写这篇文章的起因 是 身边的同事 以及 接触到的分布式系统 总会引入对一致性的讨论,请教大家不通一致性的区别 以及 一致性和隔离性之间的差异时(线性一致性 和 Serializability 除了一个是一致性 一个是隔离级别,他们对请求处理上有什么差异吗) 总是从工程上得不到一个清晰的答案,所以还是自己花功夫讲这一些细节摸清楚,这样我们说一个系统拥有 “线性一致性能力”(个人已知的还没有) 以及 一个系统拥有 最终一致性 能力的时候他们的大体架构 和 性能差异都能 有一个定位框架。

1. 一致性 概览

1.1 分布式系统的 “正确性”

在分布式系统中我们想要保证系统的正确性,需要一套规则来进行约束,这一套规则就是一致性模型。

这个时候大家会想,保证正确性不是天经地义的事情吗,计算机执行 1+1 ,返回的结果一定是2呀,只要满足类似这样的正确性 不就是正确性本身的体现吗,为什么在分布式系统中需要有一套规则来描述正确性呢。

这种正确性 需要达到操作系统 寄存器级别的数据操作才行,加上CPU-cache 和 DRAM 其实就无法达到这样的正确性了。

因为cpu-cache是异步更新到DRAM的,而多线程场景,不通线程挂在不通的cpu之上,那一号线程的更新不一定立即刷到DRAM,而同时2号线程去读这块内存,可能无法读到新的数据。

很简单,我们来做一些简单的计算:

  1. 单机服务器中 CPU 距离内存大概30cm,电信号(电磁波)以接近光速的速度从CPU 传递到内存,需要1ns的时间。
  2. 分布式系统中 不通数据中心服务器之间的距离往往以百千米计,按照500km来算的话,不通服务器之间的数据传输耗时需要1.6ms。

而实际情况下,全球级别的分布式系统计算机之间的通信跨洲/跨洋 都是很普遍的,那一次请求需要几十ms以上的延时才能被其他服务器收到,相比于单机服务器几十ns到百ns的访寸或者us级别的读盘来说太长了。这个时候,一台机器写入的数据想要在另一台机器读取,显然很难保证其他机器能够读到新的数据。

所以,我们需要为分布式系统引入正确性模型,来决定当前分布式系统应该对外提现什么样的“正确性”,这个正确性可以和我们的寄存器正确性有歧义。正如,CPU的内存屏障能够为用户提供不同的一致性要求。

目前整理出来的一致性模型,从强到弱大体有以下四种(不同的论文/系统可能有自己的分类,但是较为清晰的划分有以下四种):

线性一致性(Linearizability) --> 顺序一致性(Sequential consistency) --> 因果一致性(Casual consistency) --> 最终一致性(Eventual consistency)

接下来详细看看每一种一致性的提供什么样子的正确性。

1.2 线性一致性(Linearizability)

**线性一致性 顾名思义,对于观察者来说 所有的读和写都在一条单调递增的时间线上串行推进。**整个系统对外的表现就是一个原子寄存器,能够很容易得实现CAS(compare and set)操作。

它对读写的要求是 所有的读总能返回最近的写操作的值。

在这里插入图片描述

优点 很明显:寄存器级别的正确性

缺点 很致命:这样的正确性 对写的要求就是 写请求需要写入到每一个服务器才算完成,中间有任何一个服务器宕机/网络分区,写都会卡住,整个系统将完全不可用。

同样的,在操作系统中,我们的CPU访存想要提供线性一致性引入的内存屏障 也会让系统性能受影响。

在这里插入图片描述

原本的写请求写到cpu-cache就可以返回,等待cpu-cache异步刷内存。但是现在,我们加上memory_order_seq_cst,就需要从cpu-cache同步写入到内存完成才返回。这个时候延时将从几个ns降到接近百ns。

1.3 顺序一致性(Sequential consistency)

顺序一致性则降低了线性一致性的正确性标准,不要求整个系统(分布式/单机)对外表现的读写都在一个单调递增的时间线上。顺序一致性则只需要保证一个机器上的进程处理读写请求是按照请求定义的顺序发生的即可。

要求如下:

  1. 不要求操作按照真实的时间序列发生(像下图中,读请求下发的时间在写请求之后,却可以读到这个写请求之前的数据)
  2. 不通进程间的操作执行先后顺序也没有强制要求,但必须是原子的。
  3. 单个进程内的操作顺序必须和编码时的时间顺序一致。

在这里插入图片描述

现在的很多分布式系统对外宣称自己是强一致性系统,其实最高的级别也就是到顺序一致性这里。包括很多人讨论的zookeeper + sync 能否提供线性一致性读 问题,其实也只能提供到顺序一致性级别(正如前面说的,操作系统在内存屏障的情况下才能保证线性一致性,实现zookeeper 时每个机器会开内存屏障?显然不可能)。

1.4 因果一致性(Casual consistency)

因果一致性要求 有**因果相关 **的操作必须按照顺序发生。比如 先发帖子,再有评论,那么发帖子的操作x 一定在评论操作y 之前发生。

因为前面的一致性模型 中对每一个操作都能用一个单一的数值表示(时间),但是在因果一致性模型中,我们会发现每一系列满足因果一致性的操作都是一个集合,我们要确保并发场景下的因果关系,就需要对两个集合进行比较。

这个一致性不要求 整个系统/整个进程 对外拥有一个特定的顺序,所以它所能够容忍的冲突更多,也就是更低的一致性要求,好处也很明显,会对性能比较友好(更高的并发处理)。

在因果一致性的系统实现中 需要捕获因果依赖关系,这个操作在数据库系统中会引入一些计算/存储代价,间接增加了系统的复杂度。
业界很少有因果一致性的系统,虽然其能够允许更高的并发,但是引入的额外复杂度会影响大家的选择。 后续的文章会介绍因果一致性系统的经典实现COPS。

1.5 最终一致性(Eventual consistency)

这里就不多说了,系统不会限制用户的任何操作方式,允许每个原子操作的顺序执行任意的重排。

在某一时刻,会保证能够读到对数据的更新,(某一时刻。。。这里可以算做是一个量子的混合态,不论什么时候,对外的表现就是只有用户读了,可能才会写入成功 or 没有成功,也就是写入的时机取决于用户什么时候读取,哈哈,是不是很有趣)。

2. Zookeeper 的 “线性一致性” 问题

很多网上的文章会说zookeeper 这个分布式协调系统能够提供线性一致性的模型。

我们先不评论说的正确与否,先看看 线性一致性的定义:所有的读操作总能够返回最新写入的值。这个一致性应用到整个zookeeper的分布式系统中来看,也就是 1 号客户端的写入完成,从 2 号客户端立即读,就能读到这个写入的值。

(1)首先,zookeeper是一写,多读,写操作都会交给leader进行,读操作leader-follower都可以处理。那我们把2号客户端的读请求放在follower,也就是说follower要能够实时读到leader写入的数据。这里就需要知道在 zookeeper 的 ZAB 的 Broadcast 阶段,为了实现zookeeper 的性能,leader本地的请求commit 是会按照zxid进行,但是远端follower的的commit 则是异步的(zookeeper论文描述的是A-Linearizability),leader发送commit请求的时候会同时向客户端 返回写入成功,异步向follower发送commit请求。这个时候客户端收到的写入成功并不能代表follower写入成功,所以从follower 读是读不到最新的写入的。

(2)其次,大家会说用sync+read 就可以呀。也就是每一个写/更新 操作都携带sync, 那我们是不是就可以保证读的线性一致性了。。。先看看sync 操作的定义,ZAB 论文中这样描述:

在这里插入图片描述

也就是说在BroadCast 阶段,对集群的update/写操作都会交给leader处理,这个时候让leader 携带sync操作,leader会让这一些更新/写 操作同步到所有的follower 才返回。

听起来好像是这么回事哈,写/更新 操作成功了,之后的从follower读肯定都能读到最新的值了,当然,集群正常情况下(且操作在每一个机器加上内存屏障),从一致性的语义来看,线性一致性读满足了的。然而, 分布式系统我们主体讨论的则是集群异常情况下的一致性表现。

a. 关于sync+read 是否满足线性一致性读问题,先看一下jepsen 对zookeeper 测试过程的一个讨论

场景大概是这样的:

正常情况下的集群如下

在这里插入图片描述

一写多读,多个链接到集群的客户端的写/更新操作会被转发给leader 处理,读请求可以被任何follower处理,sync+read 能够让follower读到leader最新接收到的写入。

但是,当集群发生网络分区的时候:

在这里插入图片描述

之前的leader因为没有办法满足majority,无法成为leader,且写请求会被阻塞。另一边之前的三个follower 因为能够满足majority,则可以重新选举出来一个leader ,从而能够接受写请求。在分区发生的之前可能会出现leader本地已经写入了,但是在同步到远端写入的时候刚好分区,远端的follower写入没有成功。这个时候,远端是三个节点的新集群中其实并没有最新的写入,也就无法满足线性一致性读了。

在这里插入图片描述

b. 关于sync+read 是否满足线性一致性读问题,从 分布式学习交流群中 看到有小伙伴描述了这样一个场景:
在这里插入图片描述

先看场景,就是说不同的客户端想要保证“自己的线性一致性”,他们更新的数据他们希望能够读到,但是更新到读这个过程被其他的客户端更新了,那这个小伙伴认为就不是线性一致性了。

当然,从线性一致性个的语义来看,这个场景并不是线性一致性的场景。线性一致性模型是对整个系统而言的,A 客户端被 B客户端的请求覆盖,然后A读到了B的更新数据,这本身就是整个系统的线性一致性的语义。关于说 A的线性一致性读。。。其实是描述有问题的。。。

还是回到前面 关于zookeeper的线性一致性讨论中,那很明显,在集群异常的情况下,即使有sync操作 , zookeeper也是无法保证严格的线性一致性的语义的。

3. 参考

1. zookeeper paper
2. ZAB paper
3. https://github.com/jepsen-io/jepsen/issues/399
4. https://aphyr.com/posts/291-jepsen-zookeeper
5. https://aphyr.com/posts/313-strong-consistency-models#comment-2578

相关文章:

Java项目:(小程序)全套商城系统(spring+spring mvc+mybatis+layui+微信小程)

源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统功能包括: 商品模块: 商品添加、规格设置,商品上下架等 订单模块: 下单、购物车、支付,发货、收货、评 退款等 营销模块: 积分、优惠券、分销、砍价、拼团、秒 多…

【转】[退役]纪念我的ACM——headacher@XDU

转自:http://hi.baidu.com/headacher/item/5a2ce1d50609091b20e25022 退役了,是时候总结一下我ACM的生涯了。虽然很舍不得,但这段回忆很值得纪念。ACM生涯虽然结束,但是新生活总要继续,还有很多东西需要我去学习&#…

VMware扩大硬盘后修改Linux逻辑卷大小

一、背景随着业务的不断成熟,数据库积累的数据也越来越多了。前些天发现服务器的磁盘将要满了。因此向虚拟化管理员申请增加磁盘空间。由于这个系统是建立在威睿的vSphere平台上的,因此虚拟化管理员只简单地通过 VMware vSphere Client 扩大了磁盘空间&a…

axios与ajax区别

1.jQuery ajax $.ajax({ type: POST, url: url, data: data, dataType: dataType, success: function () {}, error: function () {}});优缺点: 本身是针对MVC的编程,不符合现在前端MVVM的浪潮基于原生的XHR开发,XHR本身的架构不清晰,已经有…

单机 “5千万以上“ 工业级 LRU cache 实现

文章目录前言工业级 LRU Cache1. 基本架构2. 基本操作2.1 insert 操作2.2 高并发下 insert 的一致性/性能 保证2.3 Lookup操作2.4 shard 对 cache Lookup 性能的影响2.4 Erase 操作2.5 内存维护3. 优化前言 近期做了很多 Cache 优化相关的事情,因为对存储引擎较为熟…

Java项目:校园人力人事资源管理系统(java+Springboot+ssm+mysql+jsp+maven)

源码获取:博客首页 "资源" 里下载! 校园人力资源管理系统:学校部门管理,教室管理,学历信息管理,职务,教师职称,奖励,学历,社会关系,工作…

GPS部标平台的架构设计(十)-基于Asp.NET MVC构建GPS部标平台

在当前很多的GPS平台当中,有很多是基于asp.NETsiverlight开发的遗留项目,代码混乱而又难以维护,各种耦合和关联,要命的是界面也没见到比Javascript做的控件有多好看,随着需求的增多,平台已经臃肿不堪。 设计…

关于CSDN不给任何通知强制关闭我的6年博客,我深表痛心

关于CSDN不给任何通知强制关闭我的6年博客,我深表痛心。最近有很长一段时间没有去csdn博客了, 前几天去看的时候发现博客被封闭了。 我联系了管理员,但是没有得到任何回复。 我猜想,可能是不是我在博客文章里面加入 自己网站的网…

Vue 环境搭建(win10)

1.安装node node官网安装地址 推荐安装稳定版本(LTS)以及安装路径为系统盘(C) 查看node安装成功否 注释:以下命令使用 命令提示符(管理员)权限,win10 对user权限的限制了访问权限。node -v 查看…

Java项目:化妆品商城系统(java+Springboot+ssm+mysql+jsp+maven)

源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统主要实现的功能有: 网上商城系统,前台后台管理,用户注册,登录,上架展示,分组展示,搜索,收…

python 绘图脚本系列简单记录

简单记录平时画图用到的python 便捷小脚本 1. 从单个文件输入 绘制坐标系图 #!/usr/bin/python # coding: utf-8 import matplotlib.pyplot as plt import numpy as np import matplotlib as mpl import sysfile_name1 sys.argv[1] data_title sys.argv[2] print(file_name1…

iOS-c语言小练习01

// // main.c // C&#xff0d;变量的地址 // // Created by cgq on 15/4/9. // Copyright (c) 2015年 cgq. All rights reserved. // #include <stdio.h> //访问变量的地址 void test1() { char a A; int b 44; printf("a的值&#xff1a;%d\n",a); pri…

蓝桥杯 【基础练习】 十六进制转八进制

问题描述给定n个十六进制正整数&#xff0c;输出它们对应的八进制数。输入格式输入的第一行为一个正整数n &#xff08;1<n<10&#xff09;。接下来n行&#xff0c;每行一个由0~9、大写字母A~F组成的字符串&#xff0c;表示要转换的十六进制正整数&#xff0c;每个十六进…

泛在网:泛在网

ylbtech-泛在网&#xff1a;泛在网泛在网络来源于拉丁语Ubiquitous&#xff0c;从字面上看就是广泛存在的&#xff0c;无所不在的网络。也就是人置身于无所不在的网络之中&#xff0c;实现人在任何时间、地点&#xff0c;使用任何网络与任何人与物的信息交换&#xff0c;基于个…

Mac 从Makefile 编译 Rocksdb 源码的一些注意事项

文章目录前言Makefile 编译流程1. 平台变量/环境变量的初始化。2. 编译需要的源码文件变量初始化。3. include 目录的设置。4. 编译的执行逻辑。问题记录1&#xff1a;可能的打包命令ar 失效问题5. 执行具体的编译指令问题记录2: jar 包编译前言 最近在Mac 本地编译Rocksdb 过…

Java项目:在线考试系统(单选,多选,判断,填空,简答题)(java+Springboot+ssm+mysql+html+maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能&#xff1a; 学生信息 班级 专业 学号 姓名 在线考试 成绩查询 个人信息 密码修改 教师管理 教师编号 姓名 所教科目 题库管理 单选题 多选题 填空题 判断题&#xff0c;简答题&#xff08;人工…

看了极光推送技术原理的几点思考

看了极光推送技术原理的几点思考 分类&#xff1a; android2012-11-26 20:50 16586人阅读 评论(18) 收藏 举报目录(?)[] 移动互联网应用现状 因为手机平台本身、电量、网络流量的限制&#xff0c;移动互联网应用在设计上跟传统 PC 上的应用很大不一样&#xff0c;需要根据手机…

查询远程或本地计算机的登录账户

用下面这个函数能获取远程或本地电脑的当前登录用户&#xff0c;同时附加了它的计算机名&#xff0c;所以当你查询多台电脑时将知道结果从哪里来。function Get-LoggedOnUser {param([String[]]$ComputerName $env:COMPUTERNAME)$ComputerName | ForEach-Object {(quser /SERV…

LIS ZOJ - 4028

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode4028 memset超时 这题竟然是一个差分约束 好吧呢 对于每一个a[i], l < a[i] < r 那么设一个源点s 使 l < a[i] - s < r 是不是就能建边了 然后对于每一个f[i] 如果前面有一个相等的f[j] 则肯定 a[i…

存储引擎 K/V 分离下的index回写问题

前言 近期在做on nvme hash引擎相关的事情&#xff0c;对于非全序的数据集的存储需求&#xff0c;相比于我们传统的LSM或者B-tree的数据结构来说 能够减少很多维护全序上的计算/存储资源。当然我们要保证hash场景下的高写入能力&#xff0c;append-only 还是比较友好的选择。 …

经典贪心法:时间序列问题及其全局最优性证明

贪心算法是指在对问题求解时&#xff0c;总做出在当前看来是最好的选择。也就是说&#xff0c;不从整体上加以考虑&#xff0c;它所作出的仅仅是在某种意义上的局部最优解。一旦贪心算法求出了一个可行解&#xff0c;就要确定这个算法是否找到了最优解。为此&#xff0c;要么证…

Java项目:在线水果商城系统(java+JSP+Spring+SpringMVC +MyBatis+html+mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能&#xff1a; 区分为管理员用户和普通用户&#xff0c;普通用户&#xff1a;用户注册登录&#xff0c;首页水果展示&#xff0c;商品分类展示&#xff0c;购物车添加&#xff0c;下单&…

曲苑杂坛--收缩数据库文件

很多人在删除大量数据后收缩数据库&#xff0c;却发现没法收缩到预期效果。 由于使用DBCC SHRINKFILE来收缩数据文件时&#xff0c;是针对数据区来收缩&#xff0c;因此可以先使用DBCC SHOWFILESTATS来查看文件中未使用的分区数(TotalExtents-UsedExtents)&#xff0c;如果删除…

python字典去重

今天实习的web大表哥说帮我看环境不过前提是要我帮他写个python合并列表的demo,大概思路就是利用zip库进行keys和values的遍历&#xff0c;然后在输出就行key1{name1:小明,name2:小红} key2{小明:[men,20],小红:[women,30]} for k,v in zip(key1.values(),key1.keys()):for i, …

关于 线程模型中经常使用的 __sync_fetch_and_add 原子操作的性能

最近从 kvell 这篇论文中看到一些单机存储引擎的优秀设计&#xff0c;底层存储硬件性能在不远的未来可能不再是主要的性能瓶颈&#xff0c;反而高并发下的CPU可能是软件性能的主要限制。像BPS/AEP/Optane-SSD 等Intel 推出的硬件存储栈已经能够在延时上接近DRAM的量级&#xff…

R 语言爬虫 之 cnblog博文爬取

Cnbolg Crawl a). 加载用到的R包 ##library packages needed in this case library(proto) library(gsubfn) ## Warning in doTryCatch(return(expr), name, parentenv, handler): 无法载入共享目标对象‘/Library/Frameworks/R.framework/Resources/modules//R_X11.so’&#…

Java项目:宿舍管理系统(java+jsp+SSM+Spring+mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能&#xff1a;包括学生管理&#xff0c;班级管理&#xff0c;宿舍管理&#xff0c;人员信息维 护。维修登记&#xff0c;卫生管理&#xff0c;访客管理等等。 二、项目运行 环境配置&am…

项目管理5大过程组,42个过程一句话讲解

2019独角兽企业重金招聘Python工程师标准>>> 启动过程组&#xff1a;&#xff08;1&#xff09;制定项目章程&#xff1a;诞生项目&#xff0c;并为项目经理“正名”&#xff1b;&#xff08;2&#xff09;识别干系人&#xff1a;搞清楚谁与项目相关&#xff1b;规划…

Android Q 变更和新特性

安全和隐私变更 隐私保护是Android Q重要的主题之一&#xff0c;Android Q带来了一系列增强用户隐私保护的变更。 1 应用文件存储空间限制 应用访问限制是Android Q影响最大变更之一。在Android Q系统中&#xff0c;应用只可以通过路径读取自己应用沙箱内的文件&#xff0c;如果…

KVell 单机k/v引擎:用最少的CPU 来调度Nvme的极致性能

文章目录前言KVell背景业界引擎使用Nvme的问题CPU 会是 LSM-kv 存储的瓶颈CPU 也会是 Btree-kv 存储的瓶颈KVell 设计亮点 及 总体架构实现KVell 设计亮点1. Share nothing2. Do not sorted on disk, but keep indexes in memory3. Aim for fewer syscalls , not for sequentia…