zoukankan      html  css  js  c++  java
  • Zipkin 分布式数据追踪系统

    Zipkin 是一个分布式数据追踪系统,适用于微服务架构下的调用链路数据采集及分析工作。

    可通过一个 Web 前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可方便的监测系统中存在的瓶颈。

    一、配置 Java 环境 安装 JDK

    Zipkin 使用 Java8
    yum install java
    -1.8.0-openjdk* -y java -version

    二、安装 Zipkin 

    1、创建zipkin安装目录
    mkdir -p /opt/server/zipkin && cd "$_"
    
    2、下载 Zipkin wget
    -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec'
    3、启动 Zipkin (nohup & 可以进行后台运行 ) java
    -jar zipkin.jar

       Zipkin 默认监听 9411 端口

    三、配置 MySQL 数据持久化 

      1、Zipkin 支持的持久化方案很多: Cassandra, MySQL, Elasticsearch。

    wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
    rpm -Uvh mysql57-community-release-el7-9.noarch.rpm
    yum install mysql-community-server -y
    systemctl start mysqld.service
    
    设置 mysql 密码 创建一个zipkin 库; mysql
    -uroot -p
    > ALTER USER
    'root'@'localhost' IDENTIFIED BY 'passwd';

    > create database zipkin;

    exit

      2、创建 Zipkin初始化文件  zipkin_init.sql 

         创建了 zipkin_annotations, zipkin_dependencies, zipkin_spans 三张数据表

    # cat /opt/server/zipkin/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`);

      3、初始化导入:

    mysql -u root --password='passwd'

    > use zipkin;
    > source /opt/server/zipkin/zipkin_init.sql
    > show tables;
    > exit

    四、重新启动 zipkin

    cd /opt/server/zipkin
    STORAGE_TYPE=mysql MYSQL_HOST=localhost MYSQL_TCP_PORT=3306 MYSQL_DB=zipkin MYSQL_USER=root MYSQL_PASS='passwd' 
    nohup java -jar zipkin.jar &

    五、创建一个dome 示例

      1、搭建 NodeJS 环境

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

      2、创建 /opt/server/service_testing 工作目录

    mkdir -p /opt/server/service_testing 

      3、在 /opt/server/service_testing 目录下创建并编辑 package.json

    # cat /opt/server/service_testing/package.json
    {
    "name": "service_testing", "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" } }

      4、安装相关依赖

    # npm install

      5、创建并编辑 app.js

    # cat /opt/server/service_testing/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-testing' })); app.use('/', (req, res, next) => { res.send('hello one'); }); app.listen(3000, () => { console.log('service-testing listening on port 3000!') });

      6、启动服务 (监听 3000 端口)http://IP:3000

    # node app.js

    六、zipkin 访问 http://IP:9411 

  • 相关阅读:
    服务器状态码
    QuerySet中添加Extra进行SQL查询
    django配置一个网站建设
    MySQL数据库查询中的特殊命令
    125. Valid Palindrome
    121. Best Time to Buy and Sell Stock
    117. Populating Next Right Pointers in Each Node II
    98. Validate Binary Search Tree
    91. Decode Ways
    90. Subsets II
  • 原文地址:https://www.cnblogs.com/sharesdk/p/9267736.html
Copyright © 2011-2022 走看看