高可用系列文章之二 - 传统分层架构技术方案

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 高可用系列文章之二 - 传统分层架构技术方案

三 技术方案

3.1 概述

单点是系统高可用最大的风险和敌人,应该尽量在系统设计的过程中避免单点。

保障系统的高可用, 方法论上,高可用保证的原则是「集群化」(或 「冗余」), 只有一个单点,该单点宕机所有服务都会受影响而不可用;如果有冗余或备份,其中一个点宕机还有其他冗余或备份节点能够提供服务。

保证系统高可用,架构设计的核心准则是:冗余。

有了冗余之后,还不够,每次出现故障需要人工介入恢复势必会增加系统的 MTTR。所以,又往往是通过「自动故障转移」来实现系统的高可用。

在下面的技术方案中,详细介绍了如何通过 冗余 + 自动故障转移 来保证系统的高可用特性。

3.2 制造业系统的典型架构

制造业系统一般采用分层架构, 最简单的典型架构的展示如下:

 备注:

数据库以 MySQL 为例.

典型架构

常见的系统架构如上, 分为:

  1. 客户端层: 典型调用方式浏览器(browser) 和客户端(client)
  2. 应用服务层: 实现核心应用逻辑, 通常是 HTTP 协议或 TCP 协议. 这一层细分, 往往还包括:
  1. 表示层: 主要是 web 浏览页面;
  2. 业务逻辑层: 对具体问题进行逻辑判断和执行操作, 同时也是表示层和数据层的桥梁
  3. 可选: 服务层: 如果实现了服务化, 如 SOA 或微服务化, 就会有这一层;
  4. 数据访问层: 实现对数据的增删改查等操作, 并将结果反馈到业务逻辑层
  5. 可选: 数据缓存层: 缓存加速访问存储
  1. 数据库层: 数据库固话数据存储.

整个系统的高可用, 是通过对每一层的 冗余 + 自动故障转移 来综合实现的.

备注:

通过更加细化和细致的分层, 也可以提高 可用性. 如将以上架构细化为:

  1. 客户端层;
  2. 可选新增: 反向代理层
  3. 可选新增: 表示层 (Web Server) 层
  4. 应用服务层 (App Server) 层
  5. 可选新增: 服务调用层
  6. 可选新增: 缓存层
  7. 数据库层

本文暂不涉及这一内容.

3.3 制造业系统的推荐高可用架构

通过 冗余 这一核心原则, 优化后的高可用架构如下图所示:

HA 架构

说明:

  • 实线 : 请求调用
  • 点 + 横线: 心跳检测
  • 点虚线: 尚未真实发生的请求调用
  • 短横虚线: 数据库主从同步
  • “X” - 对应节点宕机不可用.

高可用方案调整说明如下:

  1. 在客户端层和应用服务层之间, 新增: 负载均衡层. 负责将客户端请求通过某种负载均衡方式科学地负载到应用服务外层;
  2. 负载均衡层: 这一层包含以下 2 个组件:
  1. NGINX: 负责 TCP/HTTP 请求的负载反向代理 / 负载均衡;
  2. Keepalived: 负责对外提供单个 IP, 且对 2 台 NGINX 进行心跳检测和故障时的故障转移;
  1. 应用服务层: 应用服务器至少为 2 个.
  2. 数据库层 : 数据库进行 主从同步, 读写分离

备注:

上图中, 也画出了高可用的另一种实施方案, 本文不做详细讨论:

  • 应用横向拆分: 单体应用 (monolithic application) 根据重要性进行拆分, 将重要性高的服务和重要性低的服务进行拆分, 单独部署.
  • 重要性高的应用, 如低延迟类应用, 流水线上应用等;
  • 重要性低的应用, 如高延迟类应用, 报表应用等.

除此之外, 还可以根据实际业务情况进一步将 数据库 进行拆分, 本文亦不做详细讨论:

  • 数据库拆为 2 个库, 其中一个库通过数据同步从另一个库定时 (实时或非实时) 同步数据. 举例说明: 业务库, 报表库. (业务库定期同步数据给报表库)
  • 重要性高的应用, 读取写入业务库;
  • 重要性低的应用. 如报表类应用. 不允许使用业务库, 而是使用报表库.

下面逐一进行分层论述.

3.4 客户端层 -> 负载均衡层 高可用

1578813330834

客户端层 负载均衡层 高可用, 通过 负载均衡层 的冗余来实现的. 具体实现方式如下:

至少有 2 台 nginx, 其中一台提供服务, 另一台冗余以保证高可用. 并通过 Keepalived 的 virtual IP 来提供同一 IP(如上图为: 1.2.5.6), 通过心跳探测来进行故障检测和故障转移.

在上图中, NGINX 主节点提供对外服务.

当 NGINX 主节点 (如: 192.168.0.1) 发生宕机, Keepalived 能够探测到, 会自动进行故障转移, 将流量自动转移到 NGINX 从节点(如: 192.168.0.2). 由于使用的是相同的 virtual IP(仍为: 1.2.5.6), 这个切换过程对调用方是透明的.

1578812475962

3.5 负载均衡层 -> 应用服务层高可用

负载均衡层 应用服务层 的高可用, 是通过 应用服务层 的冗余来实现的. 在 NGINX 的配置文件 nginx.conf 中, 可以通过 upstream 指令配置多个应用服务器, 并且 nginx 能够探测到多个应用服务器的存活性.

应用服务层高可用 1

知识点:

在 NGINX 开源版本中, 如果不使用第三方插件,NGINX 的存活探测为: 被动 探测.

应用服务层 其中一个节点宕机的时候, nginx 能够探测到, 会自动进行故障转移, 不会将流量分发到发生故障的节点, 而是分发到其他的正常应用服务器节点, 整个过程由 NGINX 自动完成, 对调用方透明.

应用服务层高可用 2

3.6 应用服务层 -> 数据库层高可用

数据库层建议采用「主从同步, 读写分离」架构. 数据库的高可用, 又可细分为: 「读库高可用」 和「写库高可用」 两类.

备注:

由于制造业采用了多种数据库, 包括但不限于:

  • Oracle
  • SQL Server
  • MySQL

不同数据库的高可用解决方案并不完全相同, 所以本文不对数据库的具体高可用技术做细节描述. 只进行理论论述.(以 MySQL 为例)

常见的数据库高可用方案有:

  1. MySQL: 主从同步;
  2. Oracle: RAC
  3. SQL Server: Alwayon

3.6.1 读库高可用

读库高可用, 是通过读库的冗余来实现的.

如果要对读库实现高可用, 一般来说至少有 2 个从库, 数据库连接池会建立与读库的多个连接, 每次请求会路由到这些读库.

读库高可用 1

当读库 - 从 1 发生宕机的时候, 应用服务层的 数据库连接池 能够探测到, 会自动的进行故障转移, 将流量自动迁移到其他的读库, 如读库 - 从 2, 整个过程由数据库连接池自动完成, 对调用方是透明的.

读库高可用 2

备注:

需要应用系统或中间件的数据库连接层实现 数据库连接池 功能.

3.6.2 写库高可用

写库的高可用, 是通过写库的冗余来实现的.

以 MySQL 为例, 可以设置两个 MySQL 双主同步, 一台对线上提供服务, 另一台冗余以保证高可用.

3.7 技术选型

3.7.1 负载均衡器技术选型

选型结果:

  • 负载均衡器: NGINX + Keepalived
  • 版本:
  • NGINX: 1.16.1 ( 选型版本至少每半年评估一次, 根据评估结果对版本进行调整)
  • Keepalived: 2.0.10(❗️ 选型版本至少每半年评估一次, 根据评估结果对版本进行调整)
  • 操作系统类型: Linux
  • 操作系统版本: SUSE 12 (按需调整,遵循制造业的相关技术规范要求.)

