Zipkin是Twitter的一个开源项目,是一个致力于收集Twitter所有服务的监控数据的分布式跟踪系统,它提供了收集数据,和查询数据两大接口服务。

部署Zipkin环境的操作记录:
部署Zipkin,比较麻烦的是前期环境的准备,只有先把前期环境安装好了,后面的部署就顺利多了。(部署机ip为192.168.1.102)

一、环境准备: 
1)java环境安装(Centos中yum方式安装java)

-------------------------------------------------------------------------------------------
特别注意:现在安装zipkin,必须使用java8(即java-1.8.0-openjdk)
[root@wutao2 ~]# java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b15)
OpenJDK 64-Bit Server VM (build 25.111-b15, mixed mode)

最后别忘了添加jdk的环境变量
[root@dev ~]# vim /etc/profile
......
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk.x86_64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

[root@dev ~]# source /etc/profile
--------------------------------------------------------------------------------------------

2)npm环境安装
随同NodeJS一起安装的包管理工具
这个国内目前知道的只有淘宝有。
[root@dev ~]# alias npm="npm --registry=https://registry.npm.taobao.org --disturl=https://npm.taobao.org/mirrors/node"

3)node环境安装(版本:V5.5.0)
[root@dev ~]# yum install npm -y
[root@dev ~]# git clone https://github.com/creationix/nvm.git /usr/local/nvm
[root@dev ~]# source /usr/local/nvm/install.sh
[root@dev ~]# nvm --version
[root@dev ~]# nvm install v5.5.0
-----------------------------------------------------------------
出现如下报错:
[root@dev nvm]# nvm install v5.5.0
-bash: nvm_has: command not found
-bash: nvm_has: command not found
nvm needs curl or wget to proceed.

解决办法:
在当前用户家目录的.bash_profile文件中添加如下内容
[root@dev ~]# cat /root/.bash_profile
.....
export NVM_DIR="/usr/local/nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm

[root@dev ~]# source /root/.bash_profile

然后再次执行下面命令就不会出现上面报错了:
[root@dev ~]# nvm install v5.5.0
-----------------------------------------------------------------

