Kubernetes 微服务全链路监控Pinpoint(APM)

  • A+
所属分类:Kubernetes

什么是APM

APM (Application Performance Management) 即应用性能管理,属于IT运维管理(ITOM)范畴。主要是针对企业关键业务的IT应用性能和用户体验的监测、优化,提高企业IT应用的可靠性和质量,保证用户得到良好的服务,降低IT总拥有成本(TCO)。

什么是微服务

微服务架构其实就是将单一的应用程序划分成为一组小的服务,其中每个服务都是独立的业务单元,同时又能够被独立开发、运行、测试以及部署。简单来说,它的本质其实就是拆分和独立,这也决定了微服务的部署应该是分布式的。微服务架构虽然解决了目前诸多的架构层面的问题,但在分布式部署的环境中,如何才能够有效监控每一个服务,并及时发现系统中的问题又成为了新的挑战。

业务痛点

互联网业务的高速发展带来了日益增长的流量压力,业务逻辑也日趋复杂,传统的单机应用已经无法满足需求。越来越多的网站逐渐采用了分布式部署架构。同时,随着 Spring Cloud/Dubbo 等基础开发框架的不断成熟,越来越多的企业开始对网站架构按照业务模块进行垂直拆分,形成了更适合团队协同开发、快速迭代的微服务架构(Microservice Architechture)。

分布式的微服务架构在开发效率上具备先进性,但给传统的监控、运维、诊断技术带来了巨大挑战。以淘宝网(www.taobao.com)践行分布式架构与微服务实践的过程为例,遇到的主要挑战有:

  • 定位问题难

客服人员接到用户反馈商品购买出现问题后,会交由技术人员排查解决。而微服务分布式架构中的一个网站请求通常要经过多个服务/节点后返回结果。一旦请求出现错误,往往要在多台机器上反复翻看日志才能初步定位问题,对简单问题的排查也常常涉及多个团队。

  • 发现瓶颈难

当用户反馈网站出现卡顿现象,很难快速发现瓶颈在哪里:是用户终端到服务端的网络问题,是服务端负载过高导致响应变慢,还是数据库压力过大?即使定位到了导致卡顿的环节,也很难快速定位到代码层面的根本原因。

  • 架构梳理难

在业务逻辑变得逐渐复杂以后,很难从代码层面去梳理某个应用依赖了哪些下游服务(数据库、HTTP API、缓存),以及被哪些外部调用所依赖。业务逻辑的梳理、架构的治理和容量的规划(例如“双十一”促销活动的准备过程中,需要为每个应用准备多少台机器)也变得更加困难。

APM监控组件

Google 公司早已就在其生产系统中实践了分布式理念,为了解决监控问题,他们研发了 Dapper 分布式跟踪系统,2010 年对外公开了相关论文。市面上的APM监控理论模型,大多借鉴了Google Dapper论文。列举下常见的APM监控组建:

  • Zipkin

由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。

  • Pinpoint

Pinpoint是一款对Java编写的大规模分布式系统的APM工具,由韩国人开源的分布式跟踪组件。

  • Skywalking

国产的优秀APM组件,华为吴晟开发,后捐献给Apache基金会,是一个对JAVA分布式应用程序集群的业务运行情况进行追踪、告警和分析的系统。https://github.com/wu-sheng/sky-walking

  • EagleEye

阿里巴巴内部的分布式跟踪与监控系统EagleEye(内部称为“鹰眼系统”)

  • CAT

大众点评布式跟踪与监控系统CAT

APM监控选择

Skywalking和Pinpoint对比

https://www.jianshu.com/p/0fbbf99a236e

https://blog.csdn.net/zollty/article/details/86528973

  • 探针的性能消耗

APM组件服务的影响应该做到足够小。在一些高度优化过的服务,即使一点点损耗也会很容易察觉到,而且有可能迫使在线服务的部署团队不得不将跟踪系统关停。

  • 代码的侵入性

对于应用的程序员来说,是不需要知道有跟踪系统这回事的。如果一个跟踪系统想生效,就必须需要依赖应用的开发者主动配合,那么这个跟踪系统也太脆弱了,往往由于跟踪系统在应用中植入代码的bug或疏忽导致应用出问题,这样才是无法满足对跟踪系统“无所不在的部署”这个需求。

  • 可扩展性

能够支持的组件越多当然越好。或者提供便捷的插件开发API,对于一些没有监控到的组件,应用开发者也可以自行扩展。

  • 数据的分析

