搭建基于 ZIPKIN 的数据追踪系统-云服务器玩法在线实验

[复制链接]
查看: 360|回复: 0
发表于 2020-4-10 23:00:26 | 显示全部楼层 |阅读模式
实验内容
Zipkin 是一个分布式数据追踪系统,适用于微服务架构下的调用链路数据采集及分析工作。本实验带您在单机模式搭建基于 Zipkin 的数据追踪系统。

免费在线实验地址:点击进入
实验资源:云服务器,没有云服务器的朋友推荐1折抢购:69元/年的阿里云服务器、或者99元/年的腾讯云服务器

软件环境:CentOS 7.2 64 位



一、配置 Java 环境
安装 JDK
Zipkin 使用 Java8
  1. yum install java-1.8.0-openjdk* -y
复制代码
安装完成后,查看是否安装成功:
  1. java -version
复制代码

二、安装 Zipkin

新建目录
  1. mkdir -p /data/release/zipkin && cd "$_"
复制代码
下载 Zipkin
  1. wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec'
复制代码
启动 Zipkin
  1. java -jar zipkin.jar
复制代码
Zipkin 默认监听 9411 端口, 使用浏览器访问 http://<您的 CVM IP 地址>:9411 即可看到 Zipkin 自带的图形化界面。请确认此云服务器有外网IP且安全组已开通9411端口
三、配置 MySQL 数据持久化方案
Zipkin 支持的持久化方案很多,如: Cassandra, MySQL, Elasticsearch。本实验使用 MySQL 5.7 作为数据持久化方案。

安装 MySQL 5.7
使用 Ctrl + C 退出上个步骤的 Java 进程并下载 rmp 包
  1. wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
复制代码
安装 rpm 包
  1. rpm -Uvh mysql57-community-release-el7-9.noarch.rpm
复制代码
安装 MySQL
  1. yum install mysql-community-server -y
复制代码
启动 MySQL 服务
  1. systemctl start mysqld.service
复制代码

设置 MySQL 密码
获取 root 临时密码
  1. grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}'
复制代码
使用上一步的获得的临时密码登入 MySQL
  1. mysql -uroot -p
复制代码
设置 MySQL 账户 root 密码
  1. ALTER USER 'root'@'localhost' IDENTIFIED BY 'Xx$Zipkin2017';
复制代码
退出 MySQL, 回到 Bash shell
  1. exit;
复制代码
命令中的密码是教程为您自动生成的,为了方便实验的进行,不建议使用其它密码。如果设置其它密码,请把密码记住,在后续的步骤会使用到。
初始化 Zipkin 数据库
编写初始化脚本

请在 /data/release/zipkin 目录下创建 zipkin_init.sql,参考下面的内容。

示例代码:/data/release/zipkin/zipkin_init.sql
  1. CREATE TABLE IF NOT EXISTS zipkin_spans (
  2.   `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  3.   `trace_id` BIGINT NOT NULL,
  4.   `id` BIGINT NOT NULL,
  5.   `name` VARCHAR(255) NOT NULL,
  6.   `parent_id` BIGINT,
  7.   `debug` BIT(1),
  8.   `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
  9.   `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query'
  10. ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

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

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

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

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

  42. ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);
复制代码
登录 Mysql
  1. mysql -u root --password='Xx$Zipkin2017'
复制代码
创建 Zipkin 数据库
  1. create database zipkin;
复制代码
切换数据库
  1. use zipkin;
复制代码
初始化表及索引
  1. source /data/release/zipkin/zipkin_init.sql
复制代码
执行以下命令会看到zipkin_annotations, zipkin_dependencies, zipkin_spans 三张数据表,说明初始化成功了
  1. show tables;
复制代码
退出 MySQL, 回到 Bash shell
  1. exit
复制代码

启动 Zipkin
注: 此处默认使用实验生成的密码
  1. cd /data/release/zipkin
  2. STORAGE_TYPE=mysql MYSQL_HOST=localhost MYSQL_TCP_PORT=3306 MYSQL_DB=zipkin MYSQL_USER=root MYSQL_PASS='Xx$Zipkin2017' \
  3. nohup java -jar zipkin.jar &
复制代码


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

搭建 NodeJS 环境
  1. curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
  2. yum install nodejs -y
复制代码
创建Demo目录
创建/data/release/service_a目录
  1. mkdir -p /data/release/service_a && cd "$_"
复制代码
使用 NPM 安装相关依赖
请在 /data/release/service_a 目录下创建并编辑 package.json,参考下面的内容。

示例代码:/data/release/service_a/package.json
  1. {
  2.   "name": "service_a",
  3.   "version": "1.0.0",
  4.   "description": "",
  5.   "main": "index.js",
  6.   "scripts": {},
  7.   "author": "",
  8.   "license": "ISC",
  9.   "dependencies": {
  10.     "express": "^4.15.3",
  11.     "zipkin": "^0.7.2",
  12.     "zipkin-instrumentation-express": "^0.7.2",
  13.     "zipkin-transport-http": "^0.7.2"
  14.   }
  15. }
复制代码
安装相关依赖
  1. npm install
复制代码

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

示例代码:/data/release/service_a/app.js
  1. const express = require('express');
  2. const {Tracer, ExplicitContext, BatchRecorder} = require('zipkin');
  3. const {HttpLogger} = require('zipkin-transport-http');
  4. const zipkinMiddleware = require('zipkin-instrumentation-express').expressMiddleware;

  5. const ctxImpl = new ExplicitContext();
  6. const recorder = new BatchRecorder({
  7.     logger: new HttpLogger( {
  8.         endpoint: 'http://127.0.0.1:9411/api/v1/spans'
  9.     })
  10. });

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

  12. const app = express();

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

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

  20. app.listen(3000, () => {
  21.   console.log('service-a listening on port 3000!')
  22. });
复制代码
启动服务
  1. node app.js
复制代码
该服务监听 3000 端口, 使用浏览器访问 http://<您的 CVM IP 地址>:3000 后,看到“hello world” 的文本字样说明服务已经正常工作。请确认此云服务器有外网IP且安全组已开通3000端口
五、部署完成
查看采集到的追踪数据
使用浏览器访问 http://<您的 CVM IP 地址>:9411 即可看到刚才访问产生的追踪数据。

至此,本入门教程已结束,而 Zipkin 的学习只是一个开始,如有兴趣,可尝试搭建一个基于 Kafka + Zookeeper + Elasticsearch 的分布式服务。

大功告成
恭喜您已经完成了搭建基于 ZIPKIN 的数据追踪系统的学习

腾讯云
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩图文



在线客服(工作时间:9:00-22:00)
400-600-6565

内容导航

微信客服

Copyright   ©2015-2019  云服务器社区  Powered by©Discuz!  技术支持:尊托网络     ( 湘ICP备15009499号-1 )