测试分布式系统的线性一致性

2023-10-27

测试分布式系统的线性一致性
一. 介绍
      正确实现一个分布式系统是非常有挑战的一件事情,因为需要很好的处理并发和失败这些问题。网络包可能被延迟,重复,乱序或者丢弃,机器可能在任何时候宕机。即使一些设计被论文证明是正确的,也仍然很难再实现中避免 bug。
      通常对于一个 key-value store,我们对于它在顺序操作下面的行为都能有一个直观的认识:Get 操作如果在 Put 的后面,那么一定能得到 Put 的结果。譬如,如果 Put("x", "y") ,那么后面的 Get("x") 就能得到 "y",如果得到了 "z",那么这就是不对的。
      对于一个基于顺序规范的并发操作来说,我们会用一个一致性模型,也就是线性一致性来说明它的正确性。在一个线性一致性的系统里面,任何操作都可能在调用或者返回之间原子和瞬间执行。除了线性一致性,还有一些其他一致性的模型,但多数分布式系统都提供了线性一致性的操作:线性一致性是一个强的一致性模型,并且基于线性一致性系统,很容易去构建其他的系统。
      测试:有了一个正确性的定义,我们就可以考虑如何去测试分布式系统了。通常的做法就是对于正确的操作,不停的进行随机的错误注入,类似机器宕机,网络隔离等。我们甚至能模拟整个网络,这样我们就能做长时间的网络延迟等。因为测试时随机的,我们需要跑很多次从而确定一个系统的实现是正确的。
      线性一致性:一个更好的办法就是并发的客户端完全跑随机的操作。譬如,循环的去调用 kvstore.put(rand(), rand()) 和 kvstore.get(rand()),有可能会只用很少的 key 去增大冲突的概率。但在这种情况下,我们如何定义什么是正确的操作呢?在上面的简单的测试里面,因为每个 client 都操作的是一个独立的 key,所以我们可以非常明确的知道输出结果。
       但是 clients 并发的操作同一堆 keys,事情就变得复杂了。我们并不能预知每个操作的返回值因为这并没样一个唯一的答案。但我们可以用另一个办法:我们可以记录整个操作的历史,然后去验证这个操作历史是线性一致的。
      线性一致性验证:一个线性一致性验证器会使用一个顺序规范和一个并发操作的历史,然后执行一个判定程序去检查这个历史在规范下面是否线性一致。
二. 相关测试的系统
2.1  TLA+的形式规范测试
     理论上,所有的生产系统都会有一个形式规范,而且一些系统也已经有了,譬如 Raft 就有一个用 TLA+ 写的形式规范。但不幸的是,大部分的系统是没有的。
2.2  使用Porcupine进行线性一致性测试
     详见:http://www.jianshu.com/p/9aedd234ef62
2.3  使用Chaos测试分布式系统线性一致性
      详见: http://www.jianshu.com/p/2e65e6f37c76

三. 参考资料:
   1.  测试分布式系统的线性一致性:http://www.jianshu.com/p/bddfce1494d6
   2.  使用 Porcupine 进行线性一致性测试:http://www.jianshu.com/p/9aedd234ef62
   3.  使用 Chaos 测试分布式系统线性一致性:http://www.jianshu.com/p/2e65e6f37c76
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测试分布式系统的线性一致性 的相关文章

  • mybatis 自动化处理 mysql 的json类型字段 终极方案

    文章目录 mybatis 自动化处理 mysql 的json类型字段 终极方案 why json 简介 mysql 建表 json 字段 添加1条json 数据 对应的java对象 JsonEntity mybatis 不使用 通用mapp
  • 大数据学习之HiveSQL

    一 DDL 数据定义语言 1 DDL概述 数据定义语言 Data Definition Language DDL 是SQL语言集中对数据库内部的对象结构进行创建 删除 修改等的操作语言 这些数据库对象包括database schema ta
  • 【高性能】Matlab的并行计算之parfor

    当matlab计算量很大 重复独立的循环计算很多的时候 我们可以使用matlab的并行计算 这里我先试验了parfor并行计算 以下代码仅适合新版的matlab 改编自 实战matlab之并行程序设计 启动代码 function pool

