搭建数据追踪系统

环境说明 操作系统:CentOS 7.2 64位

1Zipkin简介

zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来。其主要功能是聚集来自各个异构系统的实时监控数据。

2

应用场景

  1. 故障快速定位 通过分析调用链,可以将一次请求的逻辑轨迹完整清晰的展示出来,通过在开发中在业务日志中添加调用链ID,可以通过调用链结合业务日志快速定位错误信息。
  2. 服务可用性 通过分析各个环节的平均时延,QPS等信息,可以找到系统的薄弱环节,对一些模块做调整,例如数据冗余、链路可用等。
  3. 性能分析 在调用链的各个环节分别添加调用时延,可以分析系统的性能瓶颈,进行有针对性的优化。

3安装JDK

安装数据追踪软件Zipkin所需要的JDK环境

执行以下命令安装JDK

yum install java-1.8.0-openjdk* -y

安装完成之后,检查是否安装成功

java -version

4安装Zipkin

新建存放ZIPkin的目录并进入此目录

mkdir -p /data/release/zipkin && cd "$_"

下载Zipkin

wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec'

启动Zipkin

java -jar zipkin.jar

Zipkin 默认监听 9411 端口, 使用浏览器访问 http://IP:9411,即可看到 Zipkin 自带的图形化界面。如果没有看到Zipkin的图形化界面,请确保外网的9411端口是否已开。

5安装MySQL

Zipkin支持的持久化方案比较多,如: MySQL、 Elasticsearch。我们使用MySQL 5.7来作为持久化方案。

一. 下载MySQL 5.7

在执行以下操作之前,可以使用 Ctrl + C 退出上个步骤的 Java 进程并下载rmp包。

wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

安装rpm包

rpm -Uvh mysql57-community-release-el7-9.noarch.rpm

安装MySQL

yum install mysql-community-server -y

启动MySQL

systemctl start mysqld.service
二. 设置MySQL密码

获取 root 临时密码

grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}'

使用上一步的获得的临时密码登入 MySQL

mysql -uroot -p

更改MySQL的root密码为dettRoot$123

ALTER USER 'root'@'localhost' IDENTIFIED BY 'dettRoot$123';

退出MySQL,回到Bash shell

exit;
三. 初始化Zipkin数据库脚本

编写初始化脚本

在目录/data/release/zipkin下创建脚本文件zipkin_init.sql

touch zipkin_init.sql

然后添加如下脚本代码:

CREATE TABLE IF NOT EXISTS zipkin_spans (
  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  `trace_id` BIGINT NOT NULL,
  `id` BIGINT NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `parent_id` BIGINT,
  `debug` BIT(1),
  `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
  `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate';
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations';
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';

CREATE TABLE IF NOT EXISTS zipkin_annotations (
  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
  `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
  `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
  `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
  `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
  `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
  `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
  `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
  `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
  `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';

CREATE TABLE IF NOT EXISTS zipkin_dependencies (
  `day` DATE NOT NULL,
  `parent` VARCHAR(255) NOT NULL,
  `child` VARCHAR(255) NOT NULL,
  `call_count` BIGINT
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);

登录MySQL

mysql -u root --password='dettRoot$123'

创建Zipkin数据库

create database zipkin

切换数据库

use zipkin

初始化表及索引

source /data/release/zipkin/zipkin_init.sql

检查是否有生成zipkin_annotations, zipkin_dependencies, zipkin_spans 三张数据表

show tables;

退出 MySQL, 回到 Bash shell

exit;

6启动Zipkin

cd /data/release/zipkin

STORAGE_TYPE=mysql MYSQL_HOST=localhost MYSQL_TCP_PORT=3306 MYSQL_DB=zipkin MYSQL_USER=root MYSQL_PASS='dettRoot$123' 

nohup java -jar zipkin.jar &

7创建具有数据上报能力的Demo

一. 搭建 NodeJS 环境

curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -

yum install nodejs -y
二. 创建Demo目录

创建/data/release/service_a目录

mkdir -p /data/release/service_a && cd "$_"

使用NPM安装相关依赖,在 /data/release/service_a 目录下创建并编辑 package.json,参考下面的内容。

touch package.json

package.json

{
  "name": "service_a",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {},
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.15.3",
    "zipkin": "^0.7.2",
    "zipkin-instrumentation-express": "^0.7.2",
    "zipkin-transport-http": "^0.7.2"
  }
}

安装相关依赖

npm install

创建并编辑 app.js

在 /data/release/service_a 目录下创建 app.js,参考下面的内容。

touch app.js

APP.js

const express = require('express');
const {Tracer, ExplicitContext, BatchRecorder} = require('zipkin');
const {HttpLogger} = require('zipkin-transport-http');
const zipkinMiddleware = require('zipkin-instrumentation-express').expressMiddleware;

const ctxImpl = new ExplicitContext();
const recorder = new BatchRecorder({
    logger: new HttpLogger( {
        endpoint: 'http://127.0.0.1:9411/api/v1/spans'
    })
});

const tracer = new Tracer({ctxImpl, recorder});

const app = express();

app.use(zipkinMiddleware({
  tracer,
  serviceName: 'service-a'
}));

app.use('/', (req, res, next) => {
    res.send('hello world');
});

app.listen(3000, () => {
  console.log('service-a listening on port 3000!')
});

启动服务

node app.js

8部署完成

查看采集到的追踪数据

使用浏览器访问 http://IP:9411,即可看到刚才访问产生的追踪数据。

原文发布于微信公众号 - 瞎说开发那些事(jsj201501)

原文发表时间:2018-05-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏轮子工厂

数据库性能优化,原来还可以有这种操作

701
来自专栏杨建荣的学习笔记

关于pl/sql中的绑定变量(r3笔记第73天)

在看关于shared pool的文档时,必定会提到绑定变量,也能够通过几个简单的例子对绑定变量带来影响有深刻的认识,但是在工作中,可能有时候我们就忘了绑定变量的...

2844
来自专栏杨建荣的学习笔记

有关Oracle role的总结

oracle的role算是对sys privilege 和object privilege的打包。 今天深入的测试了下,还算有不少的东西。 role不是sche...

4326
来自专栏技术博文

MySQL SHOW PROFILE(剖析报告)的查看

前言:SHOW PROFIL命令是MySQL提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量。 一、参数的开启和关闭设置 1.1 参...

3393
来自专栏java 成神之路

聚簇索引和二级索引

4254
来自专栏杨建荣的学习笔记

巧用shell生成数据库检查脚本 (74天)

在生产环境中需要部署大量的数据变更。对于新增的表,需要注意权限和同义词等。但是手动去检查这些变更是否生效就很麻烦。而且也不易维护,比如写好了一个脚本,可能在过一...

3317
来自专栏数据和云

书接上文:薛定谔的猫是如何诞生的?

编辑手记:注重细节,是DBA必要的基本素质要求。 书接上文(参考:空与非空 - 数据库中也有薛定谔的猫?),其实CBO的判断本身是没有问题的,问题在于,为什...

31110
来自专栏JetpropelledSnake

SQL学习笔记之MySQL索引知识点

之前写过一篇Mysql B+树学习,简单的介绍了B+数以及MySql使用B+树的原因, 有了这些基础知识点,对MySql索引的类型以及索引使用的一些技巧,就...

691
来自专栏Python、Flask、Django

自动创建权限表数据和超级管理员用户(第一次优化)

1232
来自专栏Albert陈凯

hive的partition的作用和使用方法

一、背景 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partiti...

4984

扫码关注云+社区

领取腾讯云代金券