Статья из Fluentd
Вступление
-
Что такое свободно? *
Fluentd - это сборщик данных с открытым исходным кодом, предназначенный для унификации инфраструктуры ведения журналов. Он предназначен для объединения инженеров по эксплуатации, разработчиков приложений и инженеров данных, делая его простым и масштабируемым для сбора и хранения журналов.
Before Fluentd
image: https: //assets.digitalocean.com/articles/dockerlogs_fluentd/1.jpg [Грязная структура регистрации, показывающая отношения между многими программами]
After Fluentd
image: https: //assets.digitalocean.com/articles/dockerlogs_fluentd/2.png [Fluentd собирает журналы приложений и доступа из многих источников и направляет их на множество результатов анализа, архивирования и метрик]
Ключевая особенность
Fluentd обладает четырьмя ключевыми характеристиками, которые делают его пригодным для создания чистых и надежных каротажных трубопроводов:
-
* Unified Logging with JSON: * Fluentd старается структурировать данные в максимально возможной степени в формате JSON. Это позволяет Fluentd унифицировать все аспекты обработки данных журналов: сбор, фильтрацию, буферизацию и вывод журналов по нескольким источникам и местам назначения. Обработка данных в нисходящем направлении намного проще с JSON, так как он имеет достаточную структуру, чтобы быть доступным без применения жестких схем
-
* Pluggable Architecture: * Fluentd имеет гибкую систему плагинов, которая позволяет сообществу расширять свои функциональные возможности. 300+ подключаемых сообществом плагинов соединяют десятки источников данных с десятками выходов данных, манипулируя данными по мере необходимости. Используя плагины, вы можете лучше использовать свои логи сразу
-
* Минимальные требуемые ресурсы: * Сборщик данных должен быть легковесным, чтобы пользователь мог комфортно запускать его на занятой машине. Fluentd написан на комбинации C и Ruby и требует минимальных системных ресурсов. Экземпляр vanilla работает на 30-40 МБ памяти и может обрабатывать 13 000 событий в секунду / ядро
-
* Встроенная надежность: * потеря данных никогда не должна происходить. Fluentd поддерживает буферизацию на основе памяти и файлов для предотвращения потери данных между узлами. Fluentd также поддерживает надежное аварийное переключение и может быть настроен на высокую доступность
Цели: Сбор централизованных журналов Docker-контейнеров с помощью Fluentd
Поскольку контейнеры Docker развернуты в производстве, существует растущая необходимость сохранять журналы контейнеров где-то менее эфемерно, чем контейнеры.
В этом руководстве мы покажем вам, как установить Fluentd и использовать его для сбора журналов из контейнеров Docker, сохраняя их снаружи, чтобы можно было сохранять данные после остановки контейнеров. Мы будем передавать данные в другой контейнер с Elasticsearch на том же сервере Ubuntu 14.04.
Как указано в Kubernetes репозиторий GitHub, эта архитектура использует способность Fluentd отслеживать и анализировать JSON-per -линейные файлы журнала, создаваемые демоном Docker для каждого контейнера. Для минимальной настройки, пожалуйста, смотрите this recipe.
В конце этого урока мы обсудим еще два варианта использования. Прочитав эту статью, вы должны знать основы использования Fluentd.
Предпосылки
Пожалуйста, убедитесь, что вы выполнили эти предварительные условия для учебника.
-
Ubuntu 14.04 Droplet
-
Пользователь с sudo доступом
Шаг 1 - Установка Fluentd
Наиболее распространенный способ развертывания Fluentd - через пакет + td-agent +
. Treasure Data, первоначальный автор Fluentd, упаковывает Fluentd с собственной средой исполнения Ruby, так что пользователю не нужно настраивать собственный Ruby для запуска Fluentd.
В настоящее время + td-agent
поддерживает следующие платформы:
-
Ubuntu: ясный, точный и надежный
-
Debian: Wheezy и Squeeze
-
RHEL / Centos: 5, 6 и 7
-
Mac OSX: 10,9 и выше
В этом руководстве предполагается, что вы используете DigitalOcean Droplet под управлением Ubuntu 14.04 LTS (Trusty).
Установите + td-agent
с помощью следующей команды:
curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh
Запустите + td-agent
:
sudo /etc/init.d/td-agent start
Проверьте журналы, чтобы убедиться, что он был успешно установлен:
tail /var/log/td-agent/td-agent.log
Вы должны увидеть вывод, похожий на следующий:
port 24230
</source>
</ROOT>
2015-02-22 18:27:45 -0500 [info]: adding source type="forward"
2015-02-22 18:27:45 -0500 [info]: adding source type="http"
2015-02-22 18:27:45 -0500 [info]: adding source type="debug_agent"
2015-02-22 18:27:45 -0500 [info]: adding match pattern="td.*.*" type="tdlog"
2015-02-22 18:27:45 -0500 [info]: adding match pattern="debug.**" type="stdout"
2015-02-22 18:27:45 -0500 [info]: listening fluent socket on 0.0.0.0:24224
2015-02-22 18:27:45 -0500 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"
_ _
* Примечание: * С другой стороны, Fluentd доступен в виде Ruby gem и может быть установлен с помощью + gem install fluentd +
. Если у вас нет привилегий sudo, установите Ruby (см. Https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-with-rbenv-on-debian-7-wheezy [Установка Ruby] здесь) и запустите:
gem install fluentd --no-rdoc --no-ri
_ _
Шаг 2 - Установка Docker
Теперь мы установим Docker. Этот учебник был протестирован с Docker v1.5.0.
Добавьте ключ для хранилища Docker, чтобы мы могли получить обновленный пакет Docker:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
Добавьте репозиторий к своим источникам:
sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
Обновите вашу систему:
sudo apt-get update
Установите Docker:
sudo apt-get install lxc-docker
Убедитесь, что Docker был установлен, проверив версию:
docker --version
Вы должны увидеть результат, подобный следующему:
Docker version 1.5.0, build a8a31ef
Шаг 3 - Добавление пользователя в группу Docker
Docker запускается от имени * root *, поэтому для выдачи команд + docker +
добавьте своего пользователя sudo в группу * docker *. Замените ++
на пользователя по вашему выбору.
sudo gpasswd -a docker
Затем перезапустите Docker.
sudo service docker restart
Наконец, если вы в настоящее время вошли в систему как пользователь sudo, вы должны выйти и снова войти в систему.
Шаг 4 - Создание свободного изображения
В этом разделе мы создадим образ Docker для контейнера Fluentd Docker. Если вы хотите узнать больше о Docker в целом, прочитайте th вводное учебное пособие.
Создайте новый каталог для ваших ресурсов Fluentd Docker и перейдите в него:
mkdir ~/fluentd-docker && cd ~/fluentd-docker
Создайте следующий + Dockerfile +
:
sudo nano Dockerfile
Добавьте следующее содержимое в ваш файл точно. Этот файл сообщает Docker обновить контейнер Docker и установить Ruby, Fluentd и Elasticsearch:
FROM ruby:2.2.0
MAINTAINER [email protected]
RUN apt-get update
RUN gem install fluentd -v "~>0.12.3"
RUN mkdir /etc/fluent
RUN apt-get install -y libcurl4-gnutls-dev make
RUN /usr/local/bin/gem install fluent-plugin-elasticsearch
ADD fluent.conf /etc/fluent/
ENTRYPOINT ["/usr/local/bundle/bin/fluentd", "-c", "/etc/fluent/fluent.conf"]
Вам также необходимо создать файл + fluent.conf +
в том же каталоге.
sudo nano fluent.conf
Файл + fluent.conf +
должен выглядеть следующим образом. Вы можете скопировать этот файл точно:
<source>
type tail
read_from_head true
path /var/lib/docker/containers/*/*-json.log
pos_file /var/log/fluentd-docker.pos
time_format %Y-%m-%dT%H:%M:%S
tag docker.*
format json
</source>
# Using filter to add container IDs to each event
<filter docker.var.lib.docker.containers.*.*.log>
type record_transformer
<record>
container_id ${tag_parts[5]}
</record>
</filter>
<match docker.var.lib.docker.containers.*.*.log>
type elasticsearch
logstash_format true
host "#{ENV['ES_PORT_9200_TCP_ADDR']}" # dynamically configured to use Docker's link feature
port 9200
flush_interval 5s
</match>
Цель этого файла - сообщить Fluentd, где найти журналы для других контейнеров Docker.
Затем создайте свой образ Docker с именем + fluentd-es +
:
docker build -t fluentd-es .
Это займет несколько минут. Убедитесь, что вы успешно создали изображения:
docker images
Вы должны увидеть результат примерно так:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
fluentd-es latest 89ba1fb47b23 2 minutes ago 814.1 MB
ruby 2.2.0 51473a2975de 6 weeks ago 774.9 MB
Шаг 5 - Запуск контейнера Elasticsearch
Теперь вернитесь в свой домашний каталог или предпочитаемый каталог для вашего контейнера Elasticsearch:
cd ~
Загрузите и запустите контейнер Elasticsearch. Для этого уже есть автоматизированная сборка:
docker run -d -p 9200:9200 -p 9300:9300 --name es dockerfile/elasticsearch
Дождитесь загрузки изображения контейнера и запустите.
Затем убедитесь, что контейнер Elasticsearch работает правильно, проверив процессы Docker:
docker ps
Вы должны увидеть результат примерно так:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c474fd99ce43 dockerfile/elasticsearch:latest "/elasticsearch/bin/ 4 minutes ago Up 4 minutes 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp es
Шаг 6 - Запуск контейнера Fluentd-to-Elasticsearch
Теперь мы запустим контейнер, который запускает Fluentd, собирает журналы и отправляет их в Elastcisearch.
docker run -d --link es:es -v /var/lib/docker/containers:/var/lib/docker/containers fluentd-es
В приведенной выше команде часть + - link es: es +
связывает контейнер Elasticsearch с контейнером Fluentd. Часть + -v / var / lib / docker / Containers: / var / lib / docker / container +
необходима для подключения каталога журналов контейнера хоста в контейнер Fluentd, чтобы Fluentd мог создавать файлы журналов по мере создания контейнеров. ,
Наконец, проверьте, что контейнер работает, проверив наши активные процессы Docker:
docker ps
На этот раз вы должны увидеть как контейнер Elasticsearch, так и новый контейнер + fluentd-es +
:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f0d2cac81ac8 fluentd-es:latest "/usr/local/bundle/b 2 seconds ago Up 2 seconds stupefied_brattain
c474fd99ce43 dockerfile/elasticsearch:latest "/elasticsearch/bin/ 6 minutes ago Up 6 minutes 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp es
Шаг 7 - Подтверждение того, что Elasticsearch получает события
Наконец, давайте подтвердим, что Elasticsearch получает события:
curl -XGET 'http://localhost:9200/_all/_search?q=*'
Вывод должен содержать события, которые выглядят так:
{"took":66,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}
{"took":59,"timed_out":false,"_shards":{"tod","_id":"AUwLaKjcnpi39wqZnTXQ","_score":1.0,"_source":{"log":"2015-03-12 00:35:44 +0000 [info]: following tail of /var/lib/docker/containers/6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9/6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9-json.log\n","stream":"stdout","container_id":"6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9","@timestamp":"2015-03-12T00:35:44+00:00"}}]}}
В зависимости от настроек может быть зарегистрировано несколько событий. Отдельное событие должно начинаться с `+ {" take ': + `и заканчиваться отметкой времени.
Как показывает этот вывод, Elasticsearch получает данные. (Ваш идентификатор контейнера будет отличаться от указанного выше!)
Шаг 8 - перевод журналов событий на следующий уровень
Теперь, когда Elasticsearch сохраняет ваши контейнерные события, что вам делать дальше? Есть много полезных вещей, которые можно сделать с Elasticsearch. Если вы ищете идеи, вы можете проверить:
-
Adding dashboard, чтобы вы могли визуализировать свои журналы
Заключение
Сбор журналов из контейнеров Docker - это всего лишь один из способов использования Fluentd. В этом разделе мы представим два других распространенных варианта использования Fluentd.
Вариант использования 1: поиск в журнале в режиме реального времени и архивирование журнала
Многие пользователи приходят на Fluentd, чтобы создать конвейер журналирования, который выполняет как поиск в реальном времени, так и долгосрочное хранение. Архитектура выглядит так:
image: https: //assets.digitalocean.com/articles/dockerlogs_fluentd/3.png [Передача журналов из нескольких бэкэндов в Elasticsearch, MongoDB и Hadoop]
Эта архитектура использует преимущества способности Fluentd копировать потоки данных и выводить их в несколько систем хранения. В вышеупомянутой настройке Elasticsearch используется для поиска в реальном времени, а MongoDB и / или Hadoop используются для пакетной аналитики и долговременного хранения.
Вариант использования 2: централизованная регистрация приложений
Веб-приложения создают много журналов, и они часто произвольно форматируются и хранятся в локальной файловой системе. Это плохо по двум причинам:
-
Журналы трудно анализировать программно (требуя большого количества регулярных выражений) и, следовательно, они не очень доступны для тех, кто хочет понять поведение пользователя с помощью статистического анализа (A / B-тестирование, обнаружение мошенничества и т. Д.)
-
Журналы не доступны в режиме реального времени, потому что текстовые журналы загружаются в системы хранения. Кроме того, если диск сервера был поврежден между загрузками, журналы будут потеряны или повреждены
Fluentd решает эти проблемы путем:
-
Предоставление библиотек логгеров для различных языков программирования с единым API: каждый регистратор посылает трижды (метка времени, метка, событие в формате JSON) во Fluentd. В настоящее время существуют библиотеки логгеров для Ruby, Node.js, Go, Python, Perl, PHP, Java и C ++.
-
Разрешение приложению «запускать и забывать»: регистратор может асинхронно вести журнал в Fluentd, который, в свою очередь, буферизует журналы перед загрузкой в бэкэнд-системы
Ресурсы:
-
Прочитайте о Unified Logging Layer
-
Fluentd + Elasticsearch для Kubernetes Сатнам Сингх (комментатор Kubernetes)