Практика и сравнение нескольких компонентов мониторинга распределенной цепочки вызовов (1) Практика

сервер Spring HBase API

Введение. Недавно я исследовал и выбирал компоненты мониторинга распределенной цепочки вызовов. Для практики и сравнения выбраны три основных компонента АРМ. Изначально я планировал закончить написание одной статьи, но она оказалась слишком длинной, поэтому я планировал разделить ее на две статьи. В этой статье в основном рассказывается об основных концепциях трассировки нисходящего канала и практике работы с несколькими компонентами APM.Практическая часть не дает особенно подробных шагов, потому что эта статья не посвящена конкретным шагам. Во второй части будет рассказано о сравнении и тестировании производительности нескольких вариантов APM.

1. Предыстория проблемы

В микросервисной архитектуре сервисы делятся по разным параметрам, и запрос часто должен включать несколько сервисов. Интернет-приложения строятся на разных наборах программных модулей.Эти программные модули могут разрабатываться разными командами, реализовываться с использованием разных языков программирования и могут быть распределены на тысячах серверов, охватывающих несколько разных наборов данных. Следовательно, необходимы инструменты, которые могут помочь понять поведение системы и проанализировать проблемы с производительностью, чтобы при возникновении сбоев можно было быстро обнаружить и устранить проблемы.

Компонент мониторинга распределенной цепочки вызовов создается в такой среде. Наиболее известно упоминается в публичной газете Google.Dapper. Dapper был разработан для сбора дополнительной информации о поведении сложных распределенных систем и предоставления ее разработчикам Google. Такая распределенная система имеет особое преимущество, поскольку эти крупномасштабные серверы начального уровня, как носитель Интернет-услуг, представляют собой особую экономичную платформу. Понимание поведения распределенных систем в этом контексте требует мониторинга связанных действий в разных приложениях и между разными серверами.

Большинство представленных на рынке теоретических моделей APM (Application Performance Management) заимствованы.Google DapperВ этом документе основное внимание уделяется следующим компонентам APM:

  • Zipkin
    Открытый исходный код Twitter, распределенная система отслеживания с открытым исходным кодом, используемая для сбора данных о времени для сервисов для решения проблем с задержкой в ​​микросервисных архитектурах, включая сбор, хранение, поиск и представление данных.
  • Pinpoint
    Pinpoint — это инструмент APM для крупномасштабных распределенных систем, написанный на Java, компонент распределенного отслеживания с открытым исходным кодом, созданный корейцами.
  • Skywalking
    Отличным отечественным компонентом APM является система отслеживания, оповещения и анализа бизнес-операций распределенного кластера приложений JAVA.

Другие аналогичные компоненты включают CAT от Meituan Dianping и EgleEye от Taobao.

Как упоминалось выше, каковы требования к нашему выбору компонентов мониторинга каналов? Он также упоминается в Dapper, и автор резюмирует его следующим образом:

  • Стоимость работы зонда.
    Влияние сервисов компонентов APM должно быть достаточно небольшим. В некоторых высокооптимизированных сервисах даже малейшая потеря может быть легко замечена и может заставить группу развертывания онлайн-сервиса отключить систему отслеживания.

  • навязчивый код
    Для программиста приложения нет необходимости знать, что есть система слежения. Если система слежения хочет вступить в силу, она должна полагаться на активное сотрудничество разработчиков приложения, тогда система слежения слишком хрупка, а приложение часто вызвано ошибками или небрежностью в коде, внедренном в приложение разработчиком. система слежения Удовлетворяет потребность в «повсеместном развертывании» систем слежения.

  • Масштабируемость
    Чем больше компонентов, которые могут быть поддержаны, конечно, лучше, лучше. Или предоставьте удобную плагирую API разработки, которые также могут расширяться для некоторых компонентов, которые не контролируются.

  • анализ данных
    Анализ данных должен быть быстрым, а размерности анализа должны быть как можно больше. Система слежения может обеспечить достаточно быструю информационную обратную связь, чтобы быстро реагировать на ненормальные условия в производственной среде. Всесторонний анализ позволяет избежать вторичного развития.

2. Основные понятия

