C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
  • 架构基础

    • 发展历程
    • 服务演化
    • ORM框架
    • RPC框架
  • 分布式系统

    • 分布式系统 - 基础
    • 分布式系统 - 设计
    • 分布式系统 - 缓存
    • 分布式系统 - 通信方式
    • 分布式系统 - 一致性
    • 分布式系统 - 锁
    • 分布式系统 - 解决高并发、高性能、高可用
  • 微服务

    • 微服务 - 简介
    • 微服务 - 学习路线
    • 微服务 - 服务网关
    • 微服务 - 通信方式
    • 微服务 - 消息队列
    • 微服务 - 保护
    • 微服务 - 分布式搜索
    • 微服务 - 分布式事务
    • 微服务 - 多级缓存
    • 微服务 - 幂等性设计
  • 中间件

    • 消息队列 - ZeroMQ

      • ZeroMQ - 经典例子
      • ZeroMQ - 基础
      • ZeroMQ - 进阶
      • ZeroMQ - 高级请求-应答模式
    • RPC调用 - Dubbo

      • Dubbo - 框架学习
    • 配置中心 - Consul

      • Consul - 概述
      • Consul - 学习内容
      • Consul - 安装与使用
      • Consul - 服务健康检查
      • Consul - 常用的API
      • Consul - 存储个K/V
    • 配置中心 - Apollo

      • Apollo - 概述
      • Apollo - 设计
      • Apollo - Docker部署
      • Apollo - 使用配置中心
    • 监控平台 - Cat

      • Cat - 概述
      • Cat - Docker快速部署
      • Cat - C++客户端的docker镜像
    • 数据处理管道 - Logstash

      • Logstash - Elastic 总览
      • Logstash - 工作原理
      • Logstash - docker部署
      • Logstash - 实践
    • 服务网关 - Kong

      • Kong - 概述
      • Kong - Docker快速部署
      • Kong - C++客户端的docker镜像

分布式系统 - 基础

  • 分布式系统基础
  • 分布式系统的挑战
    • 协作模式
    • 数据一致性
    • 效率问题
  • 分布式理论基础
  • 分布式一致性算法
  • 分布式互斥
    • 集中式算法
    • 分布式算法
    • 令牌环算法

分布式系统基础

A distributed system is one in which the failure of a computer you didn’t even know existed can render your own computer unusable. -- Leslie Lamport

分布式系统的挑战

协作模式

多台机器之间如何协作是非常重要的,选择主从模式、对等模式还是其他协作方式,直接决定了系统最后的运行效率。

数据一致性

单体架构中,数据的存储、读取和计算等都在一处,处理起来很方便,但在分布式架构中,会有多处进行数据处理,那如何保证服务器间数据在同一时刻是一致的、客户端读取的都是最新结果?

效率问题

限制效率的因素有很多,除了跨机房、跨地域的分布式架构自带的物理限制,还有节点规模越来越大而带来的沟通效率等问题。

分布式理论基础

  • 分布式理论 - CAP
  • 分布式理论 - BASE

分布式一致性算法

  • 一致性Hash算法
  • Paxos算法
  • Raft算法
  • ZAB算法

分布式互斥

集中式算法

我们引入一个协调者程序,得到一个分布式互斥算法。每个程序在需要访问临界资源时,先给协调者发送一个请求。如果当前没有程序使用这个资源,协调者直接授权请求程序访问; 否则,按照先来后到的顺序为请求程序“排一个号”。如果有程序使用完资源,则通知协调者,协调者从“排号”的队列里取出排在最前面的请求,并给它发送授权消息。拿到授权消息的程序,可以直接去访问临界资源。

一个程序完成一次临界资源访问,需要如下几个流程和消息交互:

  1. 向协调者发送请求授权信息,1 次消息交互;
  2. 协调者向程序发放授权信息,1 次消息交互;
  3. 程序使用完临界资源后,向协调者发送释放授权,1 次消息交互。

分布式算法

当一个程序要访问临界资源时,先向系统中的 其他程序发送一条请求消息,在接收到所有程序返回的同意消息后,才可以访问临界资源。其中,请求消息需要包含所请求的资源、请求者的 ID,以及发起请求的时间。这就是民主协商法。在分布式领域中,我们称之为分布式算法,或者使用组播和逻辑时钟的算法。如图所示,程序 1、2、3 需要访问共享资源 A。在时间戳为 8 的时刻,程序 1 想要使用资 源 A,于是向程序 2 和 3 发起使用资源 A 的申请,希望得到它们的同意。在时间戳为 12 的时刻,程序 3 想要使用资源 A,于是向程序 1 和 2 发起访问资源 A 的请求。

一个程序完成一次临界资源的访问,需要进行如下的信息交互:

  1. 向其他 n-1 个程序发送访问临界资源的请求,总共需要 n-1 次消息交互;
  2. 需要接收到其他 n-1 个程序回复的同意消息,方可访问资源,总共需要 n-1 次消息交互。(或者收到大于(n-1)/2的消息时,即可访问资源)

令牌环算法

所有程序构成一个环结构,令牌按照顺时针(或逆时针)方向在程序之间传递,收到令牌的程序有权访 问临界资源,访问完成后将令牌传送到下一个程序; 若该程序不需要访问临界资源,则直接 把令牌传送给下一个程序。在分布式领域,这个算法叫作令牌环算法,也可以叫作基于环的算法。

  • 因为在使用临界资源前,不需要像分布式算法那样挨个征求其他程序的意见了,所以相对而言,在令牌环算法里单个程序具有更高的通信效率。同时,在一个周期内,每个程序都能访问到临界资源,因此令牌环算法的公平性很好。但是,不管环中的程序是否想要访问资源,都需要接收并传递令牌,所以也会带来一些无效 通信。假设系统中有 100 个程序,那么程序 1 访问完资源后,即使其它 99 个程序不需要访问,也必须要等令牌在其他 99 个程序传递完后,才能重新访问资源,这就降低了系统的实时性。
Last Updated:
Contributors: klc407073648
Next
分布式系统 - 设计