
FluentD — это кроссплатформенное программное обеспечение, с открытым исходным кодом для сбора данных , первоначально разработанный в Treasure Data. Он написан в основном на языке Ruby.
Установка Fluentd в Unix/Linux
Начнем с того, чо установим и настроим кое-что. Так званая пред-установка.
Настройка NTP
НАСТОЯТЕЛЬНО рекомендуется настроить ntpd на ноде, чтобы предотвратить неправильные отметки времени в ваших логах. Вот пример установок:
Установка и настройка NTP на CentOS/Fedora/RedHat
Увеличение количества файловых дескрипторов
Проверить текущий размер, можно с помощью:
$ ulimit -n
Если у вас около 1024, — этого недостаточно. Тогда, открываем:
$ vim /etc/security/limits.conf
И добавляем следующие строки в файл:
root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536
PS: Стоит перезагрузить компьютер.
Значение которое я выставил (65536 — максимальное значение), — является наиболее хорошим вариантом. Необходимое количество файловых дескрипторов зависит от ваших плагинов и настроек самого FluentD.
Вот полезное чтиво:
Увеличить Max Open File Limit в Unix/Linux
Оптимизация параметров ядра (настройка сети)
Для сред с высокой нагрузкой, состоящих из множества экземпляров Fluentd, следует оптимизировать параметры, для этого открываем:
$ vim /etc/sysctl.conf
И прописываем:
net.core.somaxconn = 1024
net.core.netdev_max_backlog = 5000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_wmem = 4096 12582912 16777216
net.ipv4.tcp_rmem = 4096 12582912 16777216
net.ipv4.tcp_max_syn_backlog = 8096
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10240 65535
Для того чтобы настройки вступили в силу, стоит выполнить:
$ sysctl -p
Или:
# reboot
Если в вашей среде нет проблем с TCP_WAIT, эти изменения не нужны.
Перейдем к установке…
Установка Fluentd в CentOS/Fedora/RedHat
Имеется несколько способов установить fluentD на ваш сервер, я приведу несколько из них.
-=== СПОСОБ 1 ===-
Установка очень простая, выполняем:
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh
Для установки td-agent2, выполните:
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
Для запуска, случит команда:
$ service td-agent start
Или:
$ /etc/init.d/td-agent start
Ну, и конечно же, если юзаете systemD:
# systemctl start td-agent.service
Вот и вся установка.
-=== СПОСОБ 2 — использовать docker ===-
Использовать докер. Я расскажу как это сделать немного ниже
-=== СПОСОБ 3 — использовать gem===-
Использовать gem. Я расскажу как это сделать немного ниже
Установка Fluentd в Debian/Ubuntu
Имеется несколько способов установить fluentD на ваш сервер, я приведу несколько из них.
-=== СПОСОБ 1 ===-
Установка очень простая, выполняем одно из действий:
Если у вас Ubuntu Bionic:
$ curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-bionic-td-agent3.sh | sh
Если у вас Ubuntu Xenial:
$ curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent3.sh | sh
Если у вас Ubuntu Trusty:
$ curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent3.sh | sh
Если у вас Debian Stretch:
$ curl -L https://toolbelt.treasuredata.com/sh/install-debian-stretch-td-agent3.sh | sh
Если у вас Debian Jessie:
$ curl -L https://toolbelt.treasuredata.com/sh/install-debian-jessie-td-agent3.sh | sh
PS: Как и в примере с RPM, можно использовать еще и td-agent2.
Запускаем и смотрим что вышло ( если у вас systemD):
# systemctl start td-agent.service && systemctl status td-agent.service
Запускаем и смотрим что вышло ( если у вас init.d):
# /etc/init.d/td-agent restart && /etc/init.d/td-agent status
Как-то так.
-=== СПОСОБ 2 — использовать docker ===-
Использовать докер. Я расскажу как это сделать немного ниже
-=== СПОСОБ 3 — использовать gem===-
Использовать gem. Я расскажу как это сделать немного ниже
Установка Fluentd в Mac OS X
Имеется несколько способов установить fluentD на ваш сервер, я приведу несколько из них.
-=== СПОСОБ 1 ===-
Идем по ссылке ( на момент написания статьи, была самая свежая версия) и скачиваем:
$ wget http://packages.treasuredata.com.s3.amazonaws.com/3/macosx/td-agent-3.1.1-0.dmg
Чтобы установить имееться команды, если не знаете как, — вот чтиво:
Установка dmg пакетов через CLI (командную строку) в MacOS X
Затем, запустим:
$ sudo launchctl load /Library/LaunchDaemons/td-agent.plist
Посмотреть логи можно так:
$ less /var/log/td-agent/td-agent.log
Чтобы оставновить службу, выполните:
$ sudo launchctl unload /Library/LaunchDaemons/td-agent.plist
Вот и все!
-=== СПОСОБ 2 — использовать docker ===-
Использовать докер. Я расскажу как это сделать немного ниже
-=== СПОСОБ 3 — использовать gem===-
Использовать gem. Я расскажу как это сделать немного ниже
Установка Fluentd на другие Unix/Linux ОС
Имеется несколько способов установить fluentD на ваш сервер, я приведу несколько из них.
-=== СПОСОБ 1 — использовать docker ===-
Устанавливаем Docker:
Установка Docker на Debian/Ubuntu
Установка Docker на CentOS/RedHat/Fedora
Выполним поиск пакета:
$ docker search fluentd
Чтобы поставить, выполняем:
$ docker pull fluent/fluentd
Создаем конфиг, например:
$ vim /tmp/fluentd.conf
И в него, прописываем:
<source>
@type http
port 9880
bind 0.0.0.0
</source>
<match **>
@type stdout
</match>
Запускаем контейнер:
$ docker run -d \
-p 9880:9880 -v /tmp:/fluentd/etc -e FLUENTD_CONF=fluentd.conf \
fluent/fluentd
Для теста можно выполнить:
$ curl -X POST -d 'json={"json":"message"}' http://localhost:9880/sample.test
-=== СПОСОБ 2 — использовать исходный код===-
Ставим git и клонируем код:
$ git clone https://github.com/fluent/fluentd.git && cd fluentd
Выполним билд:
$ bundle install
Fetching gem metadata from https://rubygems.org/.........
...
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
$ bundle exec rake build
fluentd xxx built to pkg/fluentd-xxx.gem.
$ gem install pkg/fluentd-xxx.gem
Запускаем:
$ fluentd --setup ./fluent
$ fluentd -c ./fluent/fluent.conf -vv &
$ echo '{"json":"message"}' | fluent-cat debug.test
Для остановки, можно заюзать:
$ pkill -f fluentd
Идем дальше…
-=== СПОСОБ 3 — использовать gem===-
Первым делом, нужен Ruby >= 2.1.
После чего, выполняем:
$ gem install fluentd --no-ri --no-rdoc
Потом выполняем:
$ fluentd --setup ./fluent
$ fluentd -c ./fluent/fluent.conf -vv &
$ echo '{"json":"message"}' | fluent-cat debug.test
Чтобы остановить сервис, выполните:
$ pkill -f fluentd
Как-то так.
Настройка Fluentd в Unix/Linux
После установки, можно установить плагины. Приведу несколько примеров:
Использование плагинов для FluentD
Я при использовании докера, использвовал:
$ /opt/td-agent/embedded/bin/fluent-gem install --no-ri --no-rdoc \
fluent-plugin-elasticsearch \
fluent-plugin-record-modifier \
fluent-plugin-exclude-filter \
fluent-plugin-splunk-enterprise
Можно на машине использовать:
$ fluent-gem install --no-ri --no-rdoc \
fluent-plugin-elasticsearch \
fluent-plugin-record-modifier \
fluent-plugin-exclude-filter \
fluent-plugin-splunk-enterprise
Или если используете td-agent:
# td-agent-gem install fluent-plugin-elasticsearch \
fluent-plugin-record-modifier \
fluent-plugin-exclude-filter \
fluent-plugin-splunk-enterprise
Как-то так.
Конфигурация FluentD
Мой fluentd.config выглядит следующим образом:
# http
<source>
@type http
@id http_input
format json
port 8888
self_hostname "#{ENV['HOSTNAME']}"
<parse>
@type json
</parse>
tag http.events
</source>
# tcp
<source>
@type tcp
@id tcp_input
format none
format /^(?<field1>\d+):(?<field2>\w+)$/
port 5170
bind 0.0.0.0
delimiter \n
#log-level debug
self_hostname "#{ENV['HOSTNAME']}"
#source_hostname_key "client_host"
<parse>
@type json
</parse>
tag tcp.events
</source>
# Forwarding
<source>
@type forward
@id forward_input
port 24224
self_hostname "#{ENV['HOSTNAME']}"
bind 0.0.0.0
tag forward.events
</source>
# live debugging agent
<source>
@type debug_agent
@id debug.agent
bind 127.0.0.1
port 24230
tag debug_agent.debug
</source>
###############################################################################
## match directives determine the output destinations.
## filter directives determine the event processing pipelines.
## system directives set system wide configuration.
## label directives group the output and filter for internal routing
## @include directives include other files.
## Output descriptions:
###############################################################################
# <match **.access>
<match **>
@type copy
<store>
@type stdout
</store>
</match>
## match tag=debug.** and dump to console
<match **.debug>
@type stdout
@id output_stdout
</match>
<filter esb_bw>
@type record_transformer
<record>
hostname "#{Socket.gethostname}"
</record>
</filter>
<system>
# equal to -qq option
log_level error
process_name fluentd
</system>
# Include config files in the ./config.d directory
@include config.d/*.conf
Чтобы работать с файлами, можно использовать:
<source>
@type tail
@id in_tail_container_logs
path /logs/docker_logs/*/*.log
pos_file /data/docker.pos
read_from_head true
tag docker.**
skip_refresh_on_startup false
refresh_interval 10s
enable_watch_timer true
enable_stat_watcher false
<parse>
@type json
time_format %Y-%m-%dT%H:%M:%S.%NZ
</parse>
</source>
Отфильтруем, ( В данном случае дописывает имя хостовой системы, на которой запущен контейнер):
<filter docker.**>
@type record_transformer
enable_ruby
<record>
hostname "#{Socket.gethostname}"
</record>
</filter>
Выполняет разбивку на порции данных (chunks) и пишет их в буфер (buffer), который находится на диске. Порции данных помещает в очередь. Отправляет коллектору:
<match docker.**>
@type forward
@id forward_docker
<server>
name main_server
host collector.example.com
port 24224
</server>
<buffer>
@type file
path /data/buffers/containers
flush_mode interval
retry_type exponential_backoff
flush_thread_count 2
flush_interval 2s
retry_forever
retry_max_interval 30
chunk_limit_size 4M
queue_limit_length 512
overflow_action block
</buffer>
</match>
Так же способом можно делать для других типов.
Вот и все, статья «Установка Fluentd в Unix/Linux» завершена.