Несколько перечисленных выше компонентов, из которых Zipkin строго соответствуетGoogle DapperРеализация документа, следующее вводит основные концепции.

  • Span
    Базовая единица работы, вызов ссылки (которая может быть RPC, DB и т.д. без особых ограничений) создает спэн, идентифицирует его 64-битным ID, uuid удобнее, а в спэне есть другие данные, такие как информация описания, временная метка, информация тега пары ключ-значение (аннотация), родительский идентификатор и т. д., где родительский идентификатор может представлять источник ссылки вызова span.

  • Трассировка: коллекция Span, похожая на древовидную структуру, представляющая ссылку вызова с уникальным идентификатором. Например, трассировка запущенного вами распределенного хранилища больших данных состоит из одного вашего запроса.

  • Аннотация: аннотация, используемая для записи информации, относящейся к конкретному событию (например, времени) запроса, обычно содержит четыре аннотации:
    (1) cs: Client Start, указывающий, что клиент инициирует запрос

    (2) sr: Получение сервером, указывающее, что сервер получил запрос

    (3) ss: отправка сервера, указывающая, что сервер завершает обработку и отправляет результат клиенту.

    (4) cr: Клиент получен, что указывает на то, что клиент получает информацию, возвращенную сервером.

2.1 Trace

Давайте посмотрим, какой след выглядит как в системе.

trace
trace

Каждая цветная заметка помечается диапазоном, ссылка однозначно идентифицируется с помощью TraceId, а диапазон идентифицирует инициированную информацию запроса. Узел дерева является базовой единицей всей архитектуры, и каждый узел является ссылкой на диапазон. Линии между узлами представляют прямую связь между пролетом и его родительским пролетом. Хотя промежутки просто представляют время начала и окончания промежутков в файле журнала, они относительно независимы во всей древовидной структуре.

2.2 Span

sp
sp

На изображении выше показано, как выглядит диапазон во время большой трассировки. Dapper записывает имена отрезков, а также идентификатор и родительский идентификатор каждого отрезка, чтобы реконструировать взаимосвязь между различными отрезками во время трассировки. Если диапазон не имеет родительского идентификатора, он называется корневым диапазоном. Все промежутки привязаны к определенной дорожке, а также имеют общий идентификатор дорожки.

2.3 Annotation

Автоматический зонд не требует изменения исходного кода приложения, отслеживает распределенный путь управления для разработчика приложения практически с нулевой стоимостью погружения и почти полностью полагается на преобразование на основе небольшого количества общих библиотек компонентов. Dapper также позволяет разработчикам приложений добавлять дополнительную информацию к трассировкам Dapper для мониторинга поведения системы более высокого уровня или для устранения проблем.

Следующие главы познакомят вас с использованием и практикой трех вышеупомянутых компонентов APM.

3. zipkin

zipkin в основном включает в себя несколько компонентов:collectorСоберите данные агента,storageместо хранения,web UIграфический интерфейс,searchЗапросите данные, хранящиеся в хранилище, и предоставьте простой JSON API для получения данных.

Наш проект создает микросервисы на основе микросервисного фреймворка Spring Cloud. Spring Cloud также предоставляет spring-cloud-sleuth для облегчения интеграции реализаций zipkin. Поэтому я попробовал spring-cloud-sleuth-zipkin в проекте.

Запущено три сервиса:
zipkin-сервер, zipkin-клиент-бэкэнд, zipkin-клиент.
Служба сервера отвечает за сбор и отображение информации. Серверная часть клиента вызывает клиента для создания информации о ссылке вызова.

3.1 реализация zipkin-сервера

Есть два основных момента, на которые следует обратить внимание при реализации zipkin-сервера: один — это хранение собранных данных, включая память, базу данных, ES и т. д., другой — способ связи, включая HTTP-связь и асинхронную связь mq. Доступ влияет, поэтому рекомендуется общаться на основе асинхронного режима mq.

В этой статье в качестве хранилища используется mysql и используется связь MQ, основанная на Spring-cloud-Stream. В этой статье основное внимание уделяется не конкретным методам реализации zipkin-server, другие методы читатели могут посмотреть на официальном сайте.

(1) Ссылки, которые необходимо добавить в pom, следующие:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <!--zipkin依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
    </dependency>
    <dependency>
        <groupId>io.zipkin.java</groupId>
        <artifactId>zipkin-autoconfigure-ui</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!--保存到数据库需要如下依赖-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>

(2) Начальный класс:

// 使用Stream方式启动ZipkinServer
@EnableZipkinStreamServer
@SpringBootApplication
public class ZipkinStreamServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZipkinStreamServerApplication.class,args);
    }
}

@EnableZipkinStreamServerАннотация представляет@EnableZipkinServerАннотация, а также создает слушатель очередей по очереди кролика-MQ MQUETSINK.

(3) профили

server:
  port: 9411

spring:
  datasource:
    username: root
    password: root123
    schema[0]: classpath:/zipkin.sql

zipkin:
  storage:
    type: mysql

---
spring:
  application:
    name: microservice-zipkin-stream-server
  rabbitmq:
    host: ${RABBIT_ADDR:localhost}
    port: ${RABBIT_PORT:5672}
    username: guest
    password: guest
  sleuth:
    enabled: false
  profiles: default
  datasource:
    url:  jdbc:mysql://localhost:3307/zipkin?autoReconnect=true&useSSL=false

zipkin.sql можно получить с официального сайта, а номер порта zipkin-сервера установлен на 9411.

3.2 zipkin-client

Конфигурации двух zipkin-клиентов одинаковые, поэтому они собраны вместе.

(1) пом-зависимость

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>

(2) Файл конфигурации

spring:
  rabbitmq:
    host: 127.0.0.1
    port : 5672
    username: guest
    password: guest

3.3 Результаты

Вызов между услугами заключается в следующем:

Видно, что запрос клиента проходит через шлюз, вызывая различные услуги в интрасети, и некоторые из них также включают в себя вызов службы уведомления. С фигуры мы можем четко видеть услуги, которые проходят клиентские запросы.
Давайте посмотрим на путь http в экземпляре службы demo2-default:

На приведенном выше рисунке несколько HTTP-путей службы demo2-default отсортированы по длительности, показывая продолжительность вызова трассировки и количество интервалов. Нажмите, чтобы увидеть:

На рисунке показано время, затрачиваемое на каждый пролет, начиная с родительского отрезка. В этой трассировке участвуют две службы demo1 и demo2. demo2 вызывает demo1 и вызывает demo1 с 597 мс, и для выполнения окончательного запроса требуется 1265 мс.

4. pinpoint

Нулевое вмешательство в код, использование технологии улучшения байт-кода JavaAgent, нужно только добавить параметры запуска.
Некоторые компоненты pinpoint похожи на zipkin, схема архитектуры выглядит следующим образом:

Pinpoint-Collector собирает различные данные о производительности, Pinpoint-Agent связывает зонды с запущенными приложениями, Pinpoint-Web отображает собранные данные в виде веб-страниц, а HBase Storage хранит данные, собранные в HBase.

4.1 Приводная установка

В основном это включает в себя установку следующего программного обеспечения:

  • jdk 1.8
    Нужна среда Java, объяснений нет.

  • Hbase
    Тестовые данные, собранные pinpoint, в основном хранятся в базе данных Hbase. Таким образом, он может собирать много данных и проводить более подробный анализ. После установки Hbase необходимо инициализировать библиотеку pinpoint Hbase, которую предоставляет pinpoint. Hbase имеет встроенный зоопарк.

  • pinpoint-collector
    Сборщик собирает данные агента, сохраняет данные в кластере hbase и предоставляет прослушивающие порты TCP и UDP сборщика 9994, 9995 и 9996.

  • pinpoint-web
    Страница отображается, а переменные среды HBASE_HOST, HBASE_PORT и т. д. устанавливаются в файле конфигурации.

  • pinpoint-agent

прибытьОфициальный сайтСтраница выпуска для загрузки pinpoint-agent-x-SNAPSHOT.tar.gz, сборщика информации о конфигурации pinpoint.config.

Установка действительно хлопотная, статья слишком длинная, конкретные шаги будут написаны отдельно позже.

4.2 Запуск pinpoint-агента

Автор использует проект spring-boot, поэтому мне нужно только добавить параметр -javaagent в команду для запуска пакета jar и указать абсолютный путь пакета pinpoint-bootstrap. Пример кода выглядит следующим образом:

java -javaagent:/aoho/auth_compose/pinpoint-bootstrap-1.6.0.jar -Dpinpoint.agentId=aoho-consumer -Dpinpoint.applicationName=aoho-consumer -jar id_generator/snowflake-id-generate-1.0-SNAPSHOT.jar

