如何从0-1的建设云上稳定性?

一、系统架构

整个系统包含了私有云和公有云两个节点。前端和服务端存在私有云和公有云两套系统交互,公有云上的系统为三方黑盒系统。

图片

带着上面的五点风险和挑战,我们从前后端的视角整体制定优化策略和方案。

二、前端策略

作为钉钉的合作产品,必然也是需要保障钉钉的体验的,这就涉及到如何将三方前端子页面进行一方化了,我们考虑了以下几套方案。

图片

基于稳定性优先的原则,为了能够使得三方预订页面具备可监控、可灰度、可回滚的能力,我们采用方案二:前端微应用的方式进行接入。

2.1 微前端架构

在微前端的架构下,我们将三方前端子应用的打包资源地址配置到钉钉合作域名应用下,当用户访问n.dingtalk的域名链接时就会走到云上系统,进而访问三方前端打包资源,这样的话预订子应用就具备了一方应用的基础能力。

图片

2.2 微前端效果

  1. 域名统一化:可以通过DBase平台进行灰度放量,保障可灰度、可回滚的基础能力。

  2. 隔离性:三方H5页面资源部署在公有云的独立环境中运行,避免其CSS或JS影响到主应用。

  3. 异常监控:接入Arms监控,建立异常监控机制,可以快速定位和解决接入过程中可能出现的问题,进而实现前端页面的error监控。

  4. 版本控制:第三方H5的更新应与主应用保持良好的版本控制,避免因版本不一致带来的问题,通过版本化的构建也可以更好的做到回滚管控。

  5. Jsapi调用:域名统一化后,可以使得三方预订子页面丝滑调用钉钉的Jsapi。

三、服务端策略

稳定性的容量预估也是遵循木桶理论的,构成整个系统的各个模块都有各自的系统吞吐量,而系统最低的那块木板,很可能就是整个系统的最终吞吐量。我们需要基于线上事件来真实评估最薄弱的一环,通过各模块各节点的完整评估,我们决定从四个方向(发布前管控、发布中可用、发布后保障、机制&人员保障)挑选最重要的TOP事项快速落地,进而快速提升整个系统的稳定性。

节点

事项

发布前管控

  • 三方系分标准规范化。

  • 三方发布变更强管控。

发布中可用

  • 云上系统发布过程中系统100%可用。

发布后保障

  • 云上系统监控100%覆盖。

  • 三方页面白屏感知,自动化UI测试100%覆盖。

  • 核心链路异常降级&预案演练。

  • 多方系统数据一致性保障。

机制&人员保障

  • 早值班机制

  • 稳定性周会机制

  • 保障机制

3.1 发布前管控

3.1.1 部署方案

我们采用公有云上的CI/CD能力,通过云效平台搭建了一套构建部署的解决方案。

图片

  1. 创建存储Bucket:创建一个OSS bucket用来存储部署物。

  2. 上传部署物:将本地构建出的部署物(比如jar包、war包等)上传到指定的OSS bucket,构建出的部署物文件名称尽可能体现出部署物版本(比如加上版本号、代码分支信息、commit id等)。

  3. 部署流水线:设定发布审批人,可以选择或签、会签。整个审批环节包含,测试、产品、主管三个审批节点,保障发布环节可控流程化。

  4. 部署物下载:在云效里创建一条发布流水线,将源代码编译的环节替换为从OSS下载构建部署物(JAR、WAR等)。

  5. ECS分组部署:可以在ECS分组部署阶段添加部署脚本、分组、部署方式等信息。

  6. 钉钉部署通知:部署完成后通过调用云效流水线的web hook自动触发部署结果通知。

3.1.2 关键节点

通过云效的流水线能力,将整个系统的发布在线化,关键KP审核,将发布流程强管控,杜绝随意变更引起的稳定性问题。

权限隔离

  • 三方同学可运行线上流水线,仅运行权限,不可编辑。

KP审批

  • 增加产品审批环节;

  • 增加测试验收环节;

  • 增加技术负责人审批环节;

流水线部署

  • 可回滚

  • 可监控

  • 钉钉群通知

图片

图片

图片

图片

3.2 发布中可用

云上系统存在发布过程中的不可用问题,比如系统在发布过程中,会导致用户以及服务商的系统页面不可用,是最为急迫解决的问题。

服务商视角

客户视角

图片

图片

目前的部署阶段不可用问题是由于nginx不具备高可用能力引起的,云上系统的后端服务器是采用轮询方式来进行通信的,在发布阶段由于轮询到部署机器导致系统异常。所以根本原因在于nginx不具备健康检查的能力,导致系统发布阶段的不可用问题。

 
server {        location / {            proxy_set_header Host $host;            proxy_set_header   X-Real-IP        $remote_addr;            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;            proxy_set_header X-Forwarded-Proto $scheme;            proxy_pass http://proxy-pro;  // `proxy_pass` 用于指定一个反向代理的后端服务器        }}
// 对于location指定的后端服务器配置,nginx的默认配置,默认为轮询通信。upstream api-pro{        server xxx.xx.xx.x:001;}

3.2.1 解决方案

在看清楚问题背后的原因后,理论上是有以下两种解决方案的。

图片

基于扩展性及系统高可用的考虑,决定采用方案二。

3.2.2 关键节点

步骤一:SLB转发

首先需要做SLB层的域名路由转发,需要调整SLB层的监听配置:

Before

After

图片

图片

图片

图片

After:HTTP请求之所以强制转发到HTTPS,原因是期望用户侧的访问都通过HTTPS的方式进行访问,安全性更高一些。

基于SLB的转发策略,对于云上系统进行分发配置,如下:

域名

路径

端口

服务器

A-test.com

/

10201

192.168.1.1

B-test.com

/

10204

192.168.1.2

C-test.com

/

10202

192.168.1.3

域名路径转发逻辑,如下图所示:

图片

  • 方式一:前端请求中存在域名,则根据域名匹配转发策略。

  • 存在匹配该域名的转发策略,则继续匹配URL路径部分。若URL路径部分也能匹配,则将请求转发至对应的虚拟服务器组;若URL路径部分未能命中该域名下的任何规则,则将请求转发给域名根路径转发策略(转发策略中只配置了域名,没有配置URL路径)。

    当用户没有为该域名配置根路径转发策略时,将向客户端返回404错误。

  • 不存在匹配该域名的转发策略,则按照方式二匹配转发策略。

  • 方式二:前端请求中不存在域名或者转发策略中不存在与之相匹配的域名,则直接匹配无域名转发策略(转发策略中只配置了URL,没有配置域名)。

  • 成功匹配到转发策略时,将请求转发至对应的虚拟服务器组;未能匹配到任何转发策略时,将请求转发至此监听配置的服务器组。

步骤二:健康检查

目前SLB转发为后端服务器后,可以配置健康检查策略,如下:

健康检查配置

图片

图片

健康检查方式

  • 目前通过HTTP HEAD请求的方式进行健康检查。

  • curl -Iv -X HEAD http://192.168.1.1:101/

  • 后端服务器组必须在同一个VPC内才可做健康检查。

图片

  1. 七层集群中的服务器根据监听的健康检查配置,向后端服务器的内网IP+【健康检查端口】+【检查路径】发送HTTP HEAD请求(包含设置的【域名】)。

  2. 后端服务器收到请求后,根据相应服务的运行情况,返回HTTP状态码。

  3. 如果在【响应超时时间】之内,七层集群中的服务器没有收到后端服务器返回的信息,则认为服务无响应,判定健康检查失败。

  4. 如果在【响应超时时间】之内,七层集群中的服务器成功接收到后端服务器返回的信息,则将该返回信息与配置的状态码进行比对。如果匹配则判定健康检查成功,反之则判定健康检查失败。

图片

3.2.3 治理效果

基于super后台做了一轮测试验证,结果符合预期。

Before

通过nginx进行路由且无健康检查时,部署过程中会有页面访问失败的情况。

图片

图片

After

部署过程中可以根据健康检查情况路由分发流量,保障部署阶段的可用性。

图片

图片

3.3 发布后保障

3.3.1 云上核心监控

大盘监控

 ECS机器监控大盘

数据库监控大盘

图片

图片

图片

钉钉群监控报警:

图片

图片

3.3.2 数据离线核对

由于平台涉及到和三方的数据流入流出,如果数据不一致会导致用户月度结算、购票等链路的使用及体验问题,所以我们建立了和三方的对账能力,通过该基础能力可以在T+1的时效内发现三方的系统问题,进而规避系统风险。

图片

  1. 向各个服务商提供sFTP服务器账户密码,分配不同的文件bucket。

  2. 服务商定时上传对账文件到oss文件服务器。

  3. ODPS创建明细对账表、总账对账表。

  4. ODPS上针对各个服务商单独创建同步任务,从oss服务器同步文件数据至对应的离线表。

  5. 通过MAC核对平台,针对各个服务商部署单独的核对任务。

3.3.3 UI自动化测试

平台接入了10余家专业的行业头部ISV,这更加剧了平台可用性的隐患,在三方页面不可用的情况下,便会导致用户投诉反馈。

图片

基础监控

在梳理了核心场景之后,我们通过UI自动化测试每天定时扫描三方页面的可用性,通过断言的方式发现核对三方页面的有效性。

 
def test_Platform_model_trip_business_travel_ticket_booking(self):        # 轮询是否有判断页面是否加载完成        mobile.loop_exist_pic("xx_xxx",subfolder="smart_pic/platform_mode/isv")        # 点击选择第一个票务        x = mobile.get_screenshot_resolution()[0] / 2.0 / mobile.get_scale()        y = mobile.get_screenshot_resolution()[1] / 5.0 * 2 / mobile.get_scale()        mobile.get_driver().click(x, y)        #  断言查询是否有预定按钮,否则就提示服务商没有可预订的订单        assert mobile.loop_exist_text('预订')[0], '服务商没有可预订的订单'
 

当预期的断言失败后就会推送到群内报警,并可以通过详情查看到具体的异常页面,如下所示:

图片

针对异常的case,可以通过查看详情明确具体的异常节点,对于快速定位问题很有帮助。

图片

3.4 机制保障

  • 早值班机制:每天钉钉和三方生态伙伴同学需要发早值班日志,针对发现的问题在排期优化解决。

  • 稳定性周会机制:通过稳定性周会的方式同步风险和治理进展。

  • 人员地图:建立每个服务商的系统保障人员地图,发现线上非预期问题,可以快速联系到相关同学及时解决,保障1分钟发现、5分钟定位、10分钟恢复。

四、治理成果

总体来说合作产品模式遇到了以下几个风险和挑战:

  1. 方案无感知:纯黑盒模式下对系统细节感知弱,变更风险高。

  2. 无发布管控:云上系统部署不可控,三方部署内容感知弱、部署频率不可控。

  3. 无灰度能力:云上系统部署无灰度能力,部署即全量。

  4. 无监控能力:云上系统监控感知弱,三方日志规范不标准,监控成本高。

  5. 安稳意识弱:三方人员安稳意识薄弱,三方故障等于钉钉故障。

整个治理过程,沉淀了通用的公有云CI/CD能力,实现了公有云发布三板斧的能力建设,并建立了平台持续、稳定、可靠的稳定性保障机制。

  1. 完善公有云发布管控能力:建立完整的云上系统CI/CD能力,保障无任何由于线上变更操作失误导致的线上问题。

  2. 建立发布三板斧基础能力:具备可灰度、可回滚、可监控的基础能力。在一个月的治理过程中,通过系统监控、UI自动化测试提前发现并规避了6起线上问题,通过离线核对发现并解决服务商及平台系统8例缺陷。

  3. 优化高可用的运维能力:通过负载均衡健康检查路由的方案解决三方系统发布过程中,由于流量切换导致部分请求不可用的问题,治理完成后无任何由于部署过程导致用户体验中断或完全不可用的问题。

  4. 建立稳定性保障机制:建立同三方的稳定性周会、早值班等机制,通过阶段性的宣讲和总结提升三方同学对于共建系统的稳定性意识。

治理前

治理后

可监控

可灰度

可回滚

发布管控

事件数

5/月

0

五、未来展望

目前平台业务在快速发展中,如何在快速的业务发展和夯实底座之间保持平衡,未来我们会继续巩固建设平台的稳定性基座。总之稳定性是一个持久的战役、关注细节的战役,基础不稳,地动山摇,稳定性是技术人的底线和生命线!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【学Rust写CAD】17 通用2D仿射变换矩阵结构体(matrix/generic.rs)

源代码 // matrix.rs use std::ops::{Add, Mul};use std::ops::{Add, Mul};/// 通用2D仿射变换矩阵&#xff08;元素仅需Copy&#xff09; #[derive(Clone, Copy, Debug, PartialEq)] pub struct Matrix<X, Y, Xx, Xy, Yx, Yy> {pub x: X, pub y: Y,pub xx: Xx, pub xy:…

Spring Boot @RequestParam 解析参数时的常见问题及解决方案

1&#xff0c;遇到的问题&#xff1a;将后端接口写完后我想通过PostMan进行简单的测试一下&#xff0c;一不小心就遇到了这样的情况&#xff1a; org.springframework.web.bind.MissingServletRequestParameterException: Required Integer parameter contractId is not prese…

Golang中间件的原理与实现

一. 什么是 Middleware&#xff1f; 中间件&#xff08;Middleware&#xff09; 是一种 高阶函数&#xff0c;它接受一个函数作为输入&#xff0c;并返回一个经过增强的函数。它的核心思想是通过函数的递归嵌套&#xff0c;动态地为函数添加功能。在 Golang 中&#xff0c;中间…

算法设计学习3

实验目的及要求&#xff1a; 1.加强对结构体的应用。 2.熟悉字符计数排序。 实验设备环境&#xff1a; 1.微型计算机 2.DEV C(或其他编译软件) 实验步骤&#xff1a; 任务&#xff1a;要求使用自定义函数来实现 输入一段文本&#xff0c;统计每个字符出现的次数&#xff0c;按…

Vue2和3的vue-router:生命周期、懒加载

Vue2 vue-router 在 Vue 2 中使用 vue-router 可以方便地管理单页面应用&#xff08;SPA&#xff09;中的路由。理解 vue-router 的生命周期和懒加载机制对于构建高效的 Vue 应用至关重要。以下是一些关键点和示例代码来帮助你理解这些概念。 Vue Router 的生命周期 vue-rou…

【408--考研复习笔记】计算机网络----知识点速览

目录 一、计算机网络体系结构 1.计算机网络的定义与功能&#xff1a; 2.网络体系结构相关概念&#xff1a; 3.OSI 七层模型与 TCP/IP 模型&#xff1a; 4.通信方式与交换技术&#xff1a; 电路交换 报文交换 分组交换 5.端到端通信和点到点通信&#xff1a; 6.计算机…

MySQL-- 多表查询的分类,SQL92与SQL99,7种JOIN的实现,SQL99语法的新特性

目录 一&#xff0c;多表查询的分类 角度1&#xff1a;等值连接 vs 非等值连接 角度2&#xff1a;自连接 vs 非自连接 角度3&#xff1a;内连接 vs 外连接 二&#xff0c;SQL92语法实现内连接&#xff1a;见上&#xff0c;略SQL92语法实现外连接&#xff1a;使用 -…

时间轮算法:原理、演进与应用实践指南

目录 1. 时间轮算法基础 1.1 什么是时间轮算法&#xff1f; 1.2 核心组成部分 2. 基本时间轮的实现机制 2.1 时间轮的构成要素 2.2 工作原理详解 3. 基本时间轮的局限性 3.1 时间范围限制问题 3.2 简单解决方案及其缺陷 4. 时间轮算法的演进 4.1 Round机制&#xff…

Unity 常见报错 定位和查找方法

1.控制台 直接看报错信息 2.打log 例子&#xff1a; for(int i 0;i < 8;i) {Debug.Log(i);//这是打的log,看看到底i是几的时候出问题gameObject.name strs[i];} 3.断点调试 &#xff08;1&#xff09;在你想打断点的行&#xff0c;左边空白处点击可以打断点&#xff…

第十八章:Python实战专题:北京市水资源数据可视化与图书馆书籍管理应用开发

今天我要和大家分享两个非常有趣的Python实战项目&#xff1a;一个是北京市2001-2017年水资源数据的可视化分析&#xff0c;另一个是图书馆书籍管理应用程序的开发。这两个项目都使用了Python的主流库&#xff0c;比如Pandas、Matplotlib和Tkinter&#xff0c;非常适合初学者学…

音视频基础(音视频的录制和播放原理)

文章目录 一、录制原理**1. 音视频数据解析****2. 音频处理流程****3. 视频处理流程****4. 同步控制****5. 关键技术点****总结** 二、播放原理**1. 音视频数据解析****2. 音频处理流程****3. 视频处理流程****4. 同步控制****5. 关键技术点****总结** 一、录制原理 这张图展示…

Nginx多域名HTTPS配置全攻略:从证书生成到客户端安装

一、业务背景 在现代Web开发中&#xff0c;HTTPS已成为保障数据传输安全的标准协议。特别是对于地图类API服务&#xff08;如高德地图&#xff09;&#xff0c;往往需要同时支持多个子域名&#xff08;如webapi.amap.com、restapi.amap.com等&#xff09;的HTTPS访问。传统方式…

Redis原理:rename命令

RENAME key newkey 将一个key重命名为新key&#xff0c;如果key不存在&#xff0c;则会返回异常。如果newKey已经存在&#xff0c;则会被覆盖&#xff0c;其实newKey会被显示的删除&#xff0c;所以如果newKey是一个大key&#xff0c;则会引起延迟。 源码 void renameCommand…

k8s污点与容忍

k8s污点与容忍 k8s污点管理常用命令effect标记值查看污点添加污点删除污点 node污点与容忍污点容忍yaml示例容忍放大基于污点的驱逐驱逐时排除指定服务 设置master调度设置master尽量不调度允许master节点调度pod恢复Master Only状态将node标记为不可调度状态(节点警戒)设置nod…

(BFS)题解:P9425 [蓝桥杯 2023 国 B] AB 路线

题解&#xff1a;P9425 [蓝桥杯 2023 国 B] AB 路线 题目传送门 P9425 [蓝桥杯 2023 国 B] AB 路线 一、题目描述 给定一个NM的迷宫&#xff0c;每个格子标记为A或B。从左上角(1,1)出发&#xff0c;需要移动到右下角(N,M)。移动规则是&#xff1a;必须交替走K个A格子和K个B…

python-leetcode 62.搜索插入位置

题目&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置 方法一&#xff1a;二分查找 假设题意是在排序数组中寻找是否存在一个目标值&#xff0c;则可以…

【计网速通】计算机网络核心知识点和高频考点——数据链路层(一)

数据链路层核心知识点&#xff08;一&#xff09; 一、数据链路层概述 1.1 基本概念 数据链路层位于OSI模型的第二层&#xff0c;介于物理层和网络层之间&#xff0c;主要负责在相邻节点之间传输和识别数据帧。 1.2 主要功能 帧同步&#xff1a;识别帧的开始和结束差错控制…

模型部署与调用

目录 部署 ollama下载 模型版本选择 ​编辑 对照表 控制台执行 调用 部署 大模型部署我使用的是Ollama&#xff0c;点击跳转 接下来我将在本地使用ollama就行模型部署的演示 ollama下载 模型版本选择 对照表 大家可以根据自己的显卡配置选择对应的模型版本 控制台执…

Rstudio如何使用Conda环境配置的R

前言 Rstudio作为一款流行的R语言集成开发环境&#xff08;IDE&#xff09;&#xff0c;为用户提供了便捷的编程体验。然而&#xff0c;不同项目可能需要不同版本的R&#xff0c;这就需要我们灵活切换R版本。除了在之前文章中提到的使用 Docker 部署不同版本的 R 的方法之外&am…

C++---RAII模式

一、RAII模式概述 1. 定义 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;即资源获取即初始化&#xff0c;是C中用于管理资源生命周期的一种重要编程模式。其核心在于将资源的获取和释放操作与对象的生命周期紧密绑定。当对象被创建时&#xff0c;资源…