最近阅读了《SRE Google运维解密》的第23章,有一些感触,记录一下。

日常工作中,我们经常需要一些服务分布式的运行。跨区域如跨城、跨洲部署运行分布式系统往往是容易的,但是如何保证各系统间状态的一致是困难的。如何保证服务的高可靠、高可用,就是服务提供的数据是准确的,关键在于一些状态的传递,这个时候就需要利用分布式共识系统来维护相关状态,确保大家拿到的状态信息最终是一致的。

要想实现一个分布式共识系统,需要采用一些经过理论验证的方案,最基础的就是CAP理论。

CAP 理论

CAP原则是指对于一个分布式系统,Consistency 一致性、Availability 可用性、Partition tolerance 分区容错性 三者是不可能同时满足的,换成通俗的说法就是:
1、每个节点上的所见数据是一致的
2、每个节点都可以访问数据
3、可以承受网络分区问题

CAP理论指出,对于分布式系统,最多能实现上面两点。同时由于现实环境中,网络分区问题迟早会发生(如光纤断、延时、丢包等问题),构建分布式系统就需要在高可用和一致性之间选择。

BASE 理论

我们对于传统的ACID数据存储语义(原子性、一致性、隔离性、持久性)很熟悉,这种方案为我们提供了数据的强一致性。但是分布式系统提供了的是另外一套语义,BASE语义(基本可用 basic available、软状态 soft state、最终一致性 eventual consistency)。ACID的问题在于遇到超大的数据集和事物时,需要很高的硬件成本,BASE就是用来解决此类问题,它是对CAP理论中可用性和一致性权衡的结果,其核心思想是即使无法做到强一致性,但应用可以根据自身的特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。

基本可用:指分布式系统在出现不可预知故障的时候,允许损失部分可用性——但请注意,这绝不等价于系统不可用。
软状态:和硬状态相对,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。
最终一致性:强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。

分布式系统出现问题的场景

分布式系统出现问题主要是因为网络问题。

脑裂

对于使用心跳机制来提供高可用的服务,遇到网络问题时,可能存在服务同时提供主写或者同时挂掉的情况。这个问题说明,领头人选举不能通过简单的心跳来实现。

需要人工干预的灾备切换

对于 Mysql 的主从复制模式,利用外部程序监控主实例,根据主实例状态决定是否提升从节点成为主实例。这种解决方法提供了CP,没办法保证可用性A。

有问题的小组成员算法

使用 Gossip 算法进行领头人选举,在网络问题时,不能满足C,可以满足AP。

分布式共识问题解决方案 Paxos 协议

Paxos 协议本书没有详细的介绍,说的也不是很形象。可以参考生活中的Paxos,原来你我都在使用——对Paxos生活化的解读以及Paxos算法细节详解(一)--通过现实世界描述算法

下面这个图概括了协议中的几个角色及关系。

分布式共识算法是很底层、很原始的,真正有用的是基于此之上的系统组件,包括:数据存储、配置存储、队列、锁机制和领头人选举服务。

后面介绍了分布式共识的系统架构模式,包括了几个组件:可靠的复制状态机、领头人选举机制、分布式协调和锁服务、分布式队列和消息传递。

可靠的复制状态机

RSM (replicated state machine) 是一个能在多个进程中用同样顺序执行同样的一组操作的系统。

可靠的数据存储

领头人选举机制

分布式协调和锁

可靠的分布式队列和消息传递

性能问题

文中介绍了几种分布式共识问题提高性能的方法,没有最优的方案,需要根据不同的因子和场景来进行选择。

参考资料
1、SRE Google运维解密
2、生活中的Paxos,原来你我都在使用——对Paxos生活化的解读
3、Paxos算法细节详解(一)--通过现实世界描述算法
4、CAP原则
5、CAP原则(CAP定理)、BASE理论
6、