二、Zipkin安装部署:(zipkin项目的git地址:https://github.com/twitter/zipkin)

[root@dev ~]# wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec'

其为一个spring boot 工程,直接运行jar
[root@dev ~]# nohup java -jar zipkin.jar &               //回车,放到后台去执行
[root@dev ~]# lsof -i:9411
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 8440 root 33u IPv6 64454 0t0 TCP *:9411 (LISTEN)

zipkin访问:
由于zipkin部署机192.168.1.102是一台虚拟机,没有外网ip。
所以通过它的宿主机(113.10.77.99/192.168.1.17)的NAT转发进行访问。
即访问宿主机的9411端口转发到192.168.1.102的9411端口

在宿主机192.168.1.17上的操作:(由于是单机,所以是192.168.1.102/32)
[root@linux-node2 ~]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 9411 -j DNAT --to-destination 192.168.1.102:9411
[root@linux-node2 ~]# iptables -t nat -A POSTROUTING -d 192.168.1.102/32 -p tcp -m tcp --sport 9411 -j SNAT --to-source 192.168.1.17
[root@linux-node2 ~]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 9411 -j ACCEPT
[root@linux-node2 ~]# service iptables save
[root@linux-node2 ~]# service iptables restart

可以查看iptables防火墙配置文件:
[root@linux-node2 ~]# cat /etc/sysconfig/iptables

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# Generated by iptables-save v1.4.21 on Wed Dec 7 20:10:51 2016
*raw
:PREROUTING ACCEPT [5603:1412953]
:OUTPUT ACCEPT [5269:1369985]
COMMIT
# Completed on Wed Dec 7 20:10:51 2016
# Generated by iptables-save v1.4.21 on Wed Dec 7 20:10:51 2016
*mangle
:PREROUTING ACCEPT [5603:1412953]
:INPUT ACCEPT [5379:1395017]
:FORWARD ACCEPT [144:21528]
:OUTPUT ACCEPT [5269:1369985]
:POSTROUTING ACCEPT [5413:1391513]
COMMIT
# Completed on Wed Dec 7 20:10:51 2016
# Generated by iptables-save v1.4.21 on Wed Dec 7 20:10:51 2016
*nat
:PREROUTING ACCEPT [62:4444]
:INPUT ACCEPT [14:760]
:OUTPUT ACCEPT [1:60]
:POSTROUTING ACCEPT [1:60]
-A PREROUTING -p tcp -m tcp --dport 9411 -j DNAT --to-destination 192.168.1.102:9411
-A POSTROUTING -d 192.168.1.102/32 -p tcp -m tcp --sport 9411 -j SNAT --to-source 192.168.1.17
COMMIT
# Completed on Wed Dec 7 20:10:51 2016
# Generated by iptables-save v1.4.21 on Wed Dec 7 20:10:51 2016
*filter
:INPUT ACCEPT [7:3550]
:FORWARD ACCEPT [17:3786]
:OUTPUT ACCEPT [45:5785]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9411 -j ACCEPT
COMMIT
# Completed on Wed Dec 7 20:10:51 2016

然后在谷歌浏览器里访问http://113.10.77.99:9411/,即可看到zipkin的web页面了

三、Zipkin功能解说

zipkin作用
全链路追踪工具(根据依赖关系)
查看每个接口、每个service的执行速度(定位问题发生点或者寻找性能瓶颈)

zipkin工作原理
创造一些追踪标识符(tracingId,spanId,parentId),最终将一个request的流程树构建出来

zipkin架构

其中:
Collector接收各service传输的数据;
Cassandra作为Storage的一种,也可以是mysql等,默认存储在内存中,配置cassandra可以参考这里;
Query负责查询Storage中存储的数据,提供简单的JSON API获取数据,主要提供给web UI使用;
Web 提供简单的web界面;

zipkin分布式跟踪系统的目的:
zipkin为分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控跟踪;
zipkin通过采集跟踪数据可以帮助开发者深入了解在分布式系统中某一个特定的请求时如何执行的;
假如我们现在有一个用户请求超时,我们就可以将这个超时的请求调用链展示在UI当中;我们可以很快度的定位到导致响应很慢的服务究竟是什么。如果对这个服务细节也很很清晰,那么我们还可以定位是服务中的哪个问题导致超时;
zipkin系统让开发者可通过一个Web前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可方便的监测系统中存在的瓶颈。

例如下图:
在复杂的调用链路中假设存在一条调用链路响应缓慢,如何定位其中延迟高的服务呢?
1)日志:通过分析调用链路上的每个服务日志得到结果
2)zipkin:使用zipkin的web UI可以一眼看出延迟高的服务

各业务系统在彼此调用时,将特定的跟踪消息传递至zipkin,zipkin在收集到跟踪信息后将其聚合处理、存储、展示等,用户可通过web UI方便 
获得网络延迟、调用链路、系统依赖等等。

transport作用:收集被trace的services的spans,并将它们转化为zipkin common Span,之后把这些Spans传递的存储层。
有三种主要的transport:
      HTTP(默认)
           通过http headers来传递追踪信息
           header中的key
                X-B3-TraceId: 64 encoded bits(id被encode为hex Strings)
                X-B3-SpanId: 64 encoded bits
                X-B3-ParentSpanId: 64 encoded bits
                X-B3-Sampled: Boolean (either “1” or “0”)(下面的调用是否进行采样)
                X-B3-Flags: a Long
               Scribe
               Kafka

zipkin基础架构(4个组件:collector、storage、search、webUI)
collector
        作用:zipkin collector会对一个到来的被trace的数据(span)进行验证、存储并设置索引。
