隔离

隔离

隔离,本质上是对系统或者资源进行分割,从而实现当系统发生故障时能够限定传播范围和影响范围,即发生故障后只有出问题的服务不可用,保证其他服务仍然可用。

1. 服务隔离

1.1 动静隔离

小到CPU的cacheline,false sharing、数据库mysql表设计中避免bufferpool频繁过期,隔离动静表,大到架构设计中的图片、静态资源等缓存加速。本质上都体现的一样的思路,即加速、缓存访问变换频次小的。比如CDN场景中,将静态资源和动态API分离。

1.2 服务隔离

把少量更新的表和频繁更新的表分割开,MySQL BufferPool是用于缓存DataPage的,DataPage可以理解为缓存了表的行,那么如果频繁更新DataPage不断会置换,导致命中率下降。

1.3 轻重隔离

核心隔离,业务按照level进行资源池划分(L0/L1/L2)

  • 核心和非核心的故障与的差异隔离
  • 多集群,通过冗余资源来提升吞吐和容灾能力

1.4 快慢隔离

可以把服务的吞吐想象成一个池子,当洪峰进来时,池子需要一定时间才能排放完,这时候其他的支流在池子中的时间取决于前面的排放能力,就会变慢。

1.5 物理隔离

Java中,线程池可能被耗尽,但是go中goroutine是托管给runtime,而且线程不会阻塞,但是goroutine最终越来越多,最终oom掉。

主要通过线程池进行隔离,也是实现服务隔离的基础,把业务进行分类并交给不同的线程池处理,这样当某一个业务出现故障时,不会影响到其他故障。

1.6 进程隔离

每个容器只运行一个进程

Case:

转码集群被超大视频攻击,导致转码大量延迟

某用户制造了一个大视频,上传后处理时间变长,大量同类似视频上传后,转码器服务被堵住,导致小视频转码被阻塞。

按照大视频和小视频进行集群隔离,大视频走A集群,小视频走B集群,这样就不会互相干扰。

缩略图服务,被大图实时缩略图吃完所有CPU,导致正常小图缩略图被丢弃,大量503

缩略gif图片时,耗时更长,导致其他图片缩略阻塞,思路也按照上一个case处理,把全局故障转换为局部故障

数据库实例cgroup未隔离,导致大SQL引起的集体故障

由于mysql没有上容器,部署了多个数据库端口到物理机上,有一个大SQL导致某一个MYSQL CPU突然飚高,导致所有的mysqld全部变慢

INFO日志量变大,导致ERROR日志采集延迟

发版后,搜索Error看不到,原因是其他服务打印了一个超级大的request body,导致报错日志采集延迟,发版时未检索到,误以为发版正常,导致大量请求报错,这时候我们就需要把日志进行topic和文件的隔离,分别进行采集。


隔离
https://www.zengzx.xyz/2023/03/07/01.知识架构/微服务/5.隔离/
作者
Eden
发布于
2023年3月7日
许可协议