抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

分布式系统基础

  • 什么是分布式系统?

    分布式系统是若干独立计算机的集合,这些计算机对于用户来说就是单个系统。

  • 分布式系统面临什么挑战?

    • 异构性:分布式系统由不通网络、操作系统、硬件和编程语言组成,必须由一种通用协议来屏蔽异构系统间的差异。往往用中间件来处理差异。
    • 缺乏全球时钟:交换消息依赖对于程序动作发生时间的共识,计算机同步时钟准确性受到极大限制。
    • 一致性:如何保证各主机间数据的一致性
    • 故障独立性:应该允许部分故障而不会影响整个系统的正常使用
    • 并发:系统中每个资源必须被设计为是并发环境中安全的
    • 透明性:系统中任何组件故障对于用户应是不可见的
    • 开放性:所有组件的接口必须遵循一定规范并能理解维护
    • 安全性:对网络上所有敏感信息进行加密
    • 可扩展性:系统要能随业务量增加而相应扩展

CAP

在分布式系统中不可能同时提供以下三个保证:

  • 一致性Consistency:所有节点同一时间看到的是相同的数据
  • 可用性Availability:不管是否成功,确保每个请求都能收到响应
  • 分区容错性Partition Tolerance:将系统任意分区后,在网络故障时仍能操作。

CAP不可能都满足的证明,只要证反即可。以下就是证反思路:

  1. 有两个节点A和B,A和B上都有一个共享的数据块V
  2. 当正常的时候,A的应用向数据块V写了一个新值,为V1,V之间同步,V1从A节点同步到B节点,B的应用去读取能读到V1的值。
  3. 当网络故障时,A的应用向数据块V写了一个新值,为V2,V之间同步失败,V2无法从A节点同步到B节点,B的应用去读的还是V的旧值,而不是V2的值。
  4. 因此在网络故障时A和B出现了数据不一致的情况。

CAP模型

  1. 牺牲分区 CA模型
    牺牲了分区容错性,意味着将所有机器搬到一台机器内部,或者放到同一个机架上,明显违背了可伸缩性。
    案例:单点数据库、集群数据库、LDAP、xFS文件系统
    实现方式:两阶段提交、缓存验证协议
  2. 牺牲可用性 CP模型
    牺牲可用性意味着一旦系统中出现分区故障,则系统直接停止服务
    案例:分布式数据库、分布式锁定、绝大部分协议
    实现方式:悲观锁、少数分区不可用
  3. 牺牲一致性 AP模型
    案例:Coda、Web缓存、DNS
    实现:到期/租赁、解决冲突、乐观

MSA与SOA

集群概念

几种服务器性能增强方式:

  • Scale on:向上扩展。也称垂直扩展,在服务器硬件上扩展
  • Scale out:向外扩展。也称水平扩展,在服务器数量上扩展

LB 集群与 HA 集群的着眼点:

LB 集群是为了增加请求的并发处理能力,而 HA 集群是为了增加服务的可用性

RAID 阵列与 NFS 的区别:

NFS 是文件系统服务器,前端 web 对数据的请求是文件级别的。属于 NAS

NAS 具有锁机制,因为 NAS 是服务器,是有操作系统的,这样就不会造成数据的不一致了。

RAID 阵列是磁盘,前端 web 对数据的请求是块级别的。属于 DAS

DAS 就是磁盘,无法设置磁盘锁,因为读写操作是在内存中执行的,读取的数据都是在 web 服务器中执行操作,不同的 web 服务器读取同一段数据会造成数据的不一致

但是 DAS 的速度远高于 NAS

一个文件包含多个数据块

资源粘性:资源更倾向于运行在哪个节点

节点间通过 Messaging Layer 传递资源粘性值,但 Messaging Layer 并不进行比较,而是在 CRM(Cluster Resource Manager 集群资源管理器)上比较,指定资源应该运行在哪个节点上。

资源约束:Constraint

​ 排列约束

​ 位置约束(location)

Session 共享:

  • 基于 Cookie 的 Session 共享:

    将全站用户的 Session 信息加密并序列化后以 Cookie 的方式统一存放在根域名下,当浏览器访问该根域名下的所有二级域名时,会将域名相对应的所有 Cookie 内容传递给子服务器,实现用户的 Cookie 化 Session 在多个服务器间共享。

    优点:无需额外服务器资源。

    缺点:受 HTTP 协议头长度限制,仅存储小部分用户信息。

  • 基于数据库的 Session 共享:

    实用性强,但比较复杂,Session 的逻辑淘汰也需要自己实现,并且 Session 的并发读写能力取决于数据库的性能。

  • Session 复制:

    将用户的 Session 复制到每个要访问的服务器,Tomcat 和 Weblogic 都带有这种机制,但随机器增加,网络负担会成指数上升。

  • 基于 Memcached 或 Redis 的 Session 共享:

    Memcached 和 Redis 适合用于存放 Session,Memcached 和 Redis 中的 Hash 表具有 Expires 数据淘汰机制,符合 Session 的要求。并且这两款数据存储系统的性能都很强,能够应对高并发场景。

会话保持:

会话保持不是 Session 共享。网站中有时一次操作需要与服务器进行多次交互,并且这几次的交互都是紧密联系的,这要求相关操作都要在一台服务器上完成,不能被负载到其他服务器上。

会话保持就是指在负载均衡器上的机制,可识别客户和服务器间交互的关联性,在做负载均衡的同时,还能保持一系列相关的访问都分配到同一台服务器上。

负载均衡器的会话保存机制:

  • 基于源 IP 的持续性保持:主要用于四层负载均衡,如 Nginx 的 ip_hash、HAProxy 的 source 算法。

  • 基于 Cookie 的持续性保持:主要用于七层负载均衡,同一会话的被分配到同一台服务器上。

    根据应答报文中是否带有Set_Cookie字段,可分为 Cookie 插入保持和 Cookie 截取保持。

  • 基于 HTTP 报文头的持续性保持:主要用于七层负载均衡,负载均衡器首次收到客户端的请求时,会建立该客户端的表项,记录为该客户端分配服务器的情况。在会话表项生存期内,后续具有相同 HTTP 报文头的连接都发往同一服务器。