后端架构师必知必会系列:高可用架构与故障恢复

发布于:2023-09-27 ⋅ 阅读:(80) ⋅ 点赞:(0)

作者:禅与计算机程序设计艺术

1.简介

高可用的服务架构是云计算、分布式系统及微服务等新兴技术的核心,也是云平台的基石。因此,作为一个后端架构师,掌握高可用架构与故障恢复相关知识并不仅仅是应对大流量,而是对于整个业务的稳定性和成功率至关重要。

今天,我将向您介绍高可用架构与故障恢复这两项重点技术。首先,我将讨论什么样的架构才能提供足够的可用性?如何配置负载均衡器实现高可用性?哪些组件容易造成单点故障,并且需要采取哪些策略进行容错处理?然后,我将深入到不同类型故障中,探讨在应急情况下,如何快速恢复服务?最后,我将分享一些技巧和经验,帮助读者更好的设计和实施基于云平台的高可用架构。

2.概念术语

2.1 什么是高可用架构

高可用(High Availability)是指通过设计来提升服务的可靠性,通过各种手段防止意外或临时性故障导致的服务中断。在云计算和分布式环境下,可以做到99.9%以上可用。所谓的“三冗余”架构就是指将应用部署到三个甚至更多的服务器上,通过某种策略实现高可用。

在传统的数据中心,硬件设备出现故障,网络故障或者安全漏洞攻击等,都会引起服务不可用。所以要想使服务一直处于可用状态,就要通过各种措施保障硬件设备的正常运行,比如采用冗余电源、热交换、备份等方法。由于各个节点之间有较长的距离,因此需要高速网络连接。为了提高网络性能,通常采用以太网IP交换机和路由器。另外还需要设置高可用集群,使用镜像、主从复制、负载均衡等技术,以保证服务的连续可用。

总之,高可用架构是用来确保应用的持续可用性,即遇到各种意外故障时仍然能够保证服务正常运行。

2.2 定义与术语

2.2.1 主动-被动失效切换模式

主动-被动失效切换模式是一种常见的服务监测和切换机制。当某个节点发生故障时,主动检测到故障,主动把请求转移到其他正常工作的节点上。但这种模式有一个缺陷,当其他节点暂时无法提供服务时,可能会影响到用户体验。

2.2.2 主动-主动失效切换模式

主动-主动失效切换模式主要用于灾难恢复场景。当发生灾难时,先通知整个系统所有节点暂停服务,待事态稳定之后再恢复节点服务。因此,在主动-主动失效切换模式下,通常都有冗余的服务器,可以继续提供服务。

2.2.3 请求超时重试机制

请求超时重试机制是另一种服务监测和切换机制。当客户端请求某个节点失败,可以设置一定的超时时间,如果多次失败依旧不能连接该节点,那么客户端可以尝试其他节点,直到超过最大重试次数。这样做的一个好处是,可以实现动态的负载均衡,即根据当前负载调整分配资源。

2.2.4 服务熔断

服务熔断(Circuit Breaker)是一种智能化服务拒绝请求的方式。当某个服务发生异常时,可以通过断路器(Circuit Breaker)模式直接短路该服务,而不是让其一直向下游传递请求。一旦出错的服务恢复,断路器就会释放,使得请求正常通过,提高系统整体的稳定性。

2.2.5 服务降级

服务降级(Degradation)是一种特殊的异常处理方式。它意味着只使用部分功能,也就是说返回一个降级页面给用户,来替代实际的服务。这样做的好处是,可以提升系统整体的响应速度,降低客户体验。但是,当系统的可用性非常重要,而且已存在的功能无法满足需求时,则应该优先考虑服务降级。

2.2.6 弹性伸缩

弹性伸缩(Scalability)是一个通用的术语,用于描述系统扩展能力。通过自动添加或删除服务器,可以满足用户的增长和减少需求。弹性伸缩并非一蹴而就的,它往往需要配合自动化工具(如自动化脚本),或是人工操作。

2.2.7 意外情况模拟工具

意外情况模拟工具(Chaos Monkey)是一个利用随机事件的混乱性,使系统产生异常行为。这样做的目的是测试系统的容错能力。具体来说,它可以随机停止或销毁某些服务,也可以延迟或破坏网络通信。

2.3 服务故障类型

2.3.1 单点故障

单点故障(Single Point of Failure)是最常见且最危险的故障模式。当某个节点发生故障,其他节点都无法正常工作时,整个系统便不可用了。这里所谓的“节点”包括硬件设备、软件服务或任何计算机服务。

解决单点故障最简单的方法是使用多个节点,尽可能避免单点故障。例如,可以采用主从模式部署服务,即每个服务只有一个主节点,其他节点都是从节点。另外,也可以使用负载均衡器,通过把请求平均分配到不同的节点上,来缓解单点故障带来的影响。

2.3.2 双点故障

双点故障(Two Point of Failure)是指两个节点同时失效导致整个系统不可用。典型的场景是磁盘阵列的两个磁盘同时失效,导致存储空间不能再提供服务。为了解决双点故障,需要在同一个数据中心中建立冗余的服务器架。

2.3.3 分区故障

分区故障(Partition Fault)是指网络通信受阻,导致某个子网中的节点不能够正常工作。常见的原因包括网络拥塞、交换机故障或者DNS解析错误。解决分区故障的最简单的方法是选择多个路由器,并在这些路由器之间建立多条路径。

2.3.4 时钟偏差

时钟偏差(Clock Skew)是指不同节点的时间轴不同步。如果某个节点的时间轴比其它节点慢或快很多,会导致数据的不一致。虽然可以通过同步服务器时间来解决时钟偏差,但有时候根本无法完成同步。为了避免时钟偏差,可以使用时间戳或序列号的方案,通过强制机器间同步,消除时钟偏差带来的影响。

2.3.5 节点崩溃

节点崩溃(Node Crash)是指物理服务器宕机导致系统不可用。为了避免节点崩溃,可以采取多副本部署、主从备份、镜像备份等方式,提高系统的可用性。另外,也可以通过日志和监控系统,及时发现节点的故障,及时进行应急处理。

2.3.6 网络分裂

网络分裂(Network Split)是指多个子网之间的通信无法进行。为了避免网络分裂,可以采用VPN方案,将不同地域的用户连接到同一个虚拟局域网。

3.高可用架构设计原则

高可用架构设计有以下几个原则:

  1. 可用性(Availability): 应用必须能够正常提供服务,不能因为某个节点故障而影响到整个系统;
  2. 可扩展性(Scalability): 应用必须具备良好的伸缩性,能够适应随着业务发展的需要;
  3. 耐久性(Durability): 应用必须具有一定的耐久性,不会因电力中断、硬件损坏或其它不可抗力导致数据丢失;
  4. 容错性(Resilience): 应用必须具有良好的容错性,能够应对各种故障,包括硬件故障、软件故障、网络故障、人为失误等。

4.负载均衡器配置方案

负载均衡器(Load Balancer)是实现高可用性的关键,目前有两种负载均衡器供选择:第一种是硬件设备,如F5、Netscaler等,支持七层协议;第二种是云平台产品,如AWS的ELB、Azure的SLB等,支持四层或七层协议,云平台还有内置的DNS解析服务。

下面我将介绍几种常见负载均衡器配置方案。

4.1 轮询算法

轮询算法(Round Robin)是一种简单的负载均衡策略,将请求按顺序分发给后端的各个服务器。假设有3台Web服务器A、B、C,客户端每次发送请求到负载均衡器,负载均衡器通过轮询算法,将请求依次分发给A、B、C三台服务器。这种简单的负载均衡算法无偿提供了服务,但是它没有考虑后端服务器的容量、负载以及相应的响应时间。

图1:轮询算法示意图

4.2 加权轮询算法

加权轮询算法(Weighted Round Robin)是针对轮询算法的改进,允许管理员通过设定权值,为每台后端服务器设置不同的权重,来平衡各服务器的负载。按照权重的大小,将请求分发给各服务器。比如,有3台服务器A、B、C,分别设定权值为2、4、6,请求到达负载均衡器时,将按2:4:6的比例分发给每台服务器,每个服务器处理到的请求数量相同。

图2:加权轮询算法示意图

4.3 源地址哈希算法

源地址哈希算法(Source Address Hashing)是一种基于源IP地址的负载均衡算法。它的原理是根据用户的IP地址计算哈希值,然后将请求分发到相应的服务器。假设有3台Web服务器A、B、C,客户端A的IP地址为192.168.1.1,请求到达负载均衡器后,通过哈希算法计算哈希值H(192.168.1.1)=2,然后将请求分发到服务器A。类似地,客户端B的IP地址为192.168.1.2,其哈希值为H(192.168.1.2)=1,请求被分发到服务器B。

图3:源地址哈希算法示意图

4.4 加权源地址哈希算法

加权源地址哈希算法(Weighted Source Address Hashing)是源地址哈希算法的变形,它允许管理员设置权值,为每台后端服务器指定不同的权重,根据客户端IP的哈希值来确定目标服务器。权值越大的服务器处理到的请求数量越多。

图4:加权源地址哈希算法示意图

4.5 路径记录散列算法

路径记录散列算法(Path Record Hashing)是另一种负载均衡算法。它通过记录客户端访问的完整路径信息来计算哈希值,然后将请求分发到相应的服务器。这种算法比较复杂,但相比源地址哈希算法更具弹性。

图5:路径记录散列算法示意图

4.6 DNS解析 + 轮询算法

DNS解析+轮询算法(DNS Resolution + Round Robin Algorithm)是一种集中式负载均衡解决方案。采用这种方案,管理员可以在自己控制的DNS服务器上设置CNAME记录,指向负载均衡器域名,客户端在访问后端服务时,直接解析负载均衡器域名,负载均衡器再执行轮询算法,将请求分发到后端服务器。这种方案可以有效缓解客户端对负载均衡器的依赖,客户端不需要知道后端服务器的真实IP地址,也不必频繁更新配置文件。

图6:DNS解析+轮询算法示意图

5.常见组件和故障恢复策略

5.1 MySQL数据库故障恢复策略

MySQL数据库故障恢复策略主要分为两种:持续恢复和异步恢复。

持续恢复是指维护者手动启动数据库的恢复过程。常见的持续恢复策略如下:

  1. 从备份文件恢复:适用于小规模的数据库,将数据库从备份文件恢复即可,一般恢复时间在几十秒到几分钟之间;
  2. 使用MySQL Replication实现主从备份:适用于大规模的数据库,需要在生产环境中部署Replication,使用主从模式,通过复制日志实现主备份;
  3. 使用mysqldump命令备份:对于一些复杂的数据库结构,或者需要额外的处理(如压缩、加密等),可以借助mysqldump命令来备份数据库。

异步恢复是指维护者启动数据库的恢复过程,但不是立刻完成。异步恢复的特点是自动、透明、可靠,不会影响正在工作的数据库事务,但也不能完全保证事务的完整性和一致性。常见的异步恢复策略如下:

  1. 设置Replica-Recovery-Method参数:设置Replica-Recovery-Method=Asynchronous,表示启用异步恢复;
  2. 配置rsync:通过设置sync选项,将日志文件持续同步到备份服务器,在发生磁盘故障时可以恢复数据;
  3. 启用GTID:启用GTID,可以在服务器重启或切换时恢复GTID。

5.2 Redis缓存故障恢复策略

Redis缓存故障恢复策略有以下几个方面:

  1. 数据持久化:Redis提供了RDB和AOF两种持久化方式,RDB是内存快照,AOF是追加写入日志。通过开启持久化,可以实现数据的可靠性和持久化,避免服务中断。
  2. 主从复制:Redis提供了主从模式,可以实现读写分离。在发生主节点故障时,可以实现缓存的热备份,同时保持数据的最终一致性。
  3. 哨兵模式:Redis提供了哨兵模式,可以实现集群的高可用。通过哨兵进程,可以监控Redis集群中各个节点是否正常工作,并在出现故障时选举新的主节点。
  4. Redis Cluster模式:Redis提供了Cluster模式,可以实现Redis的水平扩展。通过集群化,可以线性扩展Redis集群,并通过哈希槽的机制,实现数据的分布式存储。

5.3 RabbitMQ消息队列故障恢复策略

RabbitMQ消息队列故障恢复策略有以下几个方面:

  1. 镜像队列:RabbitMQ提供了镜像队列(Mirrored Queue)功能,可以实现消息的镜像备份,解决单点故障问题。在部署消息队列集群的时候,可以创建两个完全一样的队列,然后将两个队列通过镜像绑定。当其中一个队列出现故障时,另一个队列可以顶上。
  2. 提供磁盘持久化功能:RabbitMQ提供了AMQP协议的磁盘持久化功能。通过启用磁盘持久化,可以实现消息队列的持久化。当RabbitMQ服务重新启动时,可以读取之前的状态和数据。
  3. 集群模式:RabbitMQ提供了集群模式,可以实现多节点部署。在部署消息队列集群时,可以创建多个节点,实现分布式部署。当某个节点出现故障时,集群中的其它节点可以接管其职责,保证消息队列的可用性。
  4. 高可用机制:RabbitMQ提供了多个高可用机制,如镜像队列、磁盘持久化、集群模式等。通过配置多个节点,以及启用高可用机制,可以提升RabbitMQ的可用性。

5.4 ZooKeeper服务注册与发现故障恢复策略

ZooKeeper服务注册与发现故障恢复策略有以下几个方面:

  1. 配置文件备份:ZooKeeper提供一份配置文件,可以修改该文件,实现高可用。如果出现故障,可以读取配置文件,恢复服务;
  2. 数据备份:ZooKeeper提供了Snapshot快照功能,可以保存服务器数据,在出现故障时,可以读取快照数据,恢复服务;
  3. 流程协调:ZooKeeper提供了流程协调功能,可以保证服务的正确性。通过事务、临时节点和ACL机制,可以实现流程的完整性,确保服务的稳定性。
  4. 通知机制:ZooKeeper提供了Watch通知机制,可以实现通知订阅的服务节点。当服务节点发生变化时,ZooKeeper通知订阅的客户端,客户端可以根据通知进行服务调用。

6.云平台高可用架构设计

6.1 AWS架构

Amazon Web Services (AWS) 是世界上最大的公共云提供商之一,其云服务包括 EC2(Elastic Compute Cloud),S3(Simple Storage Service),EBS(Elastic Block Store),CloudFront(Content Delivery Network),VPC(Virtual Private Cloud),ELB(Elastic Load Balance),Route 53(Domain Name System)。在构建云平台的过程中,需要遵循以下原则:

  1. 可用性:AWS 提供了一系列的服务,它们都是高度可用且具有容错能力的,例如 EC2 可以提供实例备份,而 S3 提供跨区冗余存储。
  2. 可扩展性:AWS 提供的基础设施可以在任意规模的云上运行,可以轻松应对日益增长的业务。
  3. 容错性:AWS 提供的基础设施高度耐久且具有自愈能力,可以通过冗余的机架、电源和网络等方式确保服务的可靠性。
  4. 成本效益:AWS 采用了按需付费的方式,可以节省资源,降低成本。

6.2 Azure架构

Microsoft Azure 是 Microsoft 推出的公共云提供商,其云服务包括 Virtual Machines(VM),Storage Account(存储账户),Virtual Networks(虚拟网络),Load Balancers(负载均衡器),Traffic Manager(流量管理器),Key Vault(密钥库)。

在构建云平台的过程中,需要遵循以下原则:

  1. 可用性:Azure 提供了一系列的服务,它们都是高度可用且具有容错能力的,例如 VM 的备份可以实现数据备份。
  2. 可扩展性:Azure 提供的基础设施可以按需扩展,可以在任意规模的云上运行,并提供弹性的伸缩性。
  3. 容错性:Azure 提供的基础设施高度耐久且具有自愈能力,可以通过冗余的存储、服务器等方式确保服务的可靠性。
  4. 成本效益:Azure 支持按量付费,可以降低成本。