Skip to content

Latest commit

 

History

History
107 lines (66 loc) · 4.87 KB

distribution.md

File metadata and controls

107 lines (66 loc) · 4.87 KB
created_date 2023-03-10

[TOC]

分布式算法

Paxos

消息传递(客户端向服务端传递消息)

  1. 消息损坏

    • 解决办法:在消息中增加校验码
  2. 消息丢失

    • 解决办法:服务端接收到消息后向客户端发送确认消息;客户端一定时间内诺没有收到确认消息,则重发消息。
  3. 消息重复发送

    • 解决办法:每条消息内添加序列号,防止服务端重复执行指令。
  4. 消息延迟

    • 场景:不同服务端节点接收到不同客户端消息的时间点不一样,导致服务端节点间的数据不一致。
    • 解决办法:另所有指令在服务端节点上将被按序执行,简称为状态复制(主从复制)
  5. 状态复制存在单节点故障

    • 解决办法:确保在任何时候只有一个客户端在发送消息。加锁、互斥。通过给所有的服务端节点添加锁。
  6. 加锁存在一系列问题

    • 问题
      1. 部分节点宕机,不反回锁。
      2. 多个客户端都锁定了部分服务端节点。
      3. 客户端释放锁之前就发生了故障。
    • 解决办法:通过朴素的基于票的协议
  7. 朴素的基于票的协议 -- 使用一个弱化形式的锁机制,票(Ticket)。

    • 服务端节点可以随时发布票,票可以是有先后顺序的。
    • 票是可以过期的。
    • 客户端向所有服务端节点请求一张票;当有收到过半数的票;则向所有服务器发送获得的票和指令;服务端节点检查票是否有效,有效则存储指令;过半数的服务端节点给客户端正反馈;客户端通知所有服务器执行指令。
  8. 朴素的基于票的协议存在一个可能的问题。客户端通知所有服务端节点执行指令时,部分服务端节点的指令已经被另一个客户端更改。

raft协议

  • 是分布式数据一致性算法
  • 是leader-follower模式
  1. Raft 工作流程分为Propose,Append,Broadcast 和 Apply。

    1. 客户发起交易,叫做 Propose
    2. 记录交易,这个叫做 Append
    3. 通知其他网点,这个叫做 Broadcast
    4. 等最后知道大部分网点都确认了这笔交易记录,就执行交易,也就是 Apply。

对于客户 A,操作是 Propose,Append,Broadcast, Apply,对于客户 B 也是一样的流程,之前我们必须等 A 完成了,才能处理 B。 3. Batch

如果很多客户同时要发起交易,那么我们可以将这些交易记录,用一个消息发送到其它网点,这样我们就不需要一个一个的发送消息了,这就是 Batch。

各个网点之间距离还是有点远的,消息传递的时间开销还是有点大的。使用 Batch 可以减少消息的发送次数,自然就能提高效率了。

分布式CAP理论

  • 分布式系统的定义: 一个系统的服务分布在联通的服务器节点上,服务之间通过消息传递进行通信和动作协调的系统。

  • C Consistency 可用性。系统中的部分服务发生故障后,系统也能响应客户端的读写请求。

  • A Availability 数据一致性。系统中的所有服务,当进行数据处理时,持有的数据副本都是相同的。

  • P Partition tolerance 分区容错性。当服务器节点之间网络通信异常导致丢包、延迟、中断等时,不影响系统对外提供的服务。

  • 分布式系统不能同时满足3个要求的根本原因:由于不同的服务设置在了不同的服务器节点上,存在网络延迟故障等。

  • 假设存在nodeA 和 nodeB 两个服务器节点,节点间相互同步数据保持数据的一致性。 满足CA:发生网络故障时,服务器节点间无法进行数据同步,但不影响,因为所有的服务都被部署在了同一个服务器节点上。 满足AP:发生网络故障时,服务器节点间无法进行数据同步,为了保持数据的一致性,停止对外提供服务。 满足CP:发生网络故障时,服务器节点间无法进行数据同步,为了对外提供服务,旧的数据被返回。

微服务

  • 分而治之的思想。
  • 一种架构风格,软件的开发模式。
  • 行为:将集成所有功能的一个进程 按功能模块拆分为 多个进程。
  • 优点:可扩展,功能内聚,解耦,敏捷开发。
  • 缺点:进程间的通信带来了其它的问题,网络可靠性,通信安全,网络时延。

算法

  1. 一致性hash算法的目的
    相当于提供了一个虚拟的中间层,把虚拟的slot和真实的物理节点关联起来,当动态地添加和减少节点时,能够有效地减少数据的迁移量。