暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

用它!分布式系统APM工具的优雅之选“SkyWalking”

IT那活儿 2022-06-01
944

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!


小时候我们都盼望着能够快点长大,长大后,那段懵懵懂懂、无忧无虑的岁月时时让我们怀念。而现在努力奋斗的我们正在让孩子的生活,更加精彩!


6.1儿童节

祝我们的大朋友们

永葆童心,友爱友趣!




开头篇


 

想必从事运维的都听说过微服务架构
微服务架构是个好架构,它把整体的业务拆分成了若干个功能明确、目的统一的小服务,通过很多分散的小服务去整合排列,最终解决更大、更加复杂的业务场景。同时,架构中对拆分后的小服务进行分类和管理,彼此之间使用统一的协议来进行交互。
这个设计从开发的角度,看上去很简明美好。但我们做运维的,看到这样的设计,不免心里要犯怵:
这种微服务架构的特点,决定了它的部署往往是分布式的。在传统环境下,所有业务都在一个服务器上来回折腾,出了问题,只要从一个点看过去,就能够快速定位问题。可微服务架构可不遵循这套逻辑。通过总线交互的,可都是无状态的服务。当前台的业务流会经过很多个微服务的处理和传递时...
分散在各个服务器上的日志怎么处理?
业务挂了,怎么定位问题?
怎么跟踪业务流的处理结果?
不用担心!因为,发现这个麻烦的不只你一个人。
早在2015年,就有一个名叫吴晟的开发者开源了一个名为Skywalking的分布式系统的应用程序性能监控工具,专为微服务云原生基于容器的 (Kubernetes) 架构而设计。而随着这几年的发展,这个工具已经在功能、性能、界面效果上实现了突飞猛进的发展。
抓重点,开源、专为微服务架构设计,功能性能两开花。这不就是微服务架构维护人员梦寐以求的APM神器嘛?!不说了,用它
在接下来的内容中,将手把手的带你完成基于Nacos的Skywalking集群搭建Skywalking工作原理简要解读

 



Nacos集群搭建


 