数据的分析要快 ,分析的维度尽可能多。跟踪系统能提供足够快的信息反馈,就可以对生产环境下的异常状况做出快速反应。分析的全面,能够避免二次开发。

Pinpoint Git项目地址

https://github.com/naver/pinpoint

https://github.com/naver/pinpoint-docker

Pinpoint架构组成

  • Pinpoint 主要由 3 个组件外加 Hbase 数据库组成,三个组件分别为:Agent、Collector 和 Web UI

  • Agent组件:用于收集应用端监控数据,无侵入式,只需要在启动命令中加入部分参数即可

  • Collector组件:数据收集模块,接收Agent发送过来的监控数据,并存储到HBase

  • WebUI:监控展示模块,展示系统调用关系、调用详情、应用状态等,并支持报警等功能

  • Quickstart:官方提供了一个测试用的应用

  • Pinpoint-Mysql是使用“报警”功能所必需的。它的服务器在端口13306上运行,并包含用于注册要发送的用户,组和警报的数据结构。如果不需要可以不安装

Docker for Pinpoint 安装部署

不建议直接使用Docker官方的docker yum源进行安装,因为会依据系统版本去选择Docker版本,不能指定相应的版本进行选择安装。

github上获取Docker ce版本包:

卸载老版本docker

sudo yum remove docker docker-common container-selinux docker-selinux docker-engine

RPM安装Docker

https://github.com/docker/docker/releases

mkdir /root/tools/docker -p
cd /root/tools/docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.3.ce-1.el7.x86_64.rpm
wget https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.3.ce-1.el7.noarch.rpm
yum localinstall docker-ce-* -y
docker version
systemctl start docker

配置Docker 镜像加速