Служба генератора идентификаторов относительно проста и не использует носители данных, такие как базы данных. Сервис регистрируется на консуле, и локальный клиент запрашивает id-сервер для получения id. Его цепочка вызовов выглядит следующим образом:

call tree
call tree

Функции, предоставляемые pinpoint, относительно богаты.На следующем рисунке показаны подробности вызова интерфейса /api/id.

api
api

Видно, что pinpoint записывает соответствующее время, IP-адрес клиента и т. д. Дерево вызовов также подробно перечислено ниже, а также указано время, затрачиваемое на каждый метод.

serverMap
serverMap

ServerMap также отображает кучу сервера, постоянное поколение, CPU и другую информацию, которая очень мощна.

5. Skywalking

Skywalking — отечественный компонент мониторинга APM с открытым исходным кодом, официальный сайтOpenSkywalking, согласно официальному сайту, основное внимание уделяется производительности и производительности в реальном времени.
Схема архитектуры Skywalking найдена в Интернете.

Видно, что Skywalking также состоит из четырех частей: коллектора, агента, сети и хранилища. Поддерживается развертывание кластера, а также вводится связь grpc между кластерами. Хранилище поддерживает встроенное хранилище h2 и elasticsearch.

5.1 Установка

Видна конкретная установкаОфициальный сайт.

  • установка коллектора
    Здесь я использую автономную версию сборщика, скачиваю сжатый пакет на странице релиза, а после распаковки автономная версия сборщика по умолчанию использует базу данных h2, поэтому файл конфигурации можно запускать без модификации.bin/startup.sh.

Структура каталогов такая же, как и выше.В папке журналов есть журналы запуска, и вы можете просмотреть статус запуска.

  • web
    Разархивируйте skywalking-ui, установите сервер config/collector_config.properties, log4j2 и порт прослушивания и другую связанную информацию,

  • agent
    Скопируйте каталог skywalking-agent в нужное место, зонд содержит весь каталог и задайте информацию о сборщике в /config/agent.config.

5.2 Запуск агента

Загрузочный проект Spring запускается так же, как и указанный выше агент pinpoint. Увеличьте параметры запуска JVM,-javaagent:/path/to/skywalking-agent/skywalking-agent.jar.

На этот раз запускается пользовательский сервис, включающий такие компоненты, как mysql, redis и consul. Вы можете видеть, что диаграмма цепочки вызовов выглядит следующим образом:

при посещении/api/external/register-codeи/api/external/validate-codeПри использовании интерфейса формируется цепочка вызовов на рисунке выше.

Запрос с TraceId 2.59.15103021777910001 на рисунке выше/api/external/register-code. В этой трассировке на графике подсчитывается время, затраченное на каждый задействованный отрезок.

На приведенном выше рисунке показана статистика интерфейса Entry Service List в userService, включая количество вызовов, процент успешных вызовов и другую информацию. (из-за встроенного h2 здесь уже давно отзывается UI)

Также есть статистика по инстансу, информация, связанная со статистикой jvm, ответ API тоже очень медленный, это может быть связано с используемым хранилищем, поэтому скриншоты делать не буду.

6. Резюме

В этой статье в основном описывается практика компонентов мониторинга ссылок. Во-первых, вводятся основы создания и применения компонентов мониторинга канала и требования к выбору; во-вторых, вводятся основные концепции, связанные с открытой трассировкой; наконец, подробно вводятся установка и использование трех компонентов APM, а также Показан пользовательский интерфейс каждого APM. Эта статья относительно проста, а следующая статья в основном посвящена сравнению и тестированию производительности нескольких вариантов APM.

Исходный код zipkin-server-stream
github: GitHub.com/Доступный ETS2012/S…
oschina: git ee.com/can ets/judgment day you…

Подписывайтесь на свежие статьи, приглашаю обратить внимание на мой публичный номер

微信公众号
Публичный аккаунт WeChat


Ссылка (безумно ищу информацию)

  1. Официальные стандарты OpenTraacing — китайский язык
  2. Skywalking
  3. Zipkin
  4. PinPoint
  5. Spring Cloud Sleuth
  6. Dapper
  7. точную установку и развертывание
  8. Резюме APM с открытым исходным кодом Java
  9. Начало работы с zipkin, распределенной системой мониторинга системы
  10. Подпишитесь на Xiaocheng, чтобы изучить микросервисы — расширьте цепочку распределенных вызовов самостоятельно