168大数据

标题: 架构师如何技术选型-全链路监控 [打印本页]

作者: 168主编    时间: 2019-4-22 19:47
标题: 架构师如何技术选型-全链路监控
1、如何技术选型,应该是架构师必须具备的技能2、场景项目(全链路监控)2.1 项目背景2.2 技术选型
技术选型范围:Openzipkin、Pinpoint、Incubator-skywalking、Lightstep、Appdash、Jaeger。
2.2.1 Appdash
Appdash是Go的应用程序跟踪系统,基于Google的Dapper和Twitter的Zipkin。
Appdash允许您跟踪应用程序中请求和操作的端到端处理(用于执行和调试)。它显示每个步骤的计时和特定于应用程序的元数据,并显示每个请求及其子项的树和时间轴。要使用appdash,您必须通过调用appdash录音机来检测应用程序。 您可以记录任何类型的事件或操作。 求及其子项的树和时间轴。要使用appdash,您必须通过调用appdash录音机来检测应用程序。 您可以记录任何类型的事件或操作。 提供了HTTP(客户端和服务器)和SQL的记录器和模式,可以编写自己的记录器和模式。
Appdash遵循Google Dapper的设计和命名惯例。 如果您对某些架构选择的原因感到好奇,那么您应该阅读该论文。 项目基础组件:
2.2.2 Lightstep
Lightstep全链路解决方案非常完整,整体解决方案和微服务架构生态完美的匹配,如果技术栈匹配,可以开箱即用,维护一个稳定的基线版本,Lightstep学习成本较高,可以复用Lightstep的架构思想,自研全链路框架。
Lightstep特性:
Lightstep支持语言:Java、Js、Go、Python、Object-c、Ruby,Lightstep支持OpenTracing API及规范。
2.2.3 Jaeger
Jaeger支持语言:Java、Go、Node、Python和C++,Jaeger支持OpenTracingAPI及规范, Jaeger是Uber开源的全链路监控框架,解决方案的完整性的程度和Lightstep差不多,整体学习成本要低,提供了丰富的探针客户端。
Jaeger用于基于微服务的分布式系统监控和排错,包括:
Jaeger支持高可扩展性,Jaeger后端旨在不会出现单点故障,并可根据业务需求进行扩展。 例如,Uber的任何给定Jaeger安装通常每天处理数十亿个跨度。Jaeger后端,Web UI和仪器库的设计初衷是为了支持OpenTracing标准。
Jaeger支持两种流行的开源NoSQL数据库作为跟踪存储后端:Cassandra 3.4+和Elasticsearch 5.x / 6.x. 正在进行使用其他数据库的社区实验,例如ScyllaDB,InfluxDB,AmazonDynamoDB。 Jaeger还提供了一个简单的内存存储器,用于测试设置。
Jaeger Web UI使用流行的开源框架(如React)在Javascript中实现。 在v1.0中已经发布了几项性能改进,以允许UI有效地处理大量数据,并显示具有数万个跨度的跟踪(例如,我们尝试了80,000跨度的跟踪)。
Jaeger后端作为Docker镜像的集合分发。 二进制文件支持各种配置方法,包括命令行选项,环境变量和多种格式的配置文件(yaml等)Kubernete s模板和Helm图表协助部署到Kubernetes集群。如何公司需要自研全链路,则可以参考Jaeger和Lightstep,优选Jaeger,Jaeger底层支持Zipkin标 准,可以无缝迁移,公司链路底层如果是采用Zipkin,可以完整的切入到新的自研的链路系统。所有Jaeger后端组件都默认公开Prometheus指标( 也支持其他指标后端)。 使用结构化日志库zap将日志写入标准输出。Jaeger兼容Zipkin,虽然我们建议使用OpenTracing API检测应用程序并绑定到Jaeger客户端库,以便从其他地方没有的高级功能中受益,但如果您的组织已经使用Zipkin库投资了检测,则不必重写所 有代码。 Jaeger通过HTTP接受Zipkin格式(Thrift或JSON v1 / v2)的跨度,向Zipkin提供向后兼容性。 从Zipkin后端切换只需将Zipkin库中的流量路由到Jaeger后端。
2.2.4 Incubator-skywalking
SkyWalking是一个开源的APM系统,包括监控,跟踪,诊断Cloud Native架构中分布式系统的功能。 核心功能如下:
SkyWalking支持从不同来源收集遥测(痕迹和指标)数据,以便为不同的场景提供更多选项。SkyWalking探针覆盖率几乎达到100%,几乎覆盖了 所有的技术栈,全链路监控,探针覆盖率也是一个比较重要的指标。
2.2.4 Openzipkin
微服务框架SpringCloud已经整合了openzipkin,有现成的链路解决方案,底层框架直接使用Springboot,如果是为了节约开发成本,可以直接截取S pring-Cloud-Sleuth某一个里程碑版本,维护起来,并架构演化为自研链路框架。
Spring Cloud Sleuth为Spring Cloud实施分布式跟踪解决方案,大量借用Dapper,Zipkin和HTrace。 对于大多数用户来说,探针应该是无感知的,并且所有与外部系统的交互都应该自动进行检测。 您可以简单地在日志中捕获数据,也可以将数据发送到远程收集器服务。
Span是基本工作单元。 例如,发送RPC是一个新的跨度,就像RPC发送响应一样。 跨度由跨度的唯一64位ID和跨度为其一部分的跟踪的另一个64位ID标识。 Spans还有其他数据,例如描述,键值注释,导致它们的跨度的ID以及进程ID(通常是IP地址)。 跨度启动和停止,他们跟踪他们的时间信息。 创建跨度后,必须在将来的某个时刻停止它。 一组跨度形成一个称为Trace的树状结构。 例如,如果您正在运行分布式大数据存储,则可能会由put请求形成跟踪。将跟踪和跨度ID添加到Slf4J MDC,因此您可以从日志聚合器中的给定跟踪或跨度中提取所有日志;提供对常见分布式跟踪数据模型的抽象:跟踪,跨距(形成DAG),注释, 键值注释。 松散地基于HTrace,但兼容Zipkin(Dapper);探针常见的入口和出口点来自Spring应用程序(servlet过滤器,休息模板,预定动作,消息通道, zuul过滤器,假装客户端);如果spring-cloud-sleuth-zipkin可用,则该应用程序将通过HTTP生成并收集与Zipkin兼容的跟踪。 默认情况下,它将它们发送到localhost(端口9411)上的Zipkin收集器服务。 使用spring.zipkin.baseUrl配置服务的位置
2.2.4 Pinpoint
Twitter的 Zipkin 使用修改过的类库和它自己的容器(Finagle)来提供分布式事务跟踪的功能。但是,它要求在需要时修改代码。我们期望功能可以不修改代码就工作 并希望得到代码级别的可见性。为了解决这个问题,pinpoint中使用了字节码增强技术。Pinpoint agent干预发起RPC的代码以此来自动处理标签信息。
字节码增强在手工方法和自动方法两者之间属于自动方法:
字节码增强的价值:
由于字节码增强技术处理java字节码, 有增加开发风险的趋势,同时会降低效率。另外,开发人员更容易犯错。在pinpoint,我们通过抽象出拦截器(interceptor)来改进效率和可达性(acc essibility)。pinpoint在类装载时通过介入应用代码为分布式事务和性能信息注入必要的跟踪代码。这会提升性能,因为代码注入是在应用代码中直 接实施的。在pinpoint中,拦截器API在性能数据被记录的地方分开(separated)。为了跟踪,我们添加拦截器到目标方法使得before()方法和after() 方法被调用,并在before()方法和after()方法中实现了部分性能数据的记录。使用字节码增强,pinpoint agent可以记录需要方法的数据,只有这样采样数据的大小才能变小。
2.3 项目优势
项目开发的生命周期和上线之后维护的生命周期是否活跃,主要取决于项目立项之初的项目优势,假想项目优势如下:
2.4 项目成本估算2.4.1 技术调研成本
技术调研耗时:一人/5d,调研开源的主流的APM框架,考究是否支持OPENTRACING规范,以及技术借鉴成本。
2.4.2 技术方案设计成本
可以落地的技术方案设计成本:预估一人/5d 可以落地链路设计的基础架构搭建,以及预评估的可用插件的植入(不包含全部)
2.4.3 技术方案评审成本
技术方案评审讨论:头脑风暴、集思广益,结合业务场景的最佳解决方案,预估2d
2.4.4 技术方案落地成本
技术方案一期落地成本:按照以前做全链路的经验,全职开发前后端配合,60d
2.4.5 技术方案落地成本
项目实施成本主要是部门沟通和链路项目上线对业务系统影响面的评估
2.4.6 项目推广成本
分享和布道成本
2.5 项目风险2.6 全链路架构详细设计2.6.1 松耦合方案整体设计
框架模块功能:
2.6.1 AGENT方案整体设计
Agent方案主要是将Instrumented-client-plugin和Instrumented-server-plugin和业务解耦,全部植入到agent组件中,对业务完全无感知。 整体设计如下:
模块功能:
2.7 全链路领域模型设计
基于openTracing规范: trace和traceId:trace是全局监控系统的一次跟踪(用traceId标示一次跟踪,贯穿整个跨进程请求),多个span信息,及其关系信息。
2.8 模块详细设计2.8.1 耦合探针
设计描述:
2.8.1.1 dubbo
重写dubbo filter,为每个应用包装ConsumerFilter和ProviderFilter,植入opentracing-api到dubbo,串联dubbo链路
2.8.1.2 SpringMvc
AOP切面,拦截注解@Controller和@ResetController,植入opentracing-api,拦截before和after,串联SpringMvc链路
2.8.1.3 SpringService
AOP切面,拦截注解@Service,植入opentracing-api,拦截before和after,串联SpringService链路
2.8.1.4 线程池和线程
统一线程和平台线程池,通过方法重载和反射植入opentracing-api,拦截before和after,串联线程链路
2.8.1.5 消息中间件
AOP侵入客户端
2.8.1.6 agent
agent也需要探针,只是探针逻辑被封装到了 agent,作为agent的个性化模块,独立于agent的基础模块之上。
agent设计原则:
2.9 技术关键点突破设计2.9.1 如何保证链路的完整性2.9.2 如何通过agent完全与应用隔离,如何做到通过agent做负载,agent分布式部署2.9.3 如何回溯链路节点状态,快速的定位到某一个出问题的链路事件单元span
全流程排查引擎。核心部分是链路最初覆盖的的后端系统,包括服务、消息和缓存;在前端层面涉及前端用户访问日志,具有关联TraceId的能力 ;在移动端也具有关联TraceId的能力;通过对TraceId进行关联,可以打通用户访问日志;在数据库层面,通过SQL语句将TraceId传到数据库的binl og中,在数据复制和数据分发时可以非常容易获取到每次数据变更的记录与TraceId的关联;另外,业务通过自身的业务日志和异常堆栈也可以打印 TraceId;这样一来,业务层、移动端、前端、数据层所有的组件都与TraceId进行了关联,再关联上业务中的订单号、用户号、商品号、物流单号 、交易单号,最后形成一个非常强大的生态——从一个调用链可以看到上下游相关的订单、用户的详细信息,同时可以根据订单查到与该订单相关 的业务ID,再根据业务ID扩展到与其相关的更多ID,甚至是TraceId,最后形成TraceId-->业务ID-->新的TraceId的网状结构,将排查问题转化为从 网状结构中寻找需要的整段信息。
2.9.4 如何减少渠道通信的性能开销
渠道通信性能开销点:数据传输格式、序列化框架、承载数据的RPC框架,异步kafka和Rocketmq
2.9.5 如何减少application和agent之间的通信开销
通信由TCP→UDP,提高吞吐量。
2.9.6 提高系统的QPS和TPS,底层服务端改用go语言,go天生的并发神器语言,要比java简单
缺少技术栈储备,难点比较大。
2.9.6 链路从支持单一的树状结构到DAG(有向无环图)支持并行链路数据结构的存储
链路模型支持树和有向无环图两种数据结构。
2.9.7 RectUI
不能重复造轮子,第一期版本可以参照https://github.com/jaegertracing/jaeger-ui.git,将开源项目维护起来变为自研。
2.10 项目实施方案
项目内部系统功能测试和压力测试通过之后,就要考虑项目如何在业务系统中实施,初步计划方案如下:
2.11 项目版本演化方案
项目版本演化
2.12 项目推广方案
前期投入大量的人力研发全链路监控框架,推广其实是项目落地的最后手段。
推广阶段






欢迎光临 168大数据 (http://www.bi168.cn/) Powered by Discuz! X3.2