Практика работы с каждым компонентом микросервисов будет включать инструменты. В этой статье будут представлены некоторые инструменты для ежедневной разработки микросервисов. Эти инструменты помогут нам построить более надежную систему микросервисов и помочь нам устранять неполадки и устранять проблемы и узкие места производительности в системе микросервисов.
Мы остановимся на схеме сбора логов ELK в микросервисной архитектуре (ELK — это аббревиатура от Elasticsearch, Logstash, Kibana), если быть точным, ELKB, то есть ELK + Filebeat, в котором Filebeat — это облегченка для пересылки и централизации логов. средство доставки данных.
Зачем вам нужна распределенная система логирования
В предыдущих проектах, если вы хотите обнаружить ошибки или проблемы с производительностью бизнес-служб с помощью журналов в производственной среде, вам нужно использовать команды для запроса файлов журнала для каждого экземпляра службы, что приводит к очень низкой эффективности устранения неполадок.
В архитектуре микрослужб несколько экземпляров служб развертываются на разных физических машинах, а журналы каждой микрослужбы разбросаны и хранятся на разных физических машинах. Если кластер достаточно велик, то использование описанного выше традиционного способа просмотра логов становится крайне неуместным. Поэтому необходимо централизованно управлять журналами в распределенной системе.Существуют компоненты с открытым исходным кодом, такие как syslog, которые используются для сбора и суммирования журналов на всех серверах.
Однако после централизации лог-файлов мы сталкиваемся со статистикой и получением этих лог-файлов, какие службы имеют алармы и исключения, а для этих требуется подробная статистика. Поэтому, когда раньше происходил онлайн-сбой, часто было видно, что разработчики и персонал по эксплуатации и обслуживанию загружали журналы службы, извлекали и подсчитывали их на основе некоторых команд Linux, таких как grep, awk и wc. Этот метод неэффективен и имеет большую рабочую нагрузку, и его использование неизбежно для более высоких требований, таких как запросы, сортировка и статистика, а также для огромного количества машин.
Распределенная система логирования ELKB
ELKB — это полная распределенная система сбора журналов, которая решает вышеупомянутые проблемы сложного сбора, поиска и анализа журналов. ELKB относится к Elasticsearch, Logstash, Kibana и Filebeat соответственно. Полный набор компонентов, предоставляемых elastic, можно рассматривать как модель MVC, logstash соответствует уровню контроллера логического управления, Elasticsearch — уровню модели модели данных, а Kibana — уровню представления. Logstash и Elasticsearch реализованы на Java, а Kibana использует фреймворк node.js.
Функции этих компонентов и их роли в системе сбора журналов последовательно представлены ниже.
Установка и использование Elasticsearch
Elasticsearch — это механизм полнотекстового поиска и анализа в реальном времени, который обеспечивает три функции сбора, анализа и хранения данных; это набор открытых структур API REST и JAVA для обеспечения эффективных функций поиска и расширяемой распределенной системы. Он построен на основе библиотеки поисковой системы Apache Lucene.
Elasticsearch можно использовать для поиска всех видов документов. Он обеспечивает масштабируемый поиск, поиск почти в реальном времени, поддерживает мультиарендность, способен масштабироваться до сотен сервисных узлов и поддерживает структурированные или неструктурированные данные на уровне PB.
Elasticsearch является распределенным, а это значит, что индекс можно разделить на сегменты, и каждый сегмент может иметь 0 или более реплик. Каждый узел содержит один или несколько сегментов и выступает в качестве координатора для делегирования операций правильному сегменту. Ребалансировка и маршрутизация выполняются автоматически. Связанные данные обычно хранятся в одном индексе, который состоит из одного или нескольких основных сегментов и нуля или более реплицированных сегментов. После создания индекса количество первичных сегментов изменить нельзя.
Elasticsearch — это система анализа распределенного поиска в реальном времени, она используется для полнотекстового поиска, структурированного поиска, анализа и комбинации этих трех функций. Она ориентирована на документы, то есть хранит целые объекты или документы. Elasticsearch не только хранит документы, но и индексирует содержимое каждого документа, чтобы его можно было получить. В Elasticsearch вы индексируете, извлекаете, сортируете и фильтруете документы, а не данные строк и столбцов.
Для удобства устанавливаем Elasticsearch напрямую с помощью docker:
$ docker run -d --name elasticsearch docker.elastic.co/elasticsearch/elasticsearch:5.4.0
Следует отметить, что после запуска Elasticsearch требуются простые настройки, xpack.security.enabled включен по умолчанию, для удобства отмените аутентификацию при входе. Заходим в контейнер и выполняем следующую команду:
# 进入启动好的容器
$ docker exec -it elasticsearch bash
# 编辑配置文件
$ vim config/elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
xpack.security.enabled: false
# minimum_master_nodes need to be explicitly set when bound on a public IP
# set to 1 to allow single node clusters
# Details: https://github.com/elastic/elasticsearch/pull/17288
discovery.zen.minimum_master_nodes: 1
После изменения файла конфигурации выйдите из контейнера и перезапустите контейнер. Чтобы сохранить конфигурацию для последующего использования, нам нужно создать новый образ из этого контейнера. Сначала получите ContainerId, соответствующий контейнеру. Затем отправьте новое изображение на основе контейнера.
$ docker commit -a "add config" -m "dev" a404c6c174a2 es:latest
sha256:5cb8c995ca819765323e76cccea8f55b423a6fa2eecd9c1048b2787818c1a994
Таким образом мы получаем новое зеркало es:latest. Запускаем новый образ:
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" es:latest
Мы проверяем, прошла ли установка успешно, обращаясь к встроенной конечной точке, предоставленной Elasticsearch.
[root@VM_1_14_centos ~]# curl 'http://localhost:9200/_nodes/http?pretty'
{
"_nodes" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"cluster_name" : "docker-cluster",
"nodes" : {
"8iH5v9C-Q9GA3aSupm4caw" : {
"name" : "8iH5v9C",
"transport_address" : "10.0.1.14:9300",
"host" : "10.0.1.14",
"ip" : "10.0.1.14",
"version" : "5.4.0",
"build_hash" : "780f8c4",
"roles" : [
"master",
"data",
"ingest"
],
"attributes" : {
"ml.enabled" : "true"
},
"http" : {
"bound_address" : [
"[::]:9200"
],
"publish_address" : "10.0.1.14:9200",
"max_content_length_in_bytes" : 104857600
}
}
}
}
Как видите, мы успешно установили Elasticsearch, который служит источником хранения данных журнала, обеспечивая нам эффективную производительность поиска.
Мы также установили инструмент визуализации для Elasticsearch: elasticsearch-head. Способ установки очень прост:
$ docker run -p 9100:9100 mobz/elasticsearch-head:5
elasticsearch-head — это подключаемый модуль на стороне клиента для мониторинга состояния Elasticsearch, включая визуализацию данных, выполнение операций добавления, удаления, модификации и запросов.
Интерфейс после установки выглядит следующим образом:
Установка и использование logstash
logstash — это программное обеспечение для анализа данных, основной целью которого является анализ журналов журналов. Принцип его использования следующий:
Источник данных сначала передает данные в logstash, здесь мы используем Filebeat для передачи данных журнала. Его основными компонентами являются ввод входных данных, фильтрация источника данных фильтра и вывод выходных данных.
Logstash фильтрует и форматирует данные (преобразовывает в формат JSON), затем отправляет их в Elasticsearch для хранения и создает индекс для поиска. графики.
Давайте начнем установку и использование logstash. Сначала загрузите и распакуйте logstash:
# 下载 logstash
$ wget https://artifacts.elastic.co/downloads/logstash/logstash-5.4.3.tar.gz
# 解压 logstash
$ tar -zxvf logstash-5.4.3.tar.gz
Скорость загрузки может быть относительно низкой, вы можете выбрать внутренний зеркальный источник. После успешной распаковки нам нужно настроить logstash, в основном ввод, вывод и фильтрацию, о которых мы упоминали.
[root@VM_1_14_centos elk]# cat logstash-5.4.3/client.conf
input {
beats {
port => 5044
codec => "json"
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "logstash-app-error-%{+YYYY.MM.dd}"
}
stdout {codec => rubydebug}
}
Входные файлы поддержки, syslog, beats, мы можем выбрать только один из них при настройке. Здесь мы настраиваем метод filebeats.
Фильтрация используется для обработки определенных действий и событий, соответствующих определенным правилам. Общие фильтры включают grok для анализа нестандартного текста и преобразования его в структурированный формат, geoip для добавления географической информации, drop для удаления некоторых событий и mutate для изменения документов и т. д. Вот пример использования фильтра:
filter {
#定义客户端的 IP 是哪个字段
geoip {
source => "clientIp"
}
}
Вывод поддерживает Elasticsearch, file, graphite и statsd. По умолчанию отфильтрованные данные выводятся в Elasticsearch. Когда нам не нужно выводить в ES, нам нужно указать, какой метод вывода требуется. Он поддерживает настройку нескольких источников вывода.
Событие может проходить через несколько выходов во время обработки, но как только все выходы выполнены, событие завершает свой жизненный цикл.
В нашей конфигурации мы выводим информацию журнала в Elasticsearch. После того, как конфигурационный файл на месте, запускаем logstash:
$ bin/logstash -f client.conf
Sending Logstash's logs to /elk/logstash-5.4.3/logs which is now configured via log4j2.properties
[2020-10-30T14:12:26,056][INFO ][logstash.outputs.elasticsearch] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://127.0.0.1:9200/]}}
[2020-10-30T14:12:26,062][INFO ][logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://127.0.0.1:9200/, :path=>"/"}
log4j:WARN No appenders could be found for logger (org.apache.http.client.protocol.RequestAuthCache).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[2020-10-30T14:12:26,209][WARN ][logstash.outputs.elasticsearch] Restored connection to ES instance {:url=>#<URI::HTTP:0x1abac0 URL:http://127.0.0.1:9200/>}[2020-10-30T14:12:26,225][INFO ][logstash.outputs.elasticsearch] Using mapping template from {:path=>nil}
[2020-10-30T14:12:26,288][INFO ][logstash.outputs.elasticsearch] Attempting to install template {:manage_template=>{"template"=>"logstash-*", "version"=>50001, "settings"=>{"index.refresh_interval"=>"5s"}, "mappings"=>{"_default_"=>{"_all"=>{"enabled"=>true, "norms"=>false}, "dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword"}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date", "include_in_all"=>false}, "@version"=>{"type"=>"keyword", "include_in_all"=>false}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}}
[2020-10-30T14:12:26,304][INFO ][logstash.outputs.elasticsearch] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>[#<URI::Generic:0x2fec3fe6 URL://127.0.0.1:9200>]}
[2020-10-30T14:12:26,312][INFO ][logstash.pipeline ] Starting pipeline {"id"=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>500}
[2020-10-30T14:12:27,226][INFO ][logstash.inputs.beats ] Beats inputs: Starting input listener {:address=>"0.0.0.0:5044"}
[2020-10-30T14:12:27,319][INFO ][logstash.pipeline ] Pipeline main started
[2020-10-30T14:12:27,422][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
Судя по выходу лога из консоли, мы знаем, что logstash запустился нормально.
Установка и использование Кибаны
Kibana — это графический веб-интерфейс для поиска, анализа и визуализации данных журнала, хранящихся в метриках Elasticsearch. Kibana визуализирует данные, возвращаемые вызовом интерфейса Elasticsearch. Он использует интерфейс REST Elasticsearch для извлечения данных, позволяя пользователям не только создавать собственные представления своих данных на панели мониторинга, но и запрашивать и фильтровать данные специальными способами.
Установка Kibana относительно проста, мы можем установить ее на основе докера:
docker run --name kibana -e ELASTICSEARCH_URL=http://127.0.0.1:9200 -p 5601:5601 -d kibana:5.6.9
Мы указали переменную среды ELASTICSEARCH в команде запуска, которая является локальной.127.0.0.1:9200
.
Установка и использование Filebeat
Filebeat — это легкий инструмент доставки для пересылки и централизации данных журналов. Filebeat отслеживает указанные файлы журнала или местоположения, собирает события журнала и перенаправляет их в Logstash, Kafka, Redis и т. д. или непосредственно в Elasticsearch для индексации.
Приступим к установке и настройке Filebeat:
# 下载 filebeat
$ wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.4.3-linux-x86_64.tar.gz
$ tar -zxvf filebeat-5.4.3-linux-x86_64.tar.gz
$ mv filebeat-5.4.3-linux-x86_64 filebeat
# 进入目录
$ cd filebeat
# 配置 filebeat
$ vi filebeat/client.yml
filebeat.prospectors:
- input_type: log
paths:
- /var/log/*.log
output.logstash:
hosts: ["localhost:5044"]
В конфигурации filebeat input_type поддерживает ввод из Log, Syslog, Stdin, Redis, UDP, Docker, TCP, NetFlow. Приведенная выше конфигурация настраивает чтение информации журнала из журнала. И он настроен только на ввод файлов журнала в каталоге /var/log/. output настраивает Filebeat на использование logstash и использует logstash для дополнительной обработки данных, собранных Filebeat.
После настройки запускаем Filebeat:
$ ./filebeat -e -c client.yml
2020/10/30 06:46:31.764391 beat.go:285: INFO Home path: [/elk/filebeat] Config path: [/elk/filebeat] Data path: [/elk/filebeat/data] Logs path: [/elk/filebeat/logs]
2020/10/30 06:46:31.764426 beat.go:186: INFO Setup Beat: filebeat; Version: 5.4.3
2020/10/30 06:46:31.764522 logstash.go:90: INFO Max Retries set to: 3
2020/10/30 06:46:31.764588 outputs.go:108: INFO Activated logstash as output plugin.
2020/10/30 06:46:31.764586 metrics.go:23: INFO Metrics logging every 30s
2020/10/30 06:46:31.764664 publish.go:295: INFO Publisher name: VM_1_14_centos
2020/10/30 06:46:31.765299 async.go:63: INFO Flush Interval set to: 1s
2020/10/30 06:46:31.765315 async.go:64: INFO Max Bulk Size set to: 2048
2020/10/30 06:46:31.765563 beat.go:221: INFO filebeat start running.
2020/10/30 06:46:31.765592 registrar.go:85: INFO Registry file set to: /elk/filebeat/data/registry
2020/10/30 06:46:31.765630 registrar.go:106: INFO Loading registrar data from /elk/filebeat/data/registry
2020/10/30 06:46:31.766100 registrar.go:123: INFO States Loaded from registrar: 6
2020/10/30 06:46:31.766136 crawler.go:38: INFO Loading Prospectors: 1
2020/10/30 06:46:31.766209 registrar.go:236: INFO Starting Registrar
2020/10/30 06:46:31.766256 sync.go:41: INFO Start sending events to output
2020/10/30 06:46:31.766291 prospector_log.go:65: INFO Prospector with previous states loaded: 0
2020/10/30 06:46:31.766390 prospector.go:124: INFO Starting prospector of type: log; id: 2536729917787673381
2020/10/30 06:46:31.766422 crawler.go:58: INFO Loading and starting Prospectors completed. Enabled prospectors: 1
2020/10/30 06:46:31.766430 spooler.go:63: INFO Starting spooler: spool_size: 2048; idle_timeout: 5s
2020/10/30 06:47:01.764888 metrics.go:34: INFO No non-zero metrics in the last 30s
2020/10/30 06:47:31.764929 metrics.go:34: INFO No non-zero metrics in the last 30s
2020/10/30 06:48:01.765134 metrics.go:34: INFO No non-zero metrics in the last 30s
Когда вы запускаете Filebeat, он запускает один или несколько входных данных, которые ищет в месте, указанном для данных журнала. Для каждого журнала, который Filebeat находит, Filebeat запускает сборщик. Каждый сборщик считывает новый контент из одного журнала и отправляет новые данные журнала в libbeat, который агрегирует события и отправляет агрегированные данные на выход, настроенный для Filebeat.
Практика использования ELKB
После установки компонентов ELKB приступаем к их интеграции. Во-первых, давайте посмотрим на процесс сбора журналов ELKB.
Filebeat прослушивает файлы журнала приложения, а затем отправляет данные в logstash, который фильтрует и форматирует данные, например в формате JSON; затем logstash отправляет обработанные данные журнала в Elasticsearch, который хранит и строит поисковые индексы; Kibana предоставляет страница визуального просмотра.
После того, как мы запустим все компоненты, сначала посмотрим на изменения индекса в elasticsearch-head:
можно увидеть еще одинfilebeat-2020.10.12
, что указывает на то, что структура распределенного сбора журналов ELKB была успешно построена. доступhttp://localhost:9100, давайте посмотрим на проиндексированные данные:
Как видно из двух приведенных выше скриншотов, новые данные журнала генерируются в файле mysqld.log в каталоге /var/log/. Эти данные очень велики. Нам нужно фильтровать в соответствии с фактическим бизнесом в производственной среде и обрабатывать соответствующие данные журнала.формат журнала.
elasticsearch-head — простой клиент Elasticsearch.Для более полной статистики и требований поиска нужен Kibana.Kibana улучшает аналитические возможности Elasticsearch, который может более интеллектуально анализировать данные, выполнять математические преобразования и разрезать данные на блоки в соответствии с требованиями.
доступhttp://localhost:5601, получил информацию журнала на рисунке выше. FilebeatЖурнал mysql отслеживается и отображается в Kibana. Kibana лучше справляется с огромными объемами данных и создает столбцы, линии, разброс, гистограмму, круговую диаграмму и карты, которые я не буду здесь показывать.
резюме
В этой статье в основном представлена распределенная система сбора журналов ELKB. Журналы в основном используются для записи дискретных событий, содержащих подробную информацию о точке или этапе выполнения программы. ELKB решает проблему, связанную с тем, что в микросервисной архитектуре существует множество разрозненных экземпляров сервисов, и сложно собирать и анализировать логи. Из-за нехватки места в этом занятии рассказывается только об установке и использовании ELKB. Микросервисы Go обычно используют структуры журналов, такие как logrus, zap и т. д., и выводят журналы в указанное место в определенном формате. Читатели могут создать микросервис для практики. .