分布式 | 青训营笔记

91 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天

分布式概述

分布式系统是计算机程序的集合,这些程序利用跨多个独立计算节点的计算资源来实现共同的目标。

  • 分布式存储:Google File System,Ceph,Hadoop HDFS, Zookeeper
  • 分布式数据库: Google Spanner,TiDB,HBase,MongoDB
  • 分布式计算:Hadoop,Spark,YARN

系统模型

故障模型

下列依次包含关系

  • Byzantine failure 节点可以任意篡改发送到其他节点的数据 :如网络故障,软件故障
  • Authentication detectable byzantine failue 节点可以篡改数据,但不能伪造其他节点的数据:如磁盘坏道,内存故障
  • Performance failure 节点未在特定时间段内收到数据,即时间太早或太晚:如网络分区,线缆故障
  • Omission failure 节点收到数据的时间无限晚,即收不到数据:如网络故障,线缆故障,电源故障
  • Crash failure 在上一个的基础上,增加了节点停止响应的假设,持续性:如服务器主板,板卡故障,内核崩溃
  • Fail-stop failure 在上一个的基础上增加了错误可检测的假设:如磁盘故障,磁盘坏道

拜占庭将军问题

其实就是TCP的建立问题,对于课程中的思考:

为何为三次握手,不是两次或者四次?

  • 两次握手在第二次发送ack的时候就建立了连接;第三次握手是为了阻止重复历史连接的初始化,避免资源浪费,以及同步双方的初始序列号;三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数

挥手过程中,如果FIN报文丢失,发生什么?

  • 第一次挥手的FIN报文:发送FIN后会等待ACK报文的抵达,此时客户端的连接进入到 FIN_WAIT_1 状态。

    正常情况下,如果能及时收到服务端(被动关闭方)的 ACK,则会很快变为 FIN_WAIT2状态。如果一直没收到ACK,就会触发超时重传机制判定FIN报文丢失,于是会进行重发,重发次数由tcp_orphan_retries控制,第一次重发等待RTO,第二次为2RTO,以此类推直到最后一次重发结束,再等待n * RTO后,会直接断开连接;

  • 第三次挥手的FIN报文:在第二次挥手结束后,连接处于 CLOSE_WAIT 状态,顾名思义,它表示等待应用进程调用 close 函数关闭连接。此时,内核是没有权利替代进程关闭连接,必须由进程主动调用 close 函数来触发服务端发送 FIN 报文。服务端处于 CLOSE_WAIT 状态时,调用了 close 函数,内核就会发出 FIN 报文,同时连接进入 LAST_ACK 状态,等待客户端返回 ACK 来确认连接关闭。如果迟迟收不到这个 ACK,服务端就会重发 FIN 报文,重发次数仍然由 tcp_orphan_retries 参数控制,这与客户端重发 FIN 报文的重传次数控制方式是一样的。对于客户端,如果在参数tcp_fin_timeout时间内没收到第三次挥手的FIN报文,则会断开连接

共识和一致性

  • 拜占庭将军 =》 3*m + 1 个将军 ,其中m个“叛徒”,可以增加m轮协商,也能达成一致
  • 最终一致性:A,B都读C C在写1 读的可能为1or0 但最终必然为1
  • 线性一致性:A读到新值时,立刻同步给B.

CAP理论

C (Consistence) 一致性,指数据在多个副本之间能够保持一致性的特性(严格的一致性)

A (Availability) 可用性,指系统提供的服务必须一直处于可用状态,每次请求都能获取到非错的响应---但是不能保证获取的数据为最新数据。

P (Network partitioning) 分区容错性,分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障。

  • 在选择P的情况下,C和A只能选一个:将故障节点转移给备用节点负责

ACID理论-事务特性

  • 原子性 Atomicity:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
  • 一致性 Consistency:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作
  • 隔离性 Isolation:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)
  • 持久性 Durability:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失