Назад | Перейти на главную страницу

регистрация / захват STDERR / STDOUT на Amazon EC2

Я ищу решение, которое позволило бы мне автоматически захватывать STDOUT / STDERR процесса, запущенного на Amazon EC2, и отправлять его (удаленно) на другой сервер.

Звучит просто, за исключением:

  1. Я буду использовать спотовые экземпляры, а это значит, что я не могу точно контролировать, когда они запускаются, и они могут завершиться в любую минуту (без надлежащего выключения)
  2. Поскольку выключения нет, я не могу записать в локальный файл и передать его (например, в s3) после завершения процесса.
  3. Выходные данные плохо структурированы (например, в файле журнала отсутствуют табличные поля), поэтому «стандартные» облачные решения для ведения журналов нетривиальны, а использование одной из облачных баз данных не идеально.

Я рассмотрел пару идей, но у каждой есть проблема:

  1. Добавление к файлу на «s3» невозможно, а перезапись файлов слишком медленная для ведения журнала.
  2. Насколько мне известно, совместное использование томов EBS (как дисков) невозможно.
  3. Использование "simple_db" звучит слишком медленно (а "simple_db" уже много лет находится в бета-версии, поэтому я не уверен, что его можно использовать).
  4. Использование SQS (например, одно сообщение на строку вывода?) Очень медленное.
  5. Перенаправление на сетевой сокет завершится ошибкой, если соединение прервется на секунду (например, «myprogram 2> & 1 | nc my.log.server 7070»

Возможно, есть решение "системного журнала" с удаленным ведением журнала? но потребуется ли для этого отдельный экземпляр "по запросу" для сбора информации?

Любые советы и идеи будут оценены.

Спасибо, -g

Я надеялся, что от Amazon есть сервис «только добавлять» или «в основном добавлять», который предназначен для ведения журнала.

Может быть, как Amazon Kinesis?

Amazon Kinesis позволяет производителям передавать данные непосредственно в поток Amazon Kinesis. Например, журналы системы и приложений могут быть отправлены в Amazon Kinesis и доступны для обработки в считанные секунды. Это предотвращает потерю данных журнала при выходе из строя клиентского интерфейса или сервера приложений. Amazon Kinesis обеспечивает ускоренное получение потока данных, поскольку вы не группируете данные на серверах перед их отправкой для приема ».

- http://aws.amazon.com/kinesis

Я еще не пробовал этого, потому что у меня есть надзорный процесс homebrew, который использует S3 и SQS ... в начале потока он создает уникальные имена для временных файлов (в экземпляре), которые будут записывать журналы и отправлять сообщение через SQS, которое приводит к тому, что информация о процессе и местоположениях его файлов журнала сохраняется в базе данных; когда процесс останавливается (это запланированные или управляемые событиями задания, а не постоянно выполняемые задания), отправляется другое сообщение SQS, которое содержит избыточную информацию о том, где находились временные файлы, и дает мне статус завершения процесса; затем оба журнала (выход и ошибка) сжимаются и загружаются в S3, при этом каждый из этих процессов генерирует дополнительные сообщения SQS, сообщающие о статусе загрузки S3 ...

Сообщения SQS, как вы могли заметить, в значительной степени избыточны, но это сделано для того, чтобы практически исключить вероятность того, что я не узнаю что-то о существовании процесса, так как все 4 сообщения (start, stop, stdout-upload-info, stderr-upload-info) содержат достаточно информации, чтобы идентифицировать хост, процесс, аргументы и куда будут идти файлы журнала или ушли или должны были уйти в S3. Конечно, вся эта избыточность была почти полностью ненужной, поскольку процесс и SQS / S3 очень стабильны, но при необходимости избыточность существует.

Мне не нужно вести журнал для этих заданий в реальном времени, но если бы я это сделал, другим вариантом было бы изменить сборщик журналов, чтобы вместо сохранения журналов и последующей их отправки на S3 я мог бы для каждого " x "байт собранных журналов или каждые «y» секунд времени выполнения - в зависимости от того, что произошло раньше - «сбрасывать» накопленные данные в сообщение SQS ... не было бы необходимости отправлять сообщение SQS для каждой строки.

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

Во-вторых, не ждите здесь волшебства. Вам необходимо сохранить сообщения журнала где-то, поэтому вам, вероятно, понадобится запустить долго работающий экземпляр (внутри EC2 или где-то еще) для сбора и хранения ваших сообщений.

Вот что я бы порекомендовал:

  1. Запустите ваше приложение, используя руководитель. Это не только даст вам некоторые элементарные возможности мониторинга / перезапуска процесса, но, что более важно, supervisord будет обрабатывать сбор ваших выходных потоков и запись в файлы журнала.
  2. На каждом сервере приложений используйте экспедитор logstash читать файлы журналов, которые пишет супервизор, и отправлять их в ...
  3. А logstash/эластичный поиск server, на котором logstash получает журналы с ваших узлов, организует их (при необходимости) и отправляет их в elasticsearch для долгосрочного хранения и поиска.

Несколько дополнительных комментариев:

  • Сервер пересылки Logstash может шифровать свои сообщения с помощью logstash, поэтому при необходимости вы можете отправлять свои журналы по общедоступным сетям, не беспокоясь об утечке информации.
  • Elasticsearch довольно просто реализовать, и он удивительный работа по индексации ваших сообщений
  • Elasticsearch предоставляет интерфейс REST, который можно использовать для выполнения запросов, но если вам нужен веб-интерфейс, Кибана3 отличный вариант.
  • Если вам нужно отслеживать журналы и предупреждать / уведомлять об определенных шаблонах, можно настроить logstash для этого.