storage
        in-memory(默认)
              仅用于测试,因为采集数据不会持久化
              默认使用这个存储,若要使用其他存储,查看:
              https://github.com/openzipkin/zipkin/tree/master/zipkin-server
              https://github.com/openzipkin/zipkin-dependencies
       JDBC (mysql)
             如果采集数据量很大的话,查询速度会比较慢
       Cassandra
             zipkin最初始内建的存储(扩展性好、schema灵活)
             This store requires a spark job to aggregate dependency links
       Elasticsearch
             This store requires a spark job to aggregate dependency links
             被设计用于大规模
             存储形式为json
search
webUI

zipkin核心数据结构
            Annotation(用途:用于定位一个request的开始和结束,cs/sr/ss/cr含有额外的信息,比如说时间点)
                   cs:Client Start,表示客户端发起请求
                          一个span的开始
                   sr:Server Receive,表示服务端收到请求
                   ss:Server Send,表示服务端完成处理,并将结果发送给客户端
                   cr:Client Received,表示客户端获取到服务端返回信息
                         一个span的结束
                         当这个annotation被记录了,这个RPC也被认为完成了
          BinaryAnnotation(用途:提供一些额外信息,一般已key-value对出现)
          Span:一个请求(包含一组Annotation和BinaryAnnotation);它是基本工作单元,一次链路调用(可以是RPC,DB等没有特定的限制)创建一个span,通过一个64位ID标识它。
                  span通过还有其他的数据,例如描述信息,时间戳,key-value对的(Annotation)tag信息,parent-id等,其中parent-id 
                  可以表示span调用链路来源,通俗的理解span就是一次请求信息
          Trace:类似于树结构的Span集合,表示一条调用链路,存在唯一标识
                  Traces are built by collecting all Spans that share a traceId
                  通过traceId、spanId和parentId,被收集到的span会汇聚成一个tree,从而提供出一个request的整体流程。(这也是zipkin的工作原理)
注意:时间点计算
sr-cs:网络延迟
ss-sr:逻辑处理时间
cr-cs:整个流程时间

Trace identifiers
         含义:通过下边3个Id,对数据进行重组
         三个Id(64位 long型数据)
               TraceId
                     The overall ID of the trace.
                     Every span in a trace will share this ID.
              SpanId
                     The ID for a particular span.
                     This may or may not be the same as the trace id.
              ParentId
                     This is an optional ID that will only be present on child spans.
                     That is the span without a parent id is considered the root of the trace.

zipkin工作流程图(完整的调用链路)

上图说明:X和A可以相等
上图表示一请求链路,一条链路通过Trace Id唯一标识,Span标识发起的请求信息,各span通过parent id关联起来;
父子span关系:

说明:parentId==null,表示该span就是root span。
整个链路的依赖关系如下:

完成链路调用的记录后,如何来计算调用的延迟呢,这就需要利用Annotation信息:

总结两点:
1)使用zipkin,必须使用java8
2)在生产环境,不会对每个请求都进行采样追踪(降低trace对整个服务的性能损耗)

-------------------------------------------------------------------
还可以考虑使用下面的架构:

kafka是使用zookeeper来管理的(kafka在Zookeeper中注册的地址)
在zipkin网页上选择要看的项目后,点击Find Traces查看