cat << EOF > /etc/docker/daemon.json
{
 "registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
systemctl restart docker

安装Docker-compose

github获取Docker-compost版本包:

https://github.com/docker/compose/releases/

curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose -v

安装Pinpoint

yum install git
git clone https://github.com/naver/pinpoint-docker.git
cd pinpoint-docker
docker-compose pull && docker-compose up -d

如果需要修改默认端口和配置,更改此文件

cat /root/tools/docker/pinpoint-docker/.env

由于虚拟机访问github慢,没找到国内镜像加速站,其他机器下载镜像,重新导入(版本号在.env查看)

下载镜像

docker pull pinpointdocker/pinpoint-mysql:1.8.2
docker pull pinpointdocker/pinpoint-hbase:1.8.2
docker pull pinpointdocker/pinpoint-agent:1.8.2
docker pull pinpointdocker/pinpoint-web:1.8.2
docker pull pinpointdocker/pinpoint-collector:1.8.2
docker pull pinpointdocker/pinpoint-quickstart
docker pull flink:1.3.1
docker pull zookeeper:3.4

docker镜像存出

docker save pinpointdocker/pinpoint-mysql:1.8.2 pinpointdocker/pinpoint-hbase:1.8.2 pinpointdocker/pinpoint-agent:1.8.2 pinpointdocker/pinpoint-web:1.8.2 pinpointdocker/pinpoint-collector:1.8.2 pinpointdocker/pinpoint-quickstart flink:1.3.1 zookeeper:3.4 -o /root/tools/pinpoint.tar

docker镜像载入

docker load -i /root/tools/pinpoint.tar
docker images

重新执行docker-compost

cd /root/tools/docker/pinpoint-docker
docker-compose pull && docker-compose up -d

检查启动状态(如果报错,可以docker logs -f 9c3ad9d3e8f6检查日志)

[root@localhost pinpoint-docker]# docker ps|awk '{print $2}' 
ID
pinpointdocker/pinpoint-quickstart
pinpointdocker/pinpoint-agent:1.8.2
pinpointdocker/pinpoint-web:1.8.2
pinpointdocker/pinpoint-collector:1.8.2
flink:1.3.1
pinpointdocker/pinpoint-mysql:1.8.2
pinpointdocker/pinpoint-hbase:1.8.2
zookeeper:3.4
flink:1.3.1
zookeeper:3.4
zookeeper:3.4

浏览器访问Hbase

http://192.168.20.12:16010/master-status

Kubernetes 微服务全链路监控Pinpoint(APM)

浏览器访问PinPoint WEB

http://192.168.20.12:8079/

我们启动pinpoint-quickstart演示实例,过一会数据采集完成,可以在浏览器看到数据。

Kubernetes 微服务全链路监控Pinpoint(APM)

部署监控客户端

访问 https://github.com/naver/pinpoint/releases下载和 Collector组件 相同版本的pinpoint-agent压缩包。

找到 pinpoint.config 文件,修改为你对应环境的配置。一般情况只需要修改配置项 profiler.collector.ip=172.16.1.1为你自己的Collector组件的IP。

[root@fcontest-56d9659c55-d2fmj jdk1.8.0_91]# ls /pinpoint/
boot  lib  pinpoint-bootstrap-1.8.0.jar  pinpoint-real-env-lowoverhead-sample.config  pinpoint.config  plugin  script  tools
[root@fcontest-56d9659c55-d2fmj jdk1.8.0_91]# more /pinpoint/pinpoint.config 
#
# Pinpoint agent configuration
#

###########################################################
# Collector server                                        # 
###########################################################
profiler.collector.ip=172.16.1.1

# placeHolder support "${key}"
profiler.collector.span.ip=${profiler.collector.ip}
profiler.collector.span.port=9996

# placeHolder support "${key}"
profiler.collector.stat.ip=${profiler.collector.ip}
profiler.collector.stat.port=9995

# placeHolder support "${key}"
profiler.collector.tcp.ip=${profiler.collector.ip}
profiler.collector.tcp.port=9994

进入容器修改配置,查看增加探针

[root@jenkins build]# docker exec -it test bash
[root@670845c2554a jdk1.8.0_91]# cat /run.sh 
#!/bin/sh
if [ "$JAVA_ENV" == "test" ]
   then
   exec java  -Duser.timezone=Aisa/Shanghai -Xms1024m -Xmx1024m -Xmn350m -XX:+PrintGCDetails -jar /app.jar --spring.profiles.active=${JAVA_ENV}
else
  exec java  -Duser.timezone=Aisa/Shanghai -Xms2048m -Xmx2048m  -javaagent:/pinpoint/pinpoint-bootstrap-1.8.0.jar -Dpinpoint.agentId=${JAVA_APP} -Dpinpoint.applicationName=${JAVA_APP} -jar /app.jar --spring.profiles.active=${JAVA_ENV}
fi

PinPoint使用教程

  • 查看应用,前端调用4层追溯,后端调用4层追溯(4层为最深层级),选择时间段

Kubernetes 微服务全链路监控Pinpoint(APM)

  • 线性显示的数字,是调用次数,可以通过鼠标滚轮放大缩小,鼠标左键拖动应用

  • 筛选失败调用链,鼠标左键拖动,会根据时间段打开新视图

Kubernetes 微服务全链路监控Pinpoint(APM)

Kubernetes 微服务全链路监控Pinpoint(APM)

  • 红色条目代表该次请求失败,否则代表成功。选中任意条目,下方出现对应请求的详细信息 

  • Timeline 可以看到某一个调用耗时时间

  • Mixed View 可以看到详细信息

  • Self 可以进行筛选

Kubernetes 微服务全链路监控Pinpoint(APM)

  • 点击Inspector 可以查看应用信息(数据采集起始时间、应用简介、选择某一时间段内CPU、Memory、TPS使用情况)

Kubernetes 微服务全链路监控Pinpoint(APM)

Kubernetes 微服务全链路监控Pinpoint(APM)

  • Filter Transaction(全部事务筛选) 

  • Filter Transaction Wizard (按条件进行事务筛选:筛选错误信息) 

Kubernetes 微服务全链路监控Pinpoint(APM)

Kubernetes 微服务全链路监控Pinpoint(APM)

参考文档:

APM

https://en.wikipedia.org/wiki/Application_performance_management

 Google 论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》

https://research.google.com/pubs/pub36356.html

阿里云鹰眼(EagleEye)

https://www.aliyun.com/aliware/news/monitoringsolution?spm=5176.10695662.1996646101.searchclickresult.25ce3e76ZjOU0c

阿里云ARM

https://help.aliyun.com/document_detail/64886.html?spm=a2c4g.11186623.6.545.13bb79e9640qJY

Pinpoint使用教程

https://blog.csdn.net/kangguang/article/details/77290209

其他参考

https://www.jianshu.com/p/7f6654657417

https://www.jianshu.com/p/21a70bdb0c39

https://infoq.cn/article/2017/08/distributed-tracing-system

YaLei

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: