用它!分布式系统APM工具的优雅之选“SkyWalking”
点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!
小时候我们都盼望着能够快点长大,长大后,那段懵懵懂懂、无忧无虑的岁月时时让我们怀念。而现在努力奋斗的我们正在让孩子的生活,更加精彩!
6.1儿童节
祝我们的大朋友们
永葆童心,友爱友趣!
微服务架构是个好架构,它把整体的业务拆分成了若干个功能明确、目的统一的小服务,通过很多分散的小服务去整合排列,最终解决更大、更加复杂的业务场景。同时,架构中对拆分后的小服务进行分类和管理,彼此之间使用统一的协议来进行交互。这个设计从开发的角度,看上去很简明美好。但我们做运维的,看到这样的设计,不免心里要犯怵:这种微服务架构的特点,决定了它的部署往往是分布式的。在传统环境下,所有业务都在一个服务器上来回折腾,出了问题,只要从一个点看过去,就能够快速定位问题。可微服务架构可不遵循这套逻辑。通过总线交互的,可都是无状态的服务。当前台的业务流会经过很多个微服务的处理和传递时...早在2015年,就有一个名叫吴晟的开发者开源了一个名为Skywalking的分布式系统的应用程序性能监控工具,专为微服务、云原生和基于容器的 (Kubernetes) 架构而设计。而随着这几年的发展,这个工具已经在功能、性能、界面效果上实现了突飞猛进的发展。抓重点,开源、专为微服务架构设计,功能性能两开花。这不就是微服务架构维护人员梦寐以求的APM神器嘛?!不说了,用它!在接下来的内容中,将手把手的带你完成基于Nacos的Skywalking集群搭建和Skywalking工作原理简要解读。
这是因为Skywalking OAP(Observation Application Platform)之间本身不能搭建集群,需要一个集群管理器来组建集群,目前Skywalking 支持Nacos、zookeeper、Kubernetes、Consul、Etcd 等多种集群管理器。又因为Nacos 擅长于发现、配置和管理微服务,又提供了一组简单易用的特性集,帮助用户快速实现动态服务发现、服务配置、服务元数据及流量管理。所以,自然成为了搭建Skywalking集群的一个很棒的选择[3]。(当然,如果你是忠实的zookeeper或者Kubernetes用户,那么继续使用它们也完全不影响感受Skywalking带来的优雅体验)首先,带来我们的架构图设计,这里采用了搭建生产环境的最低配置。图一 生产可用Nacos集群部署架构图既是针对小白的教程,那么每一步的构建部署都不会随意跳过。保证所有软件及依赖安装,从零开始,不跳步骤,一步一截图。在本实验案例中,安装包下载后,上传至ftp后,在对应主机通过ftp下载。图二 在对应主机通过ftp下载安装包图三 使用unzip命令解压安装包编辑Nacos集群配置文件(Nacos的配置文件都在<安装目录>/Nacos/conf目录下),指定三个节点的IP和端口。图四 编辑Nacos集群配置文件使用<安装目录>/Nacos/conf目录下的Nacos-mysql.sql创建数据表。(需要提前手动创建数据库)图五 创建完成的数据库修改Nacos Server配置文件,主要修改的内容是连接数据库的部分。这里使用的Mysql数据库用户名为root,密码为123456。图六 修改Nacos Server配置文件使用<安装目录>/Nacos/bin目录下的startup.sh来启动Nacos Server。启动后根据提示查看错误日志,发现报错为找不到JDK。图七 启动Nacos Server这里安装JDK,使用的是存放在FTP服务器上的安装包,版本为jdk1.8。图八 下载jdk安装包根据之前启动Nacos Server的报错配置JDK环境变量JAVA_HOME。图九 配置JDK环境变量并source生效继续启动Nacos Server,发现报错为Nacos无法连接数据库。图十 报错为Nacos无法连接数据库查看数据库用户登录设置后发现,配置的root用户默认只能从localhost登录,因此使用如下语句来修改用户登陆设置为可以从任何IP登录。use mysql;
update user set host = % where user =root;
flush privileges;
quit
图十一 修改数据库登录用户设置图十二 启动Nacos Server成功为了能够使用Nacos的图形化Web管理界面,这里需要在Leader节点上配置Nginx。如果使用的是CentOS操作系统,可以参考[2]中的Nginx部署配置过程。图十三 配置Nginx步骤截图之前创建的数据库里,默认创建了一个名为nacos的用户,密码为加密的nacos。使用该用户名和密码,可以登录Nacos的Web图形管理界面。IP为/Nacos。图十四 登录图形化Nacos的Web管理界面可以从图形界面的「集群管理」->「节点列表」里发现,当前只启动了一个节点的Nacos Server。我们模仿之前的步骤,依次启动其他节点的Nacos Server。图十五 启动其他节点的Nacos Server之后,在Web界面中可以看到节点从「Down」状态转为「Up」状态如果需要关闭Nacos Server,只需要运行<安装目录>/Nacos/bin下面的shutdown.sh即可。图十六 运行shutdown脚本之后,在Web界面中可以看到节点从「Up」状态转为「Down」状态
短短的十几步,就已经完成了JDK、Nginx、Mysql主从、Nacos这一大堆环境的搭建,搞出了一个最基础的生产可用Nacos集群。首先,先看看加入了Skywalking之后,架构图发生什么样的变化。图十七 基于Nacos的Skywalking集群部署架构图可以看到,对比之前的Nacos集群搭建,这里相当于在Leader节点上额外配置一个ES,并且在集群的每个节点上配置一份Skywalking。因此,很显然可以得出这一部分的部署思路:在之前Nacos集群部署的基础上,额外配置ES7和Skywalking即可参考[4]。1. 从官网下载ES7和Skywalking安装包在本实验案例中,安装包下载后,上传至ftp后,在对应主机通过ftp下载。图十八 在对应主机通过ftp下载安装包解压安装包之后,进入到ES安装目录,修改ES的配置文件(配置文件目录为/config/elasticsearch.yml)。在本实验案例中,将ES集群的名称命名为test(该命名需要与后续的Skywalking配置中的配置项内容相同)。同时,该配置文件中的data和logs目录如果不存在,需要手动创建。图十九 修改ES配置文件由于ES限制使用root用户启动,因此需要多带带创建es用户,并修改ES目录属组。图二十 修改ES安装目录属组为es:es启动ES在/bin下运行sh startup.sh -d即可。启动成功后,ES默认使用9200端口,在浏览器打开对应ip:port,可以看到安装情况。如果看到下图的内容,则表示安装成功。图二十一 ES安装成功浏览器显示结果解压安装包之后,进入到Skywalking安装目录,修改ES的配置文件(配置文件目录为/config/application.yml)。在本实验案例中,将nacos集群的使用的命名空间为默认的public,nacos用户名和密码使用默认的nacos/nacos,服务名为SkyWalking_OAP_Cluster。图二十二 配置集群在本实验案例中,根据上面步骤的记录,将ES的集群名设置为test。图二十三 配置数据库在本实验案例中,将nacos集群的使用的命名空间为默认的public,nacos用户名和密码使用默认的nacos/nacos。图二十四 集群配置启动Skywalking在/bin下运行sh startup.sh即可。启动成功后,Skywalking默认使用8080端口,在浏览器打开对应ip:port,可以看到图形化界面。(因为目前还没有任何数据,因此图形化界面里是空的)图二十五 Skywalking启动成功反馈以及web图形化界面完成Skywalking启动后,可以在Nacos图形界面查看服务。图二十六 在Nacos图形界面查看服务在其他节点上进行同样的操作,只修改服务名为SkyWalking_OAP_Cluster_2和服务名为SkyWalking_OAP_Cluster_3。在Nacos图形界面可以看到三个节点的服务[5]。图二十七 在Nacos图形界面可以看到三个节点的服务那么,让我们顺便来看一眼Skywalking的工作原理吧。了解它能帮助你更好的理解它的功能和效果。
Skywalking的源码量并不小,但理解它的核心在于明白它对应用监控的逻辑。在Skywalking中,这个功能通过探针实现。该功能是 Java 虚拟机提供的一整套后门。通过这套后门可以对虚拟机方方面面进行监控与分析。我们可以从此切入,通过这样的思路[6]来了解Skywalking的工作原理。1)静态启动:使用 -javaagent 参数,在类加载时对目标类的字节码可以进行任意修改,只要最后的结果符合字节码规范,SkyWalking 只支持这种方式启动 Agent。2)动态附加:使用 Attach API,类已经加载完成并被使用,这时候只能对目标类的字节码进行有限的修改,典型的应用:系统诊断(阿里 Arthas、笨马 XPocket)。在源码的agents部分中,可以看到它的启动流程如下:1)初始化配置。(加载配置信息、将配置信息映射到 Config 类、根据配置信息重新指定日志解析器、检查 Agent 名称和后端地址是否配置、标记配置加载完成)3)定制化Agent。(创建 ByteBuddy 实例、指定 ByteBuddy 要忽略的类、将必要的类注入到 BootstrapClassLoader 中、解决 JDK 模块系统的跨模块类访问、根据配置决定是否将修改后的字节码保存到磁盘/内存上)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(用来判断哪些异常不算异常)。链路追踪是Skywalking实现的最基本功能,理解它需要首先知道这几个概念。1)Trace:表示一整条链路(跨线程、跨进程的所有 Segment 的集合)2)Segment:表示一个 JVM 进程内的一个线程中的所有操作的集合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源码思维导图)
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/129479.html