随机推荐

  • Mxnet 源码编译

    源码拷贝下来 git clone recursive https github com dmlc mxnet 郭峰把openblas安装好了 cd mxnet make j 24 USE OPENCV 1 USE BLAS openblas
  • elasticsearch服务相关脚本

    转载 Ubuntu18配置elasticsearch服务开机自启踩坑 https blog csdn net qq 32635069 article details 89003055 depth 1 utm source distribut
  • top-k的应用

    top k的应用 topk指的是 保存一段数据的最大或者最小的k位数 在code中或者工程中右很重要的应用 举例 查询超大量数据中 最小或者最大的 第 k位数 正常使用排序 缺点 内存占用会超出正常范围 相对简单的做法是 遍历K次 每次选出
  • Flex 发布模式

    Flex 平台支持范围广泛的发布模式 它们是 1 客户端模式 即应用程序只运行在客户端上而不需要服务器资源 2 使用简单的RPC 访问服务器数据 即使用HTTPService HTTP GET 或POST 请求 和WebService 通过
  • LeetCode——021

    21 Merge Two Sorted Lists My Submissions QuestionEditorial Solution Total Accepted 122136 Total Submissions 345783 Diffi
  • JAVA字符流InputStreamReader读取文本

    二 字符流 1 单个字符读取 public static void main String args try InputStreamReader in new InputStreamReader new FileInputStream D
  • 简体ProDAD Mercalli SAL 6.0全网唯一系统讲解课中文教程

    ProDAD Mercalli SAL 镜头抖动处理软件 是一个视频防抖插件 可以固定拍摄时的图像抖动 消除摄像机拍摄视频时抖动 颠簸和颤抖的影响 提高画面质量 是进行后期摄影图像编辑必不可少的插件之一 虽然ProDAD Mercalli
  • 小学生机器人编程知识

    小学生机器人编程知识 现在的家长在培养孩子的学习方面也是非常的认真的 会给孩子选择一些能够有利于孩子成长的课程 就拿现在很多的家长给孩子选择少儿编程的课程来说 他们想要孩子去学习机器人编程的课程 但是他们对于小学生机器人编程知识并不是很清楚
  • windows下设置redis服务开机后自动启动

    1 配置环境变量 在path配置环境变量 2 在redis安装目录下打开cmd 输入如下代码 redis server exe service install redis windows conf loglevel verbose 3 这样
  • MAC下搭建Android Studio

    JDK1 8安装 1 到 http www oracle com technetwork java javase downloads jdk8 downloads 2133151 html 下载jdk8 2 双击安装 3 安装完成 在命令行
  • 7-13 日K蜡烛图 (15分)

    7 13 日K蜡烛图 15分 股票价格涨跌趋势 常用蜡烛图技术中的K线图来表示 分为按日的日K线 按周的周K线 按月的月K线等 以日K线为例 每天股票价格从开盘到收盘走完一天 对应一根蜡烛小图 要表示四个价格 开盘价格Open 早上刚刚开始
  • Java复习-20-接口(1)

    接口的定义及使用 如果相对外部隐藏全部的实现细节 就要通过接口来实现 接口的定义 使用interface关键字来定义 由于接口描述的是一个公共的定义标准 所以在接口之中所有的抽象方法的访问权限都为public interface IMess
  • 数据库种类有什么?三种不同数据库介绍

    一 数据库种类有哪些 早期较为时兴的数据库种类有三种 分别是层次式数据库 网络式数据库和关系型数据库 而在如今的互联网中 最常见的数据库种类主要有2种 即关系型数据库和非关系型数据库 二 层次数据库介绍 层次数据库是最开始研制的数据库系统软
  • python获取时间前一天

    可以使用 Python 的 datetime 模块来获取时间前一天的日期 首先 需要导入 datetime 模块 import datetime 然后 可以使用 datetime 模块中的 datetime datetime now 函数获
  • GET、POST、PUT、DELETE等用法

    1 向服务器请求数据 GET get请求是用来获取数据的 只是用来查询数据 不对服务器的数据做任何的修改 新增 删除等操作 get请求会把请求的参数附加在URL后面 2 提交资源到服务器 post post请求一般是对服务器的数据做改变 常
  • so部标协议模拟服务器,808部标协议

    满意答案 豆 浆 2016 10 12 采纳率 58 等级 25 已帮助 62843人 基于部标JT T 808协议及数据格式的GPS服务器 2011年5月10日中国交通通信信息中心下发了 印发道路运输车辆卫星定位系统平台和道路运输车辆卫星
  • python 43行 写一个天气查询爬虫+GUI图形界面化

    这个爬虫爬的是 墨迹天气 https tianqi moji com weather china henan xinxiang 分析了一下这个网址 不同城市的网址就后边的的拼音不同 这时候就只需拼接用户输入的网址就可得到要查询的网址 然后通
  • Putty基础教程之(一).入门命令学习及编写HTML

    这篇文章主要介绍Putty的基础用法 同时通过Putty来编辑HTML文件 一方面是自己最近学习的在线笔记 另一方面希望文章对你有所帮助 Putty是Windows下操作Linux命令的小工具 也是一个跨平台的远程登陆工具 非常好用 常见命
  • 【IT之路】MyEclipse部署java web项目到Tomcat

    1 Java web 项目部署发布到tomcat 2 启动tomcat
  • 测试分布式系统的线性一致性

    测试分布式系统的线性一致性 一 介绍 正确实现一个分布式系统是非常有挑战的一件事情 因为需要很好的处理并发和失败这些问题 网络包可能被延迟 重复 乱序或者丢弃 机器可能在任何时候宕机 即使一些设计被论文证明是正确的 也仍然很难再实现中避免