一、为什么需要链路监控系统?
随着互联网的快速发展,许多企业为了快速响应业务的变化,开始采用微服务架构。微服务架构常常以多个独立的系统进行提供服务,虽然微服务架构带来了更大的灵活性、更高的开发效率等一系列的好处,但是也同样面临着更多问题。
为了掌握系统的运行状态,确保系统正常对外提供服务,需要一些手段去监控系统,以了解系统的行为,分析系统的性能或在系统出现故障时,能发现问题、记录问题并发出告警,从而帮助运维人员发现问题、定位问题,也可以根据监控数据发现系统瓶颈,提前感知故障,预判系统负载能力等。
在微服务架构下的系统问题定位更加复杂,步骤更加繁琐;比如定位到问题之后,我们有可能需要给我们的系统进行扩容,计算扩容多少台机器,新增扩容多少个实例,都需要相应的数据支持,而这些并不能通过开发人员或者运维人员的直觉进行处理,所以有了APM系统。
二、常见的APM系统
CAT
由国内美团点评开源、基于JAVA语言开发。目前提供Java、C/C++、Node.js、Python、Go等语言的客户端,监控数据会全量统计。
CAT需要开发人员手动在应用程序中埋点,对代码侵入性比较强。
Zipkin
由Twitter公司开发并开源,Java语言实现。侵入性相对于CAT要低一点,需要对web.xml等相关配置文件进行修改,但依然对系统有一定的侵入性,Zipkin可以轻松与Spring Cloud进行集成。
Pinpoint
韩国团队开源的APM产品,运用了字节码增强技术,只需要在启动时添加启动参数即可实现APM功能,对代码无侵入。目前支持Java和PHP语言,底层采用Hbase来存储数据。
探针收集的数据粒度非常细,但对性能损耗大。
SkyWalking
国人开源的产品,2019年4月17日SkyWalking从Apache基金会的孵化器毕业称为顶级项目。目前支持Java、.NET、NodeJS、Python、Go等探针,数据存储支持MySQL、elasticsearch、H2等。与Pinpoint相同,Java探针采用字节码增强技术实现,对业务代码无侵入。
探针采集的数据粒度相对于Pinpoint来说粗略,性能表现优秀。社区活跃,中文文档齐全,支持对语言探针,支持框架多,如Dubbo、gRPC、SOFARPC等。
三、SkyWalking介绍
1、SkyWalking 是什么?
SkyWalking 是基于OpenTracing规范的、开源的APM系统,专门为微服务架构以及云原生架构设计。
SkyWalking 是观察性分析平台(OAP,在skywalking 6.0之后官方定义为OAP系统)和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案.
分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。
2、整体架构
Agent(探针)
Agent运行在各个服务实例中,负责采集服务实例的Trace、Metrics等数据,将数据格式化为 SkyWalking 适用的格式,然后通过 gRPC 方式上报给SkyWalking后端
OAP(后端)
SkyWalking的后端服务,其主要责任有以下两个:
- 负责接收Agent上报上来的Trace、Metrics等数据,交给Analysis Core进行流式分析,最终将分析的结构写入到持久化存储中
- 负责响应SkyWalking UI界面发送来的查询请求,将前面持久化的数据查询出来,组成正确的响应结果返回给UI界面进行展示
UI界面
SkyWalking前后端进行分离,该UI界面负责将用户的查询操作封装为GraphQL请求提交给OAP后端,触发后续的查询操作,将拿到的查询结构在前端进行展示
3、功能特性
- 多种监控手段,语言探针和service mesh
- 多语言自动探针,Java, .Net Core, PHP, NodeJS, Golang, LUA
- 服务、服务实例、端点指标分析
- 服务拓扑图分析
- 服务、服务实例和端点(Endpoint) SLA分析
- 慢查询检查
- 支持告警
四、SkyWalking部署
- Apache SkyWalking部署支持单机部署和集群部署,而Apache SkyWalking部署单机还是集群取决于ES和注册中心是单机还是集群部署的;单机部署还是建议线下部署做一些功能测试之类的,线上环境一定要采用集群模式部署,这里我也将采用集群的方式进行部署。
- 注意:如果线上实在没有多余机器部署集群,那么也可以采用单机方式部署,如果SkyWalking挂了也不会影响业务的正常运行。
1、部署集群环境准备工作
1.1:环境描述
| 服务名称 | 节点IP | 主机名 | 服务版本号 | 部署方式 |
| Elasticsearch | 192.168.66.211 | es-01 | 7.9.1 | RPM包部署 |
| 192.168.66.212 | es-02 | |||
| 192.168.66.213 | es-03 | |||
| ZooKeeper | 192.168.66.214 | zk-01 | 3.6.2 | 二进制部署 |
| 192.168.66.215 | zk-02 | |||
| 192.168.66.216 | zk-03 | |||
| SkyWalking OAP&UI | 192.168.66.217 | skywalking | 8.2.0 | 二进制部署 |
1.2:下载程序
- Elasticsearch:https://www.elastic.co/cn/downloads/elasticsearch
- ZooKeeper:https://mirror.bit.edu.cn/apache/zookeeper/
- 注意:ZooKeeper一定要下载代bin的源码包,从目前的
文章来源(Source):浅时光博客 最新版本3.5.5开始,带有bin名称的包才是我们想要的下载可以直接使用的里面有编译后的二进制的包,而之前的普通的tar.gz的包里面是只是源码的包无法直接使用 - SkyWalking :http://skywalking.apache.org/downloads/
1.3:安装JDK
- 注意:由于以上的程序都是由JAVA语言开发,所以所有节点在部署程序之前都需要安装JAVA环境,这里我通过RPM包安装JDK1.8版本
- 下载地址:OracleJDK下载
rpm -ivh jdk-8u231-linux-x64.rpm
2、部署Elasticsearch服务集群
2.1:下载安装并放通端口
- 下载地址:elasticsearch
rpm -ivh elasticsearch-7.9.1-x86_64.rpm
#提前放开ES端口
firewall-cmd --permanent --zone=public --add-port=9200/tcp
firewall-cmd --permanent --zone=public --add-port=9300/tcp
#使其规则生效
firewall-cmd --reload
2.2:编辑各ES配置文件
- 注:这里我们修改es-01节点上的es配置,然后将es-01节点上的es配置文件拷贝给其他2台es节点服务器,然后修改对应的node.name和network.host为所在主机的地址即可。
[root@es-01 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml
cluster.name: es.cluster #es集群名称
node.name: es-node1 #es节点名称。集群内节点名称不可重复
path.data: /data/elk/data #数据存储路径
path.logs: /data/elk/logs #日志存储路径
network.host: 192.168.66.211 #监听地址,可设置为本机IP或0.0.0.0
http.port: 9200 #监听端口
discovery.seed_hosts: ["192.168.66.211", "192.168.66.212", "192.168.66.213"]
cluster.initial_master_nodes: ["192.168.66.211", "192.168.66.212", "192.168.66.213"]
- 注意:配置集群的主机地址,配置之后集群的主机之间可以自动发现,必须至少配置
[discovery.seed_hosts,discovery.seed_providers,cluster.initial_master_nodes]中的一个;如果是只跑单机ES则discovery.seed_hosts和cluster.initial_master_nodes参数中,只需要配置本节点ES所在的服务器IP地址即可,例如:discovery.seed_hosts: ["192.168.66.211"]cluster.initial_master_nodes: ["192.168.66.211"]
- 拷贝配置至另外节点服务器
scp /etc/elasticsearch/elasticsearch.yml root@192.168.66.212:/etc/elasticsearch/
scp /etc/elasticsearch/elasticsearch.yml root@192.168.66.213:/etc/elasticsearch/
[root@es-02 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml
cluster.name: es.cluster #es集群名称
node.name: es-node2 #es节点名称。集群内节点名称不可重复
path.data: /data/elk/data #数据存储路径
path.logs: /data/elk/logs #日志存储路径
network.host: 192.168.66.212 #监听地址,可设置为本机IP或0.0.0.0
http.port: 9200 #监听端口
discovery.seed_hosts: ["192.168.66.211", "192.168.66.212", "192.168.66.213"]
cluster.initial_master_nodes: ["192.168.66.211", "192.168.66.212", "192.168.66.213"]
[root@es-03 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml
cluster.name: es.cluster #es集群名称
node.name: es-node3 #es节点名称。集群内节点名称不可重复
path.data: /data/elk/data #数据存储路径
path.logs: /data/elk/logs #日志存储路径
network.host: 192.168.66.213 #监听地址,可设置为本机IP或0.0.0.0
http.port: 9200 #监听端口
discovery.seed_hosts: ["192.168.66.211", "192.168.66.212", "192.168.66.213"]
cluster.initial_master_nodes: ["192.168.66.211", "192.168.66.212", "192.168.66.213"]
2.3:创建数据目录并赋权
- 注意:3个es节点都需要创建,注意elasticsearch用户再通过rpm方式安装时会自动创建
mkdir -p /data/elk/{data,logs}
ls /data/elk/
chown -R elasticsearch. /data/elk/
2.4:启动ES服务验证
systemctl start elasticsearch
systemctl enable elasticsearch
systemctl status elasticsearch
- 注意:elasticsearch启动比较慢,需要等待一会,然后检查端口;如果有问题,查看
/data/logs/es.cluster.log日志
2.5:浏览器访问ES服务
3、部署ZooKeeper服务集群
3.1:解压安装
- 在节点1解压后,然后拷贝到其他节点
[root@zk-01 ~]# tar -zxvf apache-zookeeper-3.6.2-bin.tar.gz -C /usr/local/
[root@zk-01 ~]# cd /usr/local/
[root@zk-01 local]# mv apache-zookeeper-3.6.2-bin zookeeper
3.2:修改配置
- 三个节点的配置都需要进行创建对应的目录,复制一份新的进行修改;这里只需要在zk-01节点创建和配置,然后拷贝至另外的节点
- 配置文件存储路径:zookeeper安装路径
/zookeeper/conf
[root@zk-01 ~]# cd /usr/local/zookeeper/conf/
[root@zk-01 conf]# cp zoo_sample.cfg zoo.cfg
- 先创建数据和日志的存储目录,zk启动之前三节点都需要先创建目录,不然启动失败
[root@zk-01 conf]# mkdir -p /data/{zkdata,zklog}
[root@zk-01 conf]# vim zoo.cfg
- 参数说明:
- tickTime=2000
- initLimit=10
- syncLimit=5
- dataDir=/data/zkdata #数据存储目录
- datalogDir=/data/zklog #日志存储目录,默认配置文件中没有
- clientPort=2181
- server.1=192.168.66.214:3001:3
文章来源(Source):浅时光博客 002 #集群中个节点IP,默认配置文件中没有,需要添加 - server.2=192.168.66.215:3001:3002
- server.3=192.168.66.216:3001:3002
3.3:更改日志配置
- Zookeeper 默认会将控制台信息输出到启动路径下的
zookeeper.out中,通过如下方法,可以让 Zookeeper 输出按尺寸切分的日志文件:
- 将
zookeeper.root.logger=INFO, CONSOLE改为zookeeper.root.logger=INFO, ROLLINGFILE
[root@zk-01 conf]# vim /usr/local/zookeeper/conf/log4j.properties
- 将
ZOO_LOG4J_PROP="INFO,CONSOLE"改为ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
[root@zk-01 conf]# vim /usr/local/zookeeper/bin/zkEnv.sh
3.4:将程序拷贝给另外的节点
- 由于配置文件都一样,所有我们在node1上安装配置程序后,通过scp命令将程序拷贝到其他2个节点下即可
[root@zk-01 ~]# scp -r /usr/local/zookeeper/ root@192.168.66.215:/usr/local/
[root@zk-01 ~]# scp -r /usr/local/zookeeper/ root@192.168.66.216:/usr/local/
3.5:创建myid文件
- 在3台节点服务器的dataDir的路径下分别创建一个文件名为myid的文件,文件内容为该 zk 节点的编号
[root@zk-01 ~]# cd /data/zkdata/
[root@zk-01 zkdata]# vim myid
[root@zk-01 zkdata]# cat myid
1
[root@zk-02 ~]# cd /data/zkdata/
[root@zk-02 zkdata]# vim myid
[root@zk-02 zkdata]# cat myid
2
[root@zk-03 ~]# cd /data/zkdata/
[root@zk-03 zkdata]# vim myid
[root@zk-03 zkdata]# cat myid
3
#启动前把3节点的3001、3002、2181端口放通
firewall-cmd --permanent --zone=public --add-port=3001/tcp
firewall-cmd --permanent --zone=public --add-port=3002/tcp
firewall-cmd --permanent --zone=public --add-port=2181/tcp
firewall-cmd --reload
3.6:启动程序
#依次启动三台主机上的 zookeeper 服务
cd /usr/local/zookeeper/bin/
./zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
#三台节点zk服务加入开机自启
echo "/usr/local/zookeeper/bin/zkServer.sh start" >> /etc/rc.local
chmod +x /etc/rc.local
3.7:查看集群状态
#3个节点全部启动完成后,可依次执行如下命令查看集群状态
cd /usr/local/zookeeper/bin/
./zkServer.sh status
4、部署SkyWalking OAP服务
- 注:提前把下载的包上传至服务器中
4.1:解压部署
[root@skywalking ~]# tar -zxvf apache-skywalking-apm-es7-8.2.0.tar.gz -C /usr/local/
[root@skywalking ~]# cd /usr/local/
[root@skywalking local]# mv apache-skywalking-apm-bin-es7 skywalking
4.2:修改配置
- 默认连接的是H2数据库,修改为es集群地址;将zk注释去除并配置成我们创建的zk集群地址
[root@skywalking local]# cd skywalking/config/
[root@skywalking config]# cp application.yml{,_bak}
[root@skywalking config]# vim application.yml
Apache SkyWalking 8.x集群部署需要修改的配置如下图所示:
Apache SkyWalking 9.x集群部署需要修改的配置如下图所示:
4.3:启动服务
[root@skywalking ~]# cat > /usr/lib/systemd/system/skywalking.service <<EOF
[Unit]
Description=skywalking
Documentation=https://skywalking.apache.org/
Wants=network-online.target
After=network.target network-online.target
[Service]
Type=forking
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin/java"
WorkingDirectory=/usr/local/skywalking
ExecStart=/bin/bash /usr/local/skywalking/bin/startup.sh
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
[root@skywalking ~]# systemctl daemon-reload
[root@skywalking ~]# systemctl start skywalking.service
[root@skywalking ~]# systemctl status skywalking.service
[root@skywalking ~]# systemctl enable skywalking.service
- 等待几分钟程序启动后,检查服务端口
- 检查启动日志,确保没有报错信息
[root@skywalking ~]# tailf /usr/local/skywalking/logs/skywalking-oap-server.log
4.4:放通端口
[root@skywalking ~]# firewall-cmd --permanent --zone=public --add-port=8080/tcp
[root@skywalking ~]# firewall-cmd --permanent --zone=public --add-port=11800/tcp
[root@skywalking ~]# firewall-cmd --permanent --zone=public --add-port=12800/tcp
[root@skywalking ~]# firewall-cmd --reload
5、访问SkyWalking UI
- 注:由于没有跟任何项目集成所以是没有任何信息的
Apache SkyWalking 8.x集群UI访问展示页面如下图所示:
Apache SkyWalking 9.x集群UI访问展示页面如下图所示:
五、SkyWalking与项目集成
- agent存储在下载下来的源码包文件中,里面有个agent目录,将agent目录拷贝至被监控节点服务器上,下面我将agent保存在了/data/app目录下
java -javaagent:/data/app/agent/skywalking-agent.jar
-Dskywalking.agent.service_name=dqz_service
-Dskywalking.collector.backend_service=XXX.XXX.XXX.XXX:11800
-jar myapp.jar
javaagent:指定skywalking-agent包的存储路径skywalking.agent.service_name: 服务名称skywalking.collector.backend_service:采集信息的服务地址 agent.config配置了就可以不用指定

















必须 注册 为本站用户, 登录 后才可以发表评论!