定义及概述:

在分布式系统中,负载均衡(load balance)是一种有效的将网络请求分配到多个服务器的过程。通过将负载进行负载均衡,可以有效地改进系统响应时间,提高系统的可用性。随着系统变的愈发复杂,用户增多和网络流量增大,负载均衡已经成为系统设计中的必要一环。

负载均衡器可以是硬件也可以是软件,它会将网络请求分发到服务器集群上。

选型过程概述

常见的硬件负载均衡器包括:

  • F5
  • A10

常见的软件负载均衡器包括:

  • Nginx
  • LVS
  • HAProxy

结合制造行业最佳实践, 以及制造业的实际情况考虑, 制造业在全国乃至全球拥有多座工厂, 每个工厂拥有独立的机房. 采用硬件负载均衡成本过高. 确定采用 软件负载均衡器 作为负载均衡技术实现. 下面对软件负载均衡器逐一进行论述:

NGINX:

Nginx(“engine x”)是一款是由俄罗斯的程序设计师 Igor Sysoev 所开发高性能的 Web 和 反向代理 服务器.

优点:

  1. 工作在网络的 4 层 (TCP/UDP) 和 7 层(HTTP/websocket),可以针对 http 应用做一些分流的策略,比如针对域名、目录结构,其正则规则比 HAProxy 更为强大和灵活, 同时 NGINX 目前是使用最广泛的负载均衡器和 Web Server,适用场景丰富.
  2. Nginx 对网络稳定性的依赖非常小,理论上能 ping 通就就能进行负载功能;相反 LVS 对网络稳定性依赖比较大;
  3. Nginx 安装和配置比较简单,测试起来比较方便,NGINX 拥有完善的且可自定义的日志, 包括 access 日志和 error 日志。LVS 的配置、测试需要花费比较长的时间。
  4. NGINX 可以承担高负载压力且稳定,在硬件不差的情况下很容易能支撑几万次的并发量。
  5. Nginx 可以通过端口检测到应用服务器的故障,如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点。如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx 会将上传切到另一台服务器重新处理,如果是 LVS 就直接断掉了。
  6. Nginx 不仅仅是一款优秀的负载均衡器 / 反向代理软件,它同时也是功能强大的 Web 应用服务器。LNMP 也是近几年非常流行的 web 架构,在高流量的环境中稳定性也很好。
  7. Nginx 作为 Web 反向加速缓也比较成熟,速度比传统的 Squid 服务器更快,在未来场景用, 也可以扩展 NGINX 的用途。
  8. Nginx 可作为反向代理使用,作为反向代理, Nginx 使用最广泛, 同类产品还有 lighttpd 了,不过 lighttpd 目前还没有做到 Nginx 完全的功能,配置也不清晰易读,社区资料也远远没 Nginx 活跃。
  9. Nginx 也可作为静态网页和图片服务器,这方面的性能也无对手。
  10. Nginx 社区非常活跃,第三方模块也很多。

缺点:

  1. 对后端服务器的健康检查, 开源版 NGINX 支持持 被动检测 . 不支持 主动检测.
  2. 对于负载均衡的会话保持, 开源版 NGINX 默认不支持cookie 会话保持. 但是能通过 ip_hash 实现源地址会话保持, 且可以通过第三方模块实现cookie 会话保持.

LVS:

LVS:使用 Linux 内核集群实现一个高性能、高可用的负载均衡服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。

优点:

  1. 抗负载能力强、是工作在网络 4 层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和 cpu 资源消耗比较低。
  2. 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。
  3. 工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如 LVS+Keepalived。
  4. 无流量,LVS 只分发请求,而流量并不从它本身出去,这点保证了均衡器 IO 的性能不会收到大流量的影响。
  5. 应用范围比较广,因为 LVS 工作在 4 层,所以它几乎可以对所有应用做负载均衡,包括 http、数据库、在线聊天室等等。

缺点:

  1. 软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是 Nginx+Keepalived 的优势所在。
  2. 如果是网站应用比较庞大的话,LVS 实施起来比较复杂了,特别后面有 Windows Server 的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx + Keepalived 就简单多了。

HAProxy:

HAProxy 是一个使用 C 语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于 TCP 和 HTTP 的应用程序代理。

优点:

  1. HAProxy 支持虚拟主机。
  2. HAProxy 的优点能够补充 Nginx 的一些缺点,比如支持 Session 的保持,Cookie 的引导;同时支持通过获取指定的 url 来检测后端服务器的状态。
  3. HAProxy 跟 LVS 类似,本身就只是一款负载均衡软件。
  4. HAProxy 支持 TCP 协议的负载均衡转发。
  5. HAProxy 负载均衡策略比较丰富

缺点:

  1. 不支持 POP/SMTP 协议
  2. 不支持 SPDY 协议
  3. 不支持 HTTP cache 功能。
  4. 重载配置的功能需要重启进程,虽然也是 soft restart,但没有 Nginx 的 reload 更为平滑和友好。
  5. 多进程模式支持不够好

选型结论:

LVS 试用场景单一, 且存在硬伤(即: 后面有 Windows Server 的机器的话, 实施比较复杂). 直接排除.

HAPorxy 针对 HTTP 的支持没有 NGINX 丰富, 且重启中断相对 NGINX 时间更长.

另外, nginx 除了当前可以用作负载均衡器之外, 还可以用作 web server, http 缓存等场景, 且容易上手.

最终确定选择 NGINX 作为某制造业公司负载均衡器.

3.7.2 NGINX 高可用技术方案选型

NGINX 高可用技术方案只有一种, 即: NGINX + Keepalived 实现高可用.

keepalived开源项目 包括三个组成部分:

  • keepalivedLinux 服务器的守护程序。
  • 虚拟路由器冗余协议(VRRP)的实现,用于管理虚拟路由器(虚拟 IP 地址或 VIP)。
    VRRP 确保始终存在一个主节点。备用节点侦听来自主节点的 VRRP 通告包。如果在超过配置的广播间隔的三倍的时间内未收到广播包,则备用节点将作为主节点接管,并将配置的 VIP 分配给自己。
  • 一种运行状况检查工具,用于确定服务(例如,Web 服务器,PHP 后端或数据库服务器)是否已启动并且可以运行。
    如果节点上的服务未通过配置的运行状况检查次数,keepalived 则将虚拟 IP 地址从主(主动)节点重新分配给备用(被动)节点。

3.7.3 NGINX 负载均衡策略

选型结果:

负载均衡策略: RR(轮询, 默认策略)

会话保持策略: (非必须)

  • 不需要会话保持, 则不进行配置.
  • 需要根据源地址进行会话保持: ip_hash

NGINX 负载均衡策略:

  1. 轮询调度算法: rr (默认调度算法).
  2. 加权循环调度算法: wrr. 适用场景: nginx 服务器性能不相同, 性能高的需要负载更多请求.
  3. 最小的连接数: least_conn.
  4. 会话保持策略:
  1. IP 会话保持: ip_hash
  2. hash - 指定服务器组的负载均衡方法,其中客户机 - 服务器映射基于 hash 值。key 可以包含文本、变量及其组合。

选型过程:

负载均衡策略,根据实际情况按需选择,无特殊要求的情况下选择 rr 即可。

会话保持策略, 需要根据特定的场景进行选择:

  • 不需要会话保持, 则不进行配置.
  • 需要根据源地址进行会话保持: ip_hash
  • 需要进行 cookie 会话保持: sticky
  • 源地址会话保持和 cookie 会话保持均无法满足需求, 则可能需要通过 hash 来定制会话保持策略.

3.7.3 应用服务层 -> 数据库层高可用选型

略.

由于应用系统的多样性, 本文不对应用服务层 -> 数据库层高可用选型做约束. 仅提供顶层架构要求:

  1. 数据库: 主从同步, 读写分离
  2. 应用:
  1. 实现数据库连接池功能. 可以配置多个数据库连接.
  2. 根据应用功能模块的重要性进行横向拆封. 将: 报表, 数据统计, 批处理类功能与低延迟重要业务功能剥离开来.

参考文件

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
分布式计算 API 数据处理
Flink【基础知识 01】(简介+核心架构+分层API+集群架构+应用场景+特点优势)(一篇即可大概了解flink)
【2月更文挑战第15天】Flink【基础知识 01】(简介+核心架构+分层API+集群架构+应用场景+特点优势)(一篇即可大概了解flink)
60 1
|
2月前
|
缓存 负载均衡 监控
从零开始搭建一个高可用的后端架构
【2月更文挑战第6天】本文将介绍如何从零开始搭建一个高可用的后端架构,包括架构设计、技术选型、部署和监控等方面。通过对各种技术的分析和实践,帮助读者深入理解高可用架构的实现和优化。
|
2月前
|
存储 自然语言处理 前端开发
软考实践之分层架构思想的理论和应用实践
软考实践之分层架构思想的理论和应用实践
222 0
|
2月前
|
消息中间件 前端开发 测试技术
DDD - 分层架构:有效降低层与层之间的依赖
DDD - 分层架构:有效降低层与层之间的依赖
|
3月前
|
XML Dubbo Java
【面试问题】Dubbo 的整体架构设计有哪些分层?
【1月更文挑战第27天】【面试问题】Dubbo 的整体架构设计有哪些分层?
|
3月前
|
存储 负载均衡 NoSQL
Redis 高可用篇:你管这叫主从架构数据同步原理?
Redis 高可用篇:你管这叫主从架构数据同步原理?
241 5
|
3月前
|
存储 分布式计算 数据挖掘
数仓分层架构
数仓分层架构
76 0
|
6天前
|
敏捷开发 监控 数据管理
构建高效微服务架构的五大关键策略
【4月更文挑战第20天】在当今软件开发领域,微服务架构已经成为一种流行的设计模式,它允许开发团队以灵活、可扩展的方式构建应用程序。本文将探讨构建高效微服务架构的五大关键策略,包括服务划分、通信机制、数据管理、安全性考虑以及监控与日志。这些策略对于确保系统的可靠性、可维护性和性能至关重要。
|
7天前
|
消息中间件 监控 持续交付
构建高效微服务架构:后端开发的进阶之路
【4月更文挑战第20天】 随着现代软件开发的复杂性日益增加,传统的单体应用已难以满足快速迭代和灵活部署的需求。微服务架构作为一种新兴的分布式系统设计方式,以其独立部署、易于扩展和维护的特点,成为解决这一问题的关键。本文将深入探讨微服务的核心概念、设计原则以及在后端开发实践中如何构建一个高效的微服务架构。我们将从服务划分、通信机制、数据一致性、服务发现与注册等方面入手,提供一系列实用的策略和建议,帮助开发者优化后端系统的性能和可维护性。
|
1天前
|
监控 测试技术 持续交付
探索现代微服务架构的最佳实践
【4月更文挑战第25天】 随着软件开发领域不断演进,微服务架构已成为设计灵活、可扩展且高度可维护系统的首选方案。本文将深入探讨构建和部署微服务时的关键最佳实践,涵盖从服务划分原则到持续集成/持续部署(CI/CD)的流程,再到监控与日志记录的策略。我们的目标是为开发者提供一套实用的指南,帮助他们在构建未来的应用程序时做出明智的架构选择,并确保这些系统能够快速响应市场和技术的变化。