部署Zipkin分布式性能追踪日志系统的操作记录相关推荐

  1. 分布式框架-日志系统思路及实现

    转自:https://www.jianshu.com/p/ce30c31111ca 背景 随着互联网时代数据规模的爆发式增长,传统的单机系统在性能和可用性上已经无法胜任,分布式应用和服务化应用开始走进 ...

  2. Centos系统添加系统用户操作记录审计

    有时候我们需要对线上用户操作记录进行历史记录待出现问题追究责任人,,但Linux系统自带的history命令用户有自行删除权限,那怎么设置可以让用户的操作记录实时记录,并保证普通用户无权删除呢? 1. ...

  3. MySQL 之binlog日志说明及利用binlog日志恢复数据操作记录

    众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 一 ...

  4. linux用户操作的日志,linux 用户操作记录并录入日志

    1. 添加bash全局配置文件: cd /etc/profile.d vi log_command.sh 输入如下内容: export PROMPT_COMMAND='RETRN_VAL=$?;log ...

  5. 微服务治理之分布式链路追踪--3.zipkin实战

    微服务治理之分布式链路追踪–3.zipkin实战 本节是基于zipkin分布式追踪系统搭建,因为对 scala 和 play framework 2 框架不熟悉,所以,没有采用opentelemetr ...

  6. 大型互联网应用中的日志系统

    2019独角兽企业重金招聘Python工程师标准>>> 大型互联网应用的突出特点是应用本身规模大,结构复杂,用户访问量大.设计良好的日志系统,有助于分析流量趋势,帮助管理网络应用:有 ...

  7. 6 个 K8s 日志系统建设中的典型问题,你遇到过几个?

    作者 |  元乙  阿里云日志服务数据采集客户端负责人,目前采集客户端 logtail 在集团百万规模部署,每天采集上万应用数 PB 数据,经历多次双 11.双 12 考验. 导读:随着 K8s 不断 ...

  8. C语言编写自己的日志系统

    文章目录 一.功能实现 二.日志源码 三.结果展示 在我们自己做项目过程中会用到日志系统来记录程序的信息,这就需要我们自己来完成日志系统. 一.功能实现 完成的主要功能: 日志文件位置可通过参数解析改 ...

  9. ZipKin原理学习(分布式实时数据追踪系统)+window部署zipkin+k8s部署zipkin

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 ZipKin入门介绍 Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google D ...

最新文章

  1. 【非专业评测】发蜡、发膏、发泥、发油、啫喱、发膜、发胶、干胶、发棒、摩丝
  2. Windows 2003服务器维护的几个技巧
  3. java webservice接口开发_搭建Soap webservice api接口测试案例系统
  4. Spring MVC中Session的正确用法之我见02
  5. 摩斯密码(加密/解密)脚本
  6. 飞行计算机人机工程,人机工程学版
  7. nginx server location
  8. Compound社区发起一项讨论 向5000名早期活跃用户发放总供应量5%的COMP代币
  9. [转]SSAS没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG)) (Microsoft Visual Studio)的解决办法...
  10. 高性能数据库集群:分库分表
  11. SQL 2008 群集配置详尽攻略[3]—主节点备节点数据库安装
  12. 交叉熵损失函数(Cross Entropy Error Function)与均方差损失函数(Mean Squared Error)
  13. 配送中心数据迁移项目(SDC to PDC Data Migartion)
  14. 交换机VLAN工作模式介绍
  15. 知识图谱-构建:知识图谱构建流程【本体构建、知识抽取(实体抽取、 关系抽取、属性抽取)、知识表示、知识融合、知识存储】
  16. Word中参考文献导入Endnote
  17. windows下jenkins批处理执行git pull失败的原因
  18. Easyui 官网网址
  19. Swift 网络请求——Moya的使用
  20. 我的世界java村民繁殖_教程/村民养殖 - Minecraft Wiki,最详细的官方我的世界百科...

热门文章

  1. window环境下创建Flask项目需要安装常见模块命令
  2. Linux入门之Linux与Windows常见对比
  3. LNMP+FARM+DNS
  4. ASA防火墙 NAT新版老版的配置方法对比
  5. 细说JavaScript对象(2):原型对象
  6. Android网络类型判断(2g、3g、wifi)
  7. (转)AssetBundle系列——共享资源打包/依赖资源打包
  8. Alter index coalesce VS shrink space
  9. 话里话外:参展管理信息化年会 聚会谈咨询需求有市场
  10. OpenSSL 修复高危的无限循环漏洞