Куда утекает производительность? Ищем ответ в логах Greenplum

от автора

Привет, Хабр!

Greenplum — это база данных, созданная специально для больших данных и аналитики. Ее основное преимущество — это архитектура массово параллельной обработки, сокращенно — MPP, которая позволяет масштабироваться до огромных объемов данных, не теряя производительности.

Но с большими данными приходят и большие проблемы. Медленные запросы, ошибки сегментов, отказы… Когда что‑то идет не так, первое, куда мы заглядываем — это логи. Логи Greenplum содержат все, что нужно для диагностики и отладки системы. В этой статье рассмотрим, как извлечь из логов максимум полезной информации, какие инструменты помогут и как автоматизировать анализ.

Структура логов Greenplum

Логи в Greenplum делятся на два типа: master logs и segment logs.

  • Master logs: фиксируют ключевые события и ошибки главного узла. Логи мастера расположены в /data/master/gpseg-1/pg_log/.

  • Segment logs: это логи узлов‑сегментов, которые обрабатывают данные. Если запросы тормозят, это будет отражено в логах сегментов, расположенных в /data/primary/gpsegN/pg_log/, где N — номер сегмента.

Часто встречающиеся сообщения и их значение

Типы сообщений в логах Greenplum:

  • PANIC: критическая ошибка, которая может остановить всю систему.

  • ERROR: ошибка выполнения запроса, вызванная, например, неправильным синтаксисом SQL или нехваткой ресурсов.

  • WARNING: предупреждения о потенциальных проблемах.

  • INFO: информационные сообщения, показывающие успешные операции и другую полезную информацию.

Пример ошибок, которые можно найти в логах:

PANIC:  could not connect to segment 1 of 4 in Greenplum cluster DETAIL:  Connection timed out.  ERROR:  insufficient memory for query execution at character 123 DETAIL:  Failed on request of size 8192 in memory context "ExecutorState".

Как понять, что искать в логах в зависимости от проблемы

Теперь разберем, как анализировать логи в зависимости от проблемы.

Ошибки выполнения запросов

Когда запросы не выполняются, в логах будут сообщения типа ERROR и PANIC. Чтобы найти такие ошибки, используйте эту команду:

grep "ERROR" /data/master/gpseg-1/pg_log/*.log

Если нужно больше контекста, чтобы понять, что произошло, используйте опции -A и -B, чтобы вывести несколько строк до и после ошибки:

grep -A 5 -B 5 "ERROR" /data/master/gpseg-1/pg_log/*.log

Этот метод помогает быстро локализовать проблему.

Пример автоматизации проверки логов на ошибки:

#!/bin/bash LOGS=$(grep "ERROR" /data/master/gpseg-1/pg_log/*.log) if [ -n "$LOGS" ]; then   echo "Обнаружены ошибки в логах:"   echo "$LOGS" fi

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

Медленные запросы

Медленные запросы — это тоже частая проблема в больших системах. В Greenplum каждая операция записывается в логи с меткой duration, которая показывает, сколько времени занял запрос. Чтобы найти медленные запросы, воспользуйтесь командой:

grep "duration" /data/master/gpseg-1/pg_log/*.log | awk '$NF > 5000'

Эта команда покажет все запросы, которые выполнялись более 5000 миллисекунд. Пример строки в логе:

LOG:  duration: 15384 ms  execute S_2: SELECT * FROM big_table WHERE condition;

Если видите такую строку — это сигнал к тому, что запрос нужно оптимизировать.

Отказы сегментов

Если сегмент выходит из строя, это может привести к сбою всей системы. Сообщения типа FATAL и PANIC указывают на такие проблемы:

grep -E "FATAL|PANIC" /data/primary/gpseg*/pg_log/*.log

Пример лога отказа сегмента:

PANIC:  could not connect to segment 1 of 4 in Greenplum cluster DETAIL:  Connection timed out.

Чтобы проверить синхронизацию сегментов, используйте системные таблицы:

SELECT hostname, port, status, failed_at FROM gp_toolkit.gp_stat_replication WHERE sync_state != 'sync';

Этот запрос покажет сегменты, которые не синхронизированы, и их текущее состояние.

Основные методы анализа логов

Теперь перейдем к инструментам, которые помогут в анализе логов. Кроме стандартных команд, типо как grep, awk и sed, Greenplum имеет прочие возможности через gp_toolkit.

Системная таблица gp_log_segment_directory позволяет получить доступ к логам всех сегментов из одного места. Вот пример запроса:

SELECT *  FROM gp_log_segment_directory WHERE hostname = 'segment_host_name' ORDER BY logfiletime DESC;

Этот запрос поможет найти логи нужного сегмента без необходимости заходить на каждый сервер вручную.

grep, awk и sed

grep помогает находить конкретные ошибки:

grep "ERROR" /data/master/gpseg-1/pg_log/*.log

awk используется для фильтрации данных, например, чтобы найти запросы, которые выполнялись дольше 5 секунд:

awk '/duration: [5-9][0-9]{3} ms/ {print $0}' /data/master/gpseg-1/pg_log/*.log

sed позволяет делать замены в логах, например, маскировать IP‑адреса:

sed 's/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/[MASKED]/g' /path/to/logfile.log

gp_toolkit

Есть набор системных таблиц и функций для работы с логами и мониторинга. Несколько полезных запросов:

Ошибки на уровне мастера:

SELECT *  FROM gp_toolkit.gp_log_master_ext WHERE logseverity = 'ERROR' ORDER BY logtime DESC;

Отказы сегментов за последние 24 часа:

SELECT hostname, address, port, status FROM gp_segment_configuration WHERE status = 'd' AND failed_at > NOW() - INTERVAL '1 day';

Автоматизация анализа логов

Чтобы не делать ручные проверки каждый раз, можно автоматизировать процесс анализа логов.

Пример скрипта, который отправляет уведомления в Slack, если найдены ошибки:

#!/bin/bash LOGS=$(grep "ERROR" /data/master/gpseg-1/pg_log/*.log) if [ -n "$LOGS" ]; then   curl -X POST -H 'Content-type: application/json' \   --data '{"text":"Обнаружены ошибки в Greenplum логах: '"$LOGS"'"}' \   https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK fi

Этот скрипт проверяет логи и автоматически отправляет уведомление, если найдены ошибки.

ELK-стек и Prometheus

Если объем логов слишком велик для ручного анализа, рассмотрите использование ELK‑стека. ELK позволяет собирать, индексировать и визуализировать логи в реальном времени.

Настройка Logstash для сбора логов Greenplum:

input {   file {     path => "/data/master/gpseg-1/pg_log/*.log"     start_position => "beginning"   } }  filter {   grok {     match => { "message" => "%{  TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:message}" }   } }  output {   elasticsearch {     hosts => ["localhost:9200"]     index => "greenplum-logs-%{+YYYY.MM.dd}"   } }

Также можно использовать Prometheus для мониторинга метрик Greenplum.


Сегодня в 20:00 пройдёт открытый урок, посвящённый теме оптимизации производительности в Greenplum. О чем пойдет речь:

  • Распределение данных: Как оптимально распределять данные по сегментам.

  • Индексы и партиционирование: Их роль в ускорении запросов. Нужны ли они в Greenplum?

  • Оптимизация запросов: Эффективные SQL-запросы и планировщик.

В практической части будут рассмотрены инструменты мониторинга, такие как gpperfmon и gpstate. Если тема интересна, записывайтесь на урок на странице курса «Greenplum для разработчиков и архитекторов баз данных».


ссылка на оригинал статьи https://habr.com/ru/articles/850290/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *