第三十篇:稳定性容量规划方法

news/2024/11/28 5:47:08/

前言

在谈容量规划之前,首先要知道我们的系统处理能力有限的,不可能是无限的,处理能力的限制取决于资源的限制,生活中很多这种例子,例如喝水的水杯,也是有容量限制的,超出容量限制,则溢出,再例如高速公路双向四车道、六车道、八车道等等,那么可以并行的车辆限制这取决于车道数,这里的车道数指的则是资源,那么在建设高速公路时,肯定会做相应的规划是四车道还是六车道合适,结合当下和对未来的预测从而规划和设计,对于我们的系统也是如此,要清楚的了解系统处理能力,资源使用率、容量规划等情况。

为什么要容量规划

随着业务越来越复杂,系统和服务逐渐增多,不同的系统特性和选用的机器资源也均不相同,容量规划是要能够清楚的知道各个业务系统的特性及机器资源使用情况,业务系统有什么特殊属性及需要什么样机器配置,如何选择和匹配达到最优的效果,这样便于知道什么时候该加机器,加什么样的资源机器,加多少及什么是该减少等等情况,从成本的角度既要保证系统的可用性、稳定性又要能够节约成本,避免资源浪费。如对于上述不清楚的话,就无法做系统的稳定性,对当前的系统不清楚、那么对后续规划肯定也是做不好的。

容量规划的方法

在容量规划之前首先要知道系统容量是可度量的,资源是有限的,所谓的容量是指系统最大负载的状态下的最大处理能力,或在满足业务目标的前提下,系统最大处理承受能力。

规划模型

容量规划模型大致可分为三步,分别是设定目标、指标汇总、容量摸底形成闭环,首先要能够清楚我对系统的期望,或者SLA是怎样的,其次是能够通过指标了解当前系统的运行状态,资源使用率等,最后是容量摸底手段是通过模拟用户并发对系统验证,观测系统是否满足期望。

设定目标

设定目标有两种形式,第一是从活动策划角度,例如:企业举办重大线上活动时,市场或运营的伙伴评估该活动的参与人数,将该人数给到技术伙伴,那么技术伙伴根据活动场景、特性及参与人数来准备资源,使系统能够满足该活动的要求。第二是从成本的角度,例如,在项目初期,流量不大的情况下,或者逐渐上升系统,要能够清楚当前的机器能够支撑多少流量,在什么样的情况下该增加资源,什么样的情况下该减少资源;上述情况都是需要能够清楚我们的资源和系统特性的配比,如:4核8G的服务器,结合系统的特性、在高峰期能够支撑多少流量,包括其他资源、数据库、缓存中间等等,高峰期是每天的某个时刻呢,还是每年的某个月份等等,对于用户层面的目标可以是SLA、对于服务内部的目标可以是SLO等等。

指标汇总

指标汇总有两部分,第一部分是硬件层面,如机器配置、CPU、内存等等,第二部分是软件层面、如错误率、线程数、并发数,最大连接数等。指标汇总可以分别埋点采集、日志、Agent形式,业界比较流行开源软件有Prometheus、Zabbix,通过上述的方式可以观测到硬件、软件层面的使用情况,如:CPU高峰期的使用率是否到达100%、内存的使用率、响应时间、超时/异常错误率等等,通过该方式可以清楚了解到系统整体运行状况及资源使用情况等等。

容量摸底

容量摸底是通过模拟并放大流量来观测系统的运行状态,容量摸底的形式有引流、模拟流量两种形式,第一是引流(流量复制),该方式可以直接将流量镜像到其他的机器,也可以录制流量、将其保存,在压测的时间段内将流量回访并放大倍数,Nginx提供了ngx_http_mirror_module模块,第二种方式采用模拟流量(模拟请求)压测、可以通过单机压测评估的表现状况,依次推算集群模式的表现状况,仅仅这样是不够的,在错综服务网格中,服务存在各种依赖,服务依赖也决定服务的表现情况,因此还要通过全链路压测来观测整体的表现状态,寻找系统瓶颈并优化,持续全链路压测,直到满足期望。

值得注意的是,上述情况可能存在脏数据的情况,为了防止脏数据的产生,多数情况我们只能对读操作压测,为了确保模拟更贴近线上,往往也需要对写的操作压测,这里提供一种解决方案,通过影子库的方式,在对写压测时,通过特殊标识,在请求头中进行上下文传递的方式,到写库操作时,判断是特殊标识,从区分将该数据写到主库还是影子库。影子库建议同一实例,通过数据库名称区分,好处是环境真实,缺点是影子库和主库存在同一实例。

扩展性

扩展性是依据架构师以往的经验,在架构设计时必须要考虑的扩展性,可参考扩展性的DID方法,分别是Design设计、Implement实现、Deploy实现,在设计时按照现有容量的20倍设计,按照现有容量的3倍实现,按照现有容量的1.5倍部署,是因为DID为系统的扩展性提供了经济、有效、及时的方法。扩展性是架构设计必须要考虑,并且要在设计阶段就需要考虑的,可以帮助团队节省资源和成本,一旦到实施阶段发现扩展性不够,那么再改变设计方案,带来的成本是相当大的,存在很大的风险。举个例如:假设某登录服务,该服务存储所有登录状态,从可用性的角度,要求登录服务是无状态,只有是无状态的服务,才能做到水平扩容,集群化,从而提升可用性,在设计登录服务时就需要思考上述问题和设计方案,包括服务的实现及部署方案,一旦到后期需要时,发现无法做到水平扩容,需要重构,那么带来的成本可想而知,因此对架构设计要求可扩展性强并具有弹性,它既可以扩张也可以收缩,要有一定的灵活性,随着业务规模的收缩和扩张,调整系统的容量。

容量管理

容量管理是对当前系统的容量管理,可以实时了解运行的容量,主动感知容量的瓶颈,及为扩容和收缩提供依据,主要是基于采集指标数据进行分析,对各个组件动态检测、实时感知组件容量瓶颈,并对各个组件设计预警阈值,还可以对历史数据对比分析,做未来趋势预测等等。例如:服务器的CPU使用率不能超过80%、数据库的CPU、内存、磁盘、数据增速、连接数阈值监控。容量管理可以实时预测容量瓶颈,预测瓶颈及时预警,主动感知变化,减少故障可能性。

趋势预测

趋势预测是依据容量管理中的历史数据对未来流量的趋势预测,从而预测容量,趋势预测整个过程中首先要明确指标Metrics,指标必须是可度量的,如:内存、磁盘、CPU使用率等,其次对现有资源的摸底,如:磁盘、内存总共大小,并且对该资源访问约束并阈值预警,超过阈值及时预警,防止资源溢出从而导致整个系统雪崩,试想下:如一共有五台机器,整体的资源利用率不超过80%,假设每台机器承受的QPS是200,那么整体QPS是1000,在QPS不变的情况下,假设突然一台机器宕机,那么剩余四台必然承受不了流量,相继继续宕机,出现雪崩现象,最后根据监控趋势图计算高峰期的时间点,及高峰期的资源利用率,对高峰期的防护,从而提升系统稳定性。


http://www.ppmy.cn/news/10924.html

相关文章

拿捏几道经典的字符串模拟问题

希望本篇对你有所帮助 我发现这种字符串的问题其实写起来很麻烦,可能思路不难多少都能想到一些,主要就是代码的处理,细节问题。太考验代码编写的能力了。这两天写了好多道字符串,模拟之类的问题,今天就分享分享吧 刚…

linux系统中利用QT实现绘制图和图标的方法

大家好,今天主要和大家聊一聊,如何使用QT进行绘图和图标的方法。 第一:绘图和图表简介 绘图与图表在嵌入式里有的比较多,尤其是图表,我们常在股票里看到的“图表折线/曲线图/饼状图等”都可以用 Qt 的图表来实现。绘图…

Java基础算法每日5道详解(3)

136. Single Number 单号 Given a non-empty array of integers nums, every element appears twice except for one. Find that single one. You must implement a solution with a linear runtime complexity and use only constant extra space. 给定一个非空整数数组 nu…

shell原理及Linux权限

shell及Linux权限 目录shell及Linux权限一、指令1.tar指令(重要)2.热键3.bc命令4.uname –r指令:5.关机6.以下命令作为扩展:二.shell命令以及运行原理三.权限1.权限的概念:2.Linux下有两种用户:超级用户(ro…

[C语言]进一步的来了解指针(多多多图详解)

本文章进一步的来讲解指针,如果是第一次接触指针的可以先看一下对于指针的初步理解 : [C语言]初步的来了解一下指针(多图详解)_HY_PIGIE的博客-CSDN博客 目录 1.字符指针 2.指针数组 2.1指针数组:char*类型举例说明 2…

Qt 使用 Matlab函数

背景:个人的Qt项目中,需要一个图片分割算法。该算法之前在Matlab上实现过,同时转成C版本有点麻烦,因此尝试通过Qt与Matlab编程相结合的方式,实现该功能。 注意:以下所有功能及配置过程,默认已经…

直观理解--马氏距离

首先我们很了解欧氏距离了,就是用来计算欧式空间(就是我们常见的坐标系)中两个点的距离的。 比如点 x(x1,…,xn)x (x_1,…,x_n)x(x1​,…,xn​) 和 y(y1,…,yn)y (y_1,…,y_n)y(y1​,…,yn​) 的欧氏距离为: d(x,y)(x1−y1)2(x2…

ESXI8.0一键安装黑群晖DSM7

🎈 作者:互联网-小啊宇 🎈 简介: CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作,擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…