分布式链路跟踪技术如何应用至灾备系统中?
随着分布式系统的广泛应用,业务系统的复杂度快速提升,在业务逻辑的执行情况的分析和定位,变得愈发困难。
在灾备系统中,灾备方案的设计通常需要对系统有一个清晰的链路调用图谱的理解,这不仅是主动发现系统故障部位的前置条件,也是系统发生非自然灾害故障后,对于故障的排解必不可少的手段。
而目前的常见的混沌工程,例如阿里的ChaosBlade、云原生团队的ChaosMesh,可以提供通用且常见的故障模拟方案,例如基础资源、云原生环境等实验场景,工具非常强大,不过模拟的故障粒度较大,例如物理机器宕机,断网等,而灾备方案对于这类故障的处理通常需要进行灾备系统唤醒、流量切换。
这种故障一旦发生如果没有灾备方案带来的损失是巨大的,不过这类故障发生的频率还是比较小,灾备切换影响范围也比较大,而对于某些应用级、甚至更小型的故障,例如中间件挂掉、或者应用bug等这种类型的故障,其发生的概率更高,影响有时也非常严重,但通常不在灾备考虑的范围内,主要是因为这类小型故障难以定位。尤其在分布式系统中,业务场景下的某次请求通常需要经过若干个服务、中间件、甚至多台机器的处理,问题的定位费时费力。
如果在灾备方案确定之前,尽可能把所有故障都考虑在内,那么这套灾备方案将是完整的,线上业务将是稳定且持续的。
目前分布式场景下,小型故障追踪的手段包括两种:
- 收集日志至ES,根据关键字筛选(ELK方案)
- 基于单次请求调用的会话追踪
故障演练
故障演练是灾备系统中的一个步骤,在灾备方案确立部署完成之后,通常需要进行故障的模拟注入,来验证灾备系统的可行性,从而不断完善。而如何提高故障演练的覆盖面,也就是尽可能在故障演练阶段就把所有以后可能发生的故障都注入一边,从而增强灾备系统的健壮性,这个问题通常是比较难的。
traceId: sn0o1c
---1--->A---2--->B---3--->C
|
4
|
v
D---5--->E
分布式链路跟踪原理
在分布式系统环境下,为了发现某一次的服务调用经过了哪些服务、哪些机器是比较难的,而且场景复现困难。
链路跟踪的作用是:
- 自动采集数据
- 分析数据,产生完整调用链,方便问题复现
- 可视化展示,可以帮助直观的发现问题
在链路跟踪系统中,一次请求就是一个trace,它有一个traceId来标识它的唯一性,内部的每一次调用是一个span,每个span都携带全局的traceId,这样可以吧traceId与每个调用关联起来。
以下图为例,某次请求,经过了5次调用。
在这其中链路跟踪系统共收集了以下数据:
- 此次的请求的traceId为sn0o1c;
- 此次请求经历了5此调用,因此包含了5个span,其id分别是1,2,3,4,5,同时每个span存储了其父子关系;
- 每次调用的时间。
因此汇总下来:
traceId | spanId | parentSpanId | start | end |
---|---|---|---|---|
sn0o1c |
1 |
00:00:00 |
00:00:08 |
|
sn0o1c |
2 |
1 |
00:00:01 |
00:00:07 |
sn0o1c |
3 |
2 |
00:00:02 |
00:00:05 |
sn0o1c |
4 |
2 |
00:00:02 |
00:00:06 |
sn0o1c |
5 |
4 |
00:00:03 |
00:00:05 |
----------------------1-------------------------
------------------2-------------------
-----------3-----------
--------------4-------------
------- 5--------
----------------------Time---------------------->
另外链路跟踪工具比如SkyWalking有一套标准流程OpenTracing,比如span如何采集、如何跨进程传递上下文信息等等,感兴趣的同学可以具体区了解学习,在此不再赘述。
分布式链路追踪可以提高灾备系统的灾难覆盖度
整理完后续补充...