SRE学习笔记:分布式共识系统、Paxos协议的更多相关文章

  1. Linux学习笔记(七) 查询系统

    1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...

  2. 物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus

    物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus 物联网 (IoT) 不只是新技术,还是与旧技术的集成,其关键在于通信.可用的通信方法各不相同,但是,各种不同的协议在将海量“事物”连接 ...

  3. [原创]java WEB学习笔记07:关于HTTP协议

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. [学习笔记] Numpy基础 系统学习

    [学习笔记] Numpy基础 上专业选修<数据分析程序设计>课程,老师串讲了Numpy基础,边听边用jupyter敲了下--理解+笔记. 老师讲的很全很系统,有些点没有记录,在PPT里就不 ...

  5. 学习笔记TF048:TensorFlow 系统架构、设计理念、编程模型、API、作用域、批标准化、神经元函数优化

    系统架构.自底向上,设备层.网络层.数据操作层.图计算层.API层.应用层.核心层,设备层.网络层.数据操作层.图计算层.最下层是网络通信层和设备管理层.网络通信层包括gRPC(google Remo ...

  6. Javaweb学习笔记2—Tomcat和http协议

      今天来讲javaweb的第二个阶段学习. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的思维导图感兴趣并且想看到你们跟详细的备注信息,请点击下 ...

  7. TCP/IP详解学习笔记(3)IP协议ARP协议和RARP协议

    把这三个协议放到一起学习是因为这三个协议处于同一层,ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP得到要传输的数 ...

  8. FastSocket学习笔记~制定自已的传输协议

    对于TCP或者UDP来说,它们作于传输层的协议,有着自己的标准,或者叫格式,在我们看TCP格式之前先了解一下计算机的基础知识,字节,它是计算机世界的一个小单位,也是我们可以理会到的,如一个utf-8英 ...

  9. Linux学习笔记(三):系统执行级与执行级的切换

    1.Linux系统与其它的操作系统不同,它设有执行级别.该执行级指定操作系统所处的状态.Linux系统在不论什么时候都执行于某个执行级上,且在不同的执行级上执行的程序和服务都不同,所要完毕的工作和所要 ...

随机推荐

  1. #JS 前端javascript规范文档

    一.规范目的 为提高团队协作效率,便于前端后期优化维护,输出高质量的文档. 二.基本准则 符合web标准,结构表现行为分离,兼容性优良.页面性能方面,代码要求简洁明了有序, 尽可能的减小服务器负载,保 ...

  2. 【LOJ】#2270. 「SDOI2017」天才黑客

    题解 显然要记录每个点来的状态,这样会扩充出点度的平方条边,就gg了 删掉所有的点,把每个边拆成两个点,连一条边权为c 这个时候我们考虑对于原先的每个点,将所有与其相连边所需要的节点(不管是进入还是出 ...

  3. Unit的各种断言

    今天遇到这个问题,就值得自己总结一下. 1.介绍 JUnit为我们提供了一些辅助函数,他们用来帮助我们确定被测试的方法是否按照预期的效果正常工作,通常,把这些辅助函数称为断言.下面我们来介绍一下JUn ...

  4. 001.Pip简介安装使用

    一 PIP简介 pip类似RedHat里面的yum,使用PIP安装软件非常便捷快速. 二 PIP下载安装 方式一: [root@localhost ~]# yum install -y epel-re ...

  5. 001.hadoop及hbase部署

    一 环境准备 1.1 相关环境 系统:CentOS 7 #CentOS 6.x系列也可参考,转换相关命令即可. hadoop包:hadoop-2.7.0.tar.gz #下载官方地址:http://w ...

  6. 用pt-stalk定位MySQL短暂的性能问题

    背景] MySQL出现短暂的3-30秒的性能问题,一般的监控工具较难抓到现场,很难准确定位问题原因. 对于这类需求,我们日常的MySQL分析工具都有些不足的地方: 1. 性能监控工具,目前粒度是分钟级 ...

  7. Java集合&Spring源码浅读

    记录自己现在知道的,以后了解了更多的话,再继续补上来 Java集合类 Collection 接口 说明:是List,set 的父类.定义了集合初始模样.集合只存储对象. Jdk8文档,内部方法定义有: ...

  8. jquery 下拉列表选择值

    选择下拉列表值样例方式 $("#updateAppName").get(0).selectedIndex = 0; $("#updateAppName").ge ...

  9. linux 下安装 RZ SZ命令 以及使用

    对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / sz命令很方便的帮我们实现了这个功能,rz是把win的文件上传到linux上    sz是吧 ...

  10. mysql导入csv文件

    今天尝试将Oracle中的数据导入到mysql中,在SQLyog工具其中看到一些sql语句,拿来记录一下,说不定以后就用的着呐! -----查看ydtf数据库中的基础表,就是用户创建了哪些表 SHOW ...