如何从架构层面降低公有云多可用区同时故障的概率

阿里云和腾讯云都曾出现过因一个组件故障而导致所有可用区同时瘫痪的情况。本文将探讨如何从架构设计的角度减小故障域,在故障发生时最小化业务损失,并以 Sealos 的稳定性实践为例,分享经验教训。

抛弃主从,拥抱点对点架构

从腾讯云故障报告中可以看出来多可用区一起挂基本都是因为一些集中化的组件造成,比如统一 API,统一鉴权认证之类的系统故障。

所以这个 X 系统一挂,故障域就会非常大。

相比之下,去中心化的点对点架构能够很好地规避这一风险。以比特币网络为例,由于不存在中心节点,其稳定性远高于传统的主从式集群,几乎很难挂机。

所以 Sealos 在设计多可用区的时候就充分吸取了阿里云腾讯云的教训,采用了一种无主的架构,所有可用区都是自治的,主要问题是像用户账户这些数据如何在多可用区同步的问题。变成了这样的一种架构:

各可用区完全自治,仅在关键的共享数据 (如用户账户信息) 上通过跨区域分布式数据库 (我们使用的是 CockroachDB) 进行同步。每个可用区都连接分布式数据库 CockroachDB 在本地的节点。

这样一来,单个可用区的故障就不会影响其他区域的业务连续性。只有在分布式数据库集群整体发生问题时,才会导致所有可用区的控制面不可用。好在 CockroachDB 本身在容错、灾备、应对网络分区等方面有着出色的表现,大大降低了这种情况的发生概率。这样整体的架构就简单了,集中精力把数据库的稳定性做好就行,监控,破坏性测试都做好。

这样做的另外一个好处是为灰度发布、差异化运营提供了便利。例如,新功能可以先在部分区域进行小流量验证,待稳定后再全量上线;不同区域也可以根据客户群体的特点,提供定制化的服务,而不必保持完全一致。

绝对稳定的系统不存在

大家对云的稳定性喷的比较多,但凡是个云厂商无一例外都出现过故障,我们也出现过过非常多的故障,这里最重要的是如何收敛,他不仅是个技术问题,也是个组织管理问题,同样也还是个成本问题,这块我结合创业过程中我们遇到的具体例子来给大家做个分享。

Sealos 从故障中汲取的教训

2023.3.17 日 Laf 重大故障

这是创业首次遇到的重大故障,产品上线还没两天就给我们当头一棒,时间记的这么清楚是因为刚好是公司一周年庆祝,蛋糕都没有时间切,一直恢复到夜里三点多。

最终故障原因很奇葩,是我们贪图便宜用了轻量服务器,轻量服务器上做容器的网络虚拟化会导致丢包,最终我们把整个集群迁移到了正常的一个 VPC 服务器上,所以很多时候解决稳定性和成本分不开。

所以很多都觉得公有云贵什么的,很多时候为了解决剩下的那 10% 的问题确实要花很多倍的成本。

Laf 后续有出现了一系列数据库相关的稳定性问题,因为使用的是多租户共享一个 MongoDB 库的模型,最终论证的结论是这条路我们走不通,数据库隔离性问题我们很难解决,所以现在全部采用了独立数据库的方式,问题得到最终解决。

还有网关上的稳定性问题,我们一开始选了某个不靠谱的 Ingress 控制器,问题频发,具体是哪家就不点名了,最终换成了 Higress,彻底解决这个问题,目前不仅资源占用更少,而且更稳定,这里也非常感谢阿里 Higress 团队的贴身支持,我们暴露的问题也更好的帮助了 Higress 的更成熟,双赢。

2023 年 6 月我们 Sealos 公有云正式上线,遇到一个最大的问题就是被攻击,流量很大的 CC 攻击,加防护能解决但是也意味着成本的飙升,所以在这两者之间的权衡就很纠结了,不防稳定性难解决,防了卖的钱收不回成本。后来我们把网关换掉之后,发现 Envoy 是真的强,居然能把攻击的流量抗下来了,在那之前用的是 Nginx,一挂挂一片。而且 K8s 厉害的的地方就是自愈能力强,即便网关挂了 5min 内也能实现自愈,只要不是同时挂,业务基本不受影响。

稳定性不断收敛的最佳实践

故障处理的流程

为了让系统稳定性不断收敛提升,Sealos 在内部建立了一套严格的故障管理流程:

每次故障发生后,都要详细记录,并持续跟进。很多公司走到故障复盘就结束了,但事实上复盘不是目的,关键要形成切实可行的整改措施,并予以落实,彻底防止类似故障再次发生。故障处置完成后仍需持续观察一段时间,直至确认问题不再出现。

在管理目标上,一开始我们在 2024 Q1 OKR 中这样去定义了稳定性收敛的目标:

后来发现这种笼统的口号式 OKR 并不靠谱,稳定性的收敛需要更具体,这个 KR 的结果是我们没达成,几乎没起到什么效果。在收敛的过程你并不需要全面开花,每个季度聚焦在几个核心点上,持续迭代几个季度就会收敛的非常好。

所以在 Q2 时我们定了更具体的目标:

对稳定性的设定,不能仅停留于设定个指标,也不能过于笼统,需要具体可见的措施,需要具体的衡量办法。

比如,如果设定 99.9%,如何达到?那么当前的可用性是多少?当前的核心问题是什么?如何测量?需要做些什么?谁来做?设定不局限于可用时长,要列细一些,比如故障等级、故障次数、故障时长、大客户故障观测等等。

要分出专项类别,列出优先级,比如:数据库稳定性、网关稳定性、大客户服务可用性指标、CPU/内存资源过载故障。

还要重点监测大客户,比如自走棋、FastGPT 商业大客户、匆匆雪工作室等 (月使用 30 核以上,挑出 5 个典型)。

稳定性问题就那么多,当服务好了这些大客户基本就能覆盖掉小客户,不追求多,聚焦解决当前最核心的稳定性问题,然后一定要建立起一个完善的跟踪流程。

造成故障的同学可能会收到惩罚,扣奖金,甚至开除。我们作为创业公司通常不会用惩罚的措施,因为当事人也不想造成故障,而且大家都也确实很辛苦的在解决问题,真正能打仗的都是负过伤的,我们更倾向正面的激励,比如如果季度故障频率降低,就适当给些激励

大道至简的架构设计

系统架构从设计开始就关系到了稳定性,越复杂的架构越容易出问题,所以很多公司没有重视到这一点,我经常参与公司架构设计和评审,通常发现设计过于复杂在我这都很难过得去,就感觉哪不对,Sealos 多可用区就是一个非常好的例子,把一个复杂的事情变成一个简单的 CRUD,那只需要把数据库稳定性做好,数据库表结构设计简单很多稳定性问题就被扼杀在摇篮中了。

我们的计量系统也是这样,起初设计了怕有十几个 CRD,折腾了大半年稳定性也收敛不下来,最后重新设计选型,差不多两周开发完了,一个月就稳定上线了。

所以:大道至简的设计对稳定性至关重要!

适度监控,有的放矢

监控是把双刃剑,过犹不及。Sealos 很多次故障都是因为监控造成的,Prometheus 占用资源过大,API Server 不堪重负,反而引发了新的稳定性问题。吸取教训后,我们改用 VictoriaMetrics 这种更轻量级的监控方案,同时严格控制监控指标的数量。类似 Uptime Kuma 这种工具就很实用,跨区域相互拨测,及时发现问题。

on call 也是如此,每天几千条告警,on call 什么东西?所以这里基本是从 0 开始慢慢做加法,比如我们是先从 “大客户业务最终稳定性” 这个视角去做的,比如一个容器故障推出了这个如果要 on call 的话那估计电话响个不停。再慢慢加上比如主机 not ready 这些。主机 not ready 理论上不应该影响业务,随着系统的逐渐成熟,最终可以做到 not ready 也不需要 on call。

故障通报不能怕丢人

腾讯云的复盘报告就做得非常好,如实说明故障发生的原因,客观分析哪些地方做得还不够,并承诺积极整改。这种坦诚、负责的态度,其实更容易赢得用户的信任。相比之下,对问题讳莫如深,生怕舆论发酵,无异于饮鸩止渴,反而让用户觉得是个不透明的黑盒,今后还不知会出什么幺蛾子。真正热爱你的产品、愿意与你相伴成长的客户,是能够包容非原则性错误的。关键要拿出实实在在改进的诚意和行动。

总结

Sealos 公有云服务上线一年多来,已经积累了十多万注册用户。凭借出色的功能、体验和性价比,不少开发者青睐有加,部分大客户也开始尝试将业务迁移到我们 Sealos 云上。这其中不乏一些大型互联网产品,例如《开心自走棋》游戏就有 400 多万活跃用户

放眼未来,我们相信通过系统化的故障管理不断收敛稳定性,通过简洁高效的架构设计、稳扎稳打的监控策略,再辅之以开诚布公的沟通态度,Sealos 这个由国内开源小公司孕育发展起来的云一定会变成一朵非常先进的云!

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

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

相关文章

Linux之yum和vim的使用

一、yum的使用 yum 后面跟install要安装的文件名: 若你要安装的文件已经存在,则会出现: 要删除文件: yum remore文件名即可删除 在我们安装完lrzsz之后,可以用rz指令和sz指令: rz指令可以从window窗口中…

鸿蒙OpenHarmony【小型系统运行案例】 (基于Hi3516开发板)

运行 启动系统 在完成Hi3516DV300的烧录后,还需要设置BootLoader引导程序,才能运行OpenHarmony系统。 在Hi3516DV300任务中,单击Configure bootloader(Boot OS)进行配置即可。 说明: DevEco Device Tool…

MT8788智能模块简介_MTK联发科安卓核心板方案厂商

MT8788安卓核心板是一款具备超高性能和低功耗的4G全网通安卓智能模块。该模块采用联发科AIOT芯片平台,供货周期长。 MT8788核心板搭载了12nm制程的四个Cortex-A73处理器核心和四个Cortex-A53处理器核心,最高主频可达2.0GHz。板载内存容量可选为4GB64GB(也…

《系统架构设计师教程(第2版)》第15章-面向服务架构设计理论与实践-05-SOA设计模式

文章目录 1. 服务注册表模式1.1 服务注册表1.2 SOA治理功能1.3 注册表中的配置文件 2. 企业服务总线(ESB)模式3. Synchro ESB3. 微服务模式3.1 概述3.2 微服务架构模式方案3.2.1 聚合器微服务1)概述2)几种特殊的聚合微服务 3.2.2 …

Ubuntu20.04安装redis5.0.7

redis下载命令: wget https://download.redis.io/releases/redis-5.0.7.tar.gz 解压到 opt目录下 tar -zxvf redis-5.0.7.tar.gz -C /opt apt install -y gcc # 安装gccapt install make # 安装make 后面执行make一直报错 make报错后清除: make …

parallels desktop19.3最新版本软件新功能详细介绍

Parallels Desktop是一款运行在Mac电脑上的虚拟机软件,它允许用户在Mac系统上同时运行多个操作系统,比如Windows、Linux等。通过这款软件,Mac用户可以轻松地在同一台电脑上体验不同操作系统的功能和应用程序,而无需额外的硬件设备…

分布式与一致性协议之拜占庭将军问题(三)

拜占庭将军问题 叛将先发送消息 如果是叛将楚先发送作战消息,干扰作战计划,结果会有所不同吗? 在第一轮作战信息协商中,楚向苏秦发送作战指令"进攻",向齐、燕发送作战指令"撤退",如图所示(当然还…

腾讯云向量数据库-RAG介绍2

1.chunk拆分对最终效果的影响 2.改进知识的拆分方案 3.AI套件 4.相似性检索的关键:embedding技术 嵌入技术是相似性检索的关键,它能够将数据转换为向量表示,并通过比较向量之间的相似性来实现相似性检索;embedding:将…

Jackson 2.x 系列【30】Spring Boot 集成之数据脱敏

有道无术,术尚可求,有术无道,止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址:https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 概述2. 实现思路3. 案例演示3.1 脱敏规则3.2 自…

解决VSCode中“#include错误,请更新includePath“问题

目录 1、问题原因 2、解决办法 1、问题原因 在编写C程序时,想引用头文件但是出现如下提示: (1)首先检查要引用的头文件是否存在,位于哪里。 (2)如果头文件存在,在编译时提醒VSCo…

如何理解自然语言处理中的位置编码(Positional Encoding)

在自然语言处理和特别是在使用Transformer模型中,位置编码(Positional Encoding)是一个关键的概念。它们的作用是为模型提供序列中各个元素的位置信息。由于Transformer架构本身并不像循环神经网络(RNN)那样具有处理序列的固有能力,位置编码因此显得尤为重要。 为什么需…

【学习】服务器解决:重新分配同样端口号后,连不上VScode

原来服务器分配的环境有问题,重新分配了一下。还是同样的端口号,Xshell和xftp能够连接上,但是VScode连接不上。 问题解决: 清除本地 SSH 缓存中与远程主机相关的条目可以通过编辑 known_hosts 文件来实现。这个文件包含了您曾经连接过的远程主…

Linux报错处理:‘abrt-cli status’ timed out

最近登录服务器时出现报错,后来查阅资料发现是因为ssh登录时间很久,登录后出现abrt-cli status timed out 的报错。 1.问题分析 abrt-cli是ABRT(Automated Bug Reporting Tool)的命令行接口,用于在Linux系统中处理和报告程序崩溃。 如果abr…

[Qt的学习日常]--初识Qt

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、Qt的基本…

代码随想录算法训练营第四十六天| LeetCode139.单词拆分

一、LeetCode139.单词拆分 题目链接/文章讲解/视频讲解:https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html 状态:已解决 1.思路 单词明显就是物品,字符串s明显就是背包,那么问题就变成了物品能不能把背…

数据可视化———Tableau

基本认识: 维度:定性—字符串文本,日期和日期时间等等 度量:定量—连续值,一般属于数值 数据类型: 数值 日期/日期时间 字符串 布尔值 地理值 运算符 算数运算符:加减乘除,%取余,…

Stable Diffusion WebUI 使用 LoRA 调整风格——详细教程

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 本教程旨在深入探讨 LoRA 模型的奥秘,涵盖其基本概念、独特作用以及实操指南。我们将从下载和使用LoRA的步…

8.4.3 使用3:配置单臂路由实现VLAN间路由

1、实验目的 通过本实验可以掌握: 路由器以太网接口上的子接口配置和调试方法。单臂路由实现 VLAN间路由的配置和调试方法。 2、实验拓扑 实验拓扑如下图所示。 3、实验步骤 (1)配置交换机S1 S1(config)#vlan 2 S1(config-vlan)#exit S…

微服务项目实战-黑马头条(八):App端-文章ES搜索、MongoDB搜索记录和关键词联想

文章目录 一、今日内容介绍1.1 App端搜索-效果图1.2 今日内容 二、搭建ElasticSearch环境2.1 拉取镜像2.2 创建容器2.3 配置中文分词器 ik2.4 使用postman测试 三、app端文章搜索3.1 需求分析3.2 思路分析3.3 创建索引和映射3.4 数据初始化到索引库3.4.1 导入es-init到heima-le…

【七】jmeter5.5+influxdb2.0+prometheus+grafana

参考文章:https://blog.csdn.net/wenxingchen/article/details/126892890 https://blog.csdn.net/Zuo19960127/article/details/119726652 https://blog.csdn.net/shnu_cdk/article/details/132182858 promethus参考 由于自己下载的是infuldb2.0,所以按照…