为什么要先介绍Nacos?
这是因为Skywalking OAP(Observation Application Platform)之间本身不能搭建集群,需要一个集群管理器来组建集群,目前Skywalking 支持Nacos、zookeeper、Kubernetes、Consul、Etcd 等多种集群管理器。
又因为Nacos 擅长于发现、配置和管理微服务,又提供了一组简单易用的特性集,帮助用户快速实现动态服务发现、服务配置、服务元数据及流量管理。所以,自然成为了搭建Skywalking集群的一个很棒的选择[3](当然,如果你是忠实的zookeeper或者Kubernetes用户,那么继续使用它们也完全不影响感受Skywalking带来的优雅体验)
首先,带来我们的架构图设计,这里采用了搭建生产环境的最低配置。
图一 生产可用Nacos集群部署架构图
可以看到,该部署架构图有如下特征:
  • 使用三个节点来构建Nacos集群。(官方[1]要求使用三个及以上Nacos节点才能建立集群);

  • 使用主从Mysql作为后端存储;

  • 额外依赖为JDK和Nginx,但只需要在Leader节点上配置JDK和Nginx即可。(Nacos软件需要在三个节点均配置

既是针对小白的教程,那么每一步的构建部署都不会随意跳过。保证所有软件及依赖安装,从零开始不跳步骤一步一截图
1. 从官网下载Nacos安装包
在本实验案例中,安装包下载后,上传至ftp后,在对应主机通过ftp下载。
图二 在对应主机通过ftp下载安装包
2. 解压安装包
使用unzip命令解压安装包。
图三 使用unzip命令解压安装包
3. 编辑Nacos集群配置文件
编辑Nacos集群配置文件(Nacos的配置文件都在<安装目录>/Nacos/conf目录下),指定三个节点的IP和端口。
图四 编辑Nacos集群配置文件
4. 创建数据库
使用<安装目录>/Nacos/conf目录下的Nacos-mysql.sql创建数据表。(需要提前手动创建数据库)
图五 创建完成的数据库
5. 修改Nacos Server配置文件
修改Nacos Server配置文件,主要修改的内容是连接数据库的部分。这里使用的Mysql数据库用户名为root,密码为123456
图六 修改Nacos Server配置文件
6. 尝试启动Nacos Server
使用<安装目录>/Nacos/bin目录下的startup.sh来启动Nacos Server。启动后根据提示查看错误日志,发现报错为找不到JDK。
图七 启动Nacos Server
7. 安装JDK
这里安装JDK,使用的是存放在FTP服务器上的安装包,版本为jdk1.8。
图八 下载jdk安装包
8. 配置JDK环境变量
根据之前启动Nacos Server的报错配置JDK环境变量JAVA_HOME。
图九 配置JDK环境变量并source生效
9. 尝试启动Nacos Server
继续启动Nacos Server,发现报错为Nacos无法连接数据库。
图十 报错为Nacos无法连接数据库
10. 修改Mysql用户登陆设置
查看数据库用户登录设置后发现,配置的root用户默认只能从localhost登录,因此使用如下语句来修改用户登陆设置为可以从任何IP登录。
use mysql;
update user set host = '%'  where user ='root';
flush privileges;

quit

图十一 修改数据库登录用户设置
11. 尝试启动Nacos Server
再次尝试启动Nacos Server,启动成功。
图十二 启动Nacos Server成功
12. 修改Nginx配置文件
为了能够使用Nacos的图形化Web管理界面,这里需要在Leader节点上配置Nginx。如果使用的是CentOS操作系统,可以参考[2]中的Nginx部署配置过程。
图十三 配置Nginx步骤截图
13. 进入Web图形界面
之前创建的数据库里,默认创建了一个名为nacos的用户,密码为加密的nacos。使用该用户名和密码,可以登录Nacos的Web图形管理界面。IP为<Leader节点的IP>/Nacos。
图十四 登录图形化Nacos的Web管理界面
14. 在其他节点上进行同样的操作
可以从图形界面的「集群管理」->「节点列表」里发现,当前只启动了一个节点的Nacos Server。我们模仿之前的步骤,依次启动其他节点的Nacos Server。
图十五 启动其他节点的Nacos Server之后,在Web界面中可以看到节点从「Down」状态转为「Up」状态
15. 关闭Nacos Server
如果需要关闭Nacos Server,只需要运行<安装目录>/Nacos/bin下面的shutdown.sh即可。
图十六 运行shutdown脚本之后,在Web界面中可以看到节点从「Up」状态转为「Down」状态

 



基于Nacos的Skywalking集群搭建


 

短短的十几步,就已经完成了JDKNginxMysql主从Nacos这一大堆环境的搭建,搞出了一个最基础的生产可用Nacos集群
那么,让我们来继续完成这最后的步骤吧。
首先,先看看加入了Skywalking之后,架构图发生什么样的变化。
图十七 基于Nacos的Skywalking集群部署架构图
可以看到,对比之前的Nacos集群搭建,这里相当于在Leader节点上额外配置一个ES,并且在集群的每个节点上配置一份Skywalking。
因此,很显然可以得出这一部分的部署思路:在之前Nacos集群部署的基础上,额外配置ES7和Skywalking即可参考[4]
1. 从官网下载ES7和Skywalking安装包
在本实验案例中,安装包下载后,上传至ftp后,在对应主机通过ftp下载。
图十八 在对应主机通过ftp下载安装包
2. 修改ES配置文件
解压安装包之后,进入到ES安装目录,修改ES的配置文件(配置文件目录为<ES安装目录>/config/elasticsearch.yml)。
在本实验案例中,将ES集群的名称命名为test(该命名需要与后续的Skywalking配置中的配置项内容相同)。同时,该配置文件中的data和logs目录如果不存在,需要手动创建。
图十九 修改ES配置文件
3. 创建es用户并修改目录权限
由于ES限制使用root用户启动,因此需要单独创建es用户,并修改ES目录属组。
useradd es
chown es:es <ES安装目录>
图二十 修改ES安装目录属组为es:es
4. 启动ES
启动ES在<ES安装目录>/bin下运行sh startup.sh -d即可。启动成功后,ES默认使用9200端口,在浏览器打开对应ip:port,可以看到安装情况。如果看到下图的内容,则表示安装成功。
图二十一 ES安装成功浏览器显示结果
5. 修改Skywalking配置文件
解压安装包之后,进入到Skywalking安装目录,修改ES的配置文件(配置文件目录为<Skywalking安装目录>/config/application.yml)。
涉及到的配置项如下:
1)配置集群为nacos
在本实验案例中,将nacos集群的使用的命名空间为默认的public,nacos用户名和密码使用默认的nacos/nacos,服务名为SkyWalking_OAP_Cluster
图二十二 配置集群
2)配置数据库为ES
在本实验案例中,根据上面步骤的记录,将ES的集群名设置为test
图二十三 配置数据库
3)设置集群配置为nacos
在本实验案例中,将nacos集群的使用的命名空间为默认的public,nacos用户名和密码使用默认的nacos/nacos
图二十四 集群配置
6. 启动Skywalking
启动Skywalking在<Skywalking安装目录>/bin下运行sh startup.sh即可。启动成功后,Skywalking默认使用8080端口,在浏览器打开对应ip:port,可以看到图形化界面。(因为目前还没有任何数据,因此图形化界面里是空的)
图二十五 Skywalking启动成功反馈以及web图形化界面
7. Nacos图形界面查看服务
完成Skywalking启动后,可以在Nacos图形界面查看服务。
图二十六 在Nacos图形界面查看服务
8. 在其他节点上进行同样的操作
在其他节点上进行同样的操作,只修改服务名为SkyWalking_OAP_Cluster_2和服务名为SkyWalking_OAP_Cluster_3。在Nacos图形界面可以看到三个节点的服务[5]
图二十七 在Nacos图形界面可以看到三个节点的服务
至此我们已经成功完成了部署。
那么,让我们顺便来看一眼Skywalking的工作原理吧。了解它能帮助你更好的理解它的功能和效果。

 



Skywalking工作原理简要解读


 

Skywalking的源码量并不小,但理解它的核心在于明白它对应用监控的逻辑。在Skywalking中,这个功能通过探针实现。该功能是 Java 虚拟机提供的一整套后门。通过这套后门可以对虚拟机方方面面进行监控与分析。
我们可以从此切入,通过这样的思路[6]来了解Skywalking的工作原理。
1. 启动方式
通常Agent分为静态启动动态启动
1)静态启动:使用 -javaagent 参数,在类加载时对目标类的字节码可以进行任意修改,只要最后的结果符合字节码规范,SkyWalking 只支持这种方式启动 Agent。
2)动态附加:使用 Attach API,类已经加载完成并被使用,这时候只能对目标类的字节码进行有限的修改,典型的应用:系统诊断(阿里 Arthas、笨马 XPocket)。
2. 启动流程
在源码的agents部分中,可以看到它的启动流程如下:
1)初始化配置。(加载配置信息、将配置信息映射到 Config 类、根据配置信息重新指定日志解析器、检查 Agent 名称和后端地址是否配置、标记配置加载完成)
2)加载插件。(并行类加载器)
3)定制化Agent。(创建 ByteBuddy 实例、指定 ByteBuddy 要忽略的类、将必要的类注入到 BootstrapClassLoader 中、解决 JDK 模块系统的跨模块类访问、根据配置决定是否将修改后的字节码保存到磁盘/内存上)
4)启动服务。
5)注册关闭钩子。
3. 服务 BootService
Skywalking中主要的服务有如下几个:
1)GRPCChannelManager(Agent到OAP的网络连接、定时重连、通知监听器网络连接状态的变化);
2)ServiceManagementClient(向OAP汇报自身的信息、保持心跳);
3)CommandService(调度 OAP 下发的命令、CommandExecutorService);
4)SamplingService(控制链路是否被上报到 OAP);
5)JVMService(收集 JVM 的相关指标);
6)KafkaXxxService(由 Agent 直连 OAP 改为通过 Kafka 交互、大部分的采集的数据都改为走 Kafka);
7)StatusCheckService(用来判断哪些异常不算异常)。
4. 链路追踪
链路追踪是Skywalking实现的最基本功能,理解它需要首先知道这几个概念。
1)Trace:表示一整条链路(跨线程、跨进程的所有 Segment 的集合)
2)Segment:表示一个 JVM 进程内的一个线程中的所有操作的集合
3)Span:表示具体的某一个操作
TraceSegment(组成 Trace 的基本单元、TraceSegmentRef 用于引用 Parent Segment、所有的 Span 维护在一个 LinkedList 中;
relatedGlobalTraceId 表示当前 Segment 所在的 Trace、isSizeLimited 如果为 true 表示当前这条线程内发生的操作次数超过了配置值,Segment 丢弃了一部分操作);
Span(AsyncSpan - Span 的骨架、AbstractTracingSpan - 用于链路追踪的 Span 模型)。
大家看到这里,是不是对Skywalking的工作原理有了初步的印象,不再觉得这是一个完全吃不透的黑盒子了?

 



总结篇


 

虽然Skywalking这个开源项目在经历了多年的commit之后,已经变得相当庞大,但其基本工作原理和流程仍旧精炼优雅
本文初步探索了生产可用的Skywalking集群搭建,并且简要的介绍Skywalking的工作原理,阐释了其运转流程。希望能够帮助小白上手,或者给予老手些微的启发。

参考资料:

[1] https://Nacos.io/zh-cn/index.html(Nacos官网)

[2] https://blog.csdn.net/qq_37345604/article/details/90034424(安装nginx)

[3] https://www.imooc.com/article/288153/(搭建生产可用Nacos集群)

[4] https://www.cnblogs.com/fuhai0815/p/13344150.html(Centos7 Nacos + Elasticsearch + SkyWalking)

[5] https://www.bilibili.com/read/cv6621424/(基于Nacos的Skywalking集群配置)

[6] https://www.processon.com/view/link/611fc4c85653bb6788db4039#map(Skywalking源码思维导图)



END



本文作者:戴 波

本文来源:IT那活儿(上海新炬王翦团队)

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论