Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Овај чланак ће говорити о пројекту нгинк-лог-цоллецтор, који ће читати нгинк евиденције, послати их у Цлицкхоусе кластер. Обично се ЕластицСеарцх користи за дневнике. Цлицкхоусе захтева мање ресурса (простор на диску, РАМ, ЦПУ). Цлицкхоусе брже пише податке. Цлицкхоусе компресује податке, што чини податке на диску још компактнијим. Предности Цлицкхоусе-а се могу видети у 2 слајда из извештаја Како ВК убацује податке у ЦлицкХоусе са десетина хиљада сервера.

Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Да бисте видели аналитику према евиденцији, хајде да направимо контролну таблу за Графану.

Кога брига, добродошао под мачку.

Инсталирајте нгинк, графана на стандардни начин.

Инсталирајте цлицкхоусе кластер са ансибле-плаибоок-ом из Денис Проскурин.

Креирање базе података и табела у Цлицкхоусе-у

У овоме фајл Описани су СКЛ упити за креирање база података и табела за нгинк-лог-цоллецтор у Цлицкхоусе-у.

Сваки захтев постављамо редом на сваком серверу Цлицкхоусе кластера.

Важна напомена. У овом реду, логс_цлустер треба заменити именом вашег кластера из датотеке цлицкхоусе_ремоте_серверс.кмл између „ремоте_серверс“ и „схард“.

ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())

Инсталирање и конфигурисање нгинк-лог-цоллецтор-рпм

Нгинк-лог-цоллецтор нема рпм. Ево https://github.com/patsevanton/nginx-log-collector-rpm креирајте рпм за то. рпм ће бити изграђен помоћу Федора Цопр

Инсталирајте рпм пакет нгинк-лог-цоллецтор-рпм

yum -y install yum-plugin-copr
yum copr enable antonpatsev/nginx-log-collector-rpm
yum -y install nginx-log-collector
systemctl start nginx-log-collector

Уредите конфигурацију /етц/нгинк-лог-цоллецтор/цонфиг.иамл:

  .......
  upload:
    table: nginx.access_log
    dsn: http://ip-адрес-кластера-clickhouse:8123/

- tag: "nginx_error:"
  format: error  # access | error
  buffer_size: 1048576
  upload:
    table: nginx.error_log
    dsn: http://ip-адрес-кластера-clickhouse:8123/

Подешавање нгинк-а

Општа нгинк конфигурација:

user  nginx;
worker_processes  auto;

#error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    log_format avito_json escape=json
                     '{'
                     '"event_datetime": "$time_iso8601", '
                     '"server_name": "$server_name", '
                     '"remote_addr": "$remote_addr", '
                     '"remote_user": "$remote_user", '
                     '"http_x_real_ip": "$http_x_real_ip", '
                     '"status": "$status", '
                     '"scheme": "$scheme", '
                     '"request_method": "$request_method", '
                     '"request_uri": "$request_uri", '
                     '"server_protocol": "$server_protocol", '
                     '"body_bytes_sent": $body_bytes_sent, '
                     '"http_referer": "$http_referer", '
                     '"http_user_agent": "$http_user_agent", '
                     '"request_bytes": "$request_length", '
                     '"request_time": "$request_time", '
                     '"upstream_addr": "$upstream_addr", '
                     '"upstream_response_time": "$upstream_response_time", '
                     '"hostname": "$hostname", '
                     '"host": "$host"'
                     '}';

    access_log     syslog_server=unix:/var/run/nginx_log.sock,nohostname,tag=nginx avito_json; #ClickHouse
    error_log      syslog_server=unix:/var/run/nginx_log.sock,nohostname,tag=nginx_error; #ClickHouse

    #access_log  /var/log/nginx/access.log  main;

    proxy_ignore_client_abort on;
    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}

Виртуелни домаћин један:

вхост1.цонф:

upstream backend {
    server ip-адрес-сервера-с-stub_http_server:8080;
    server ip-адрес-сервера-с-stub_http_server:8080;
    server ip-адрес-сервера-с-stub_http_server:8080;
    server ip-адрес-сервера-с-stub_http_server:8080;
    server ip-адрес-сервера-с-stub_http_server:8080;
}

server {
    listen   80;
    server_name vhost1;
    location / {
        proxy_pass http://backend;
    }
}

Додајте виртуелне хостове у /етц/хостс датотеку:

ip-адрес-сервера-с-nginx vhost1

ХТТП сервер емулатор

Као емулатор ХТТП сервера користићемо нодејс-стуб-сервер из Максим Игнатенко

нодејс-стуб-сервер нема рпм. Ево https://github.com/patsevanton/nodejs-stub-server креирајте рпм за то. рпм ће бити изграђен помоћу Федора Цопр

Инсталирајте пакет нодејс-стуб-сервер на упстреам нгинк рпм

yum -y install yum-plugin-copr
yum copr enable antonpatsev/nodejs-stub-server
yum -y install stub_http_server
systemctl start stub_http_server

Тестирање на стрес

Тестирање се врши помоћу Апацхе бенцхмарк-а.

Инсталирајте га:

yum install -y httpd-tools

Почињемо да тестирамо користећи Апацхе бенцхмарк са 5 различитих сервера:

while true; do ab -H "User-Agent: 1server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 2server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 3server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 4server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 5server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done

Постављање Графане

На званичном сајту Графане нећете наћи контролну таблу.

Стога ћемо то урадити ручно.

Можете пронаћи моју сачувану контролну таблу овде.

Такође морате да креирате променљиву табеле са садржајем nginx.access_log.
Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Укупни захтеви за појединачну статистику:

SELECT
 1 as t,
 count(*) as c
 FROM $table
 WHERE $timeFilter GROUP BY t

Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Синглестат неуспели захтеви:

SELECT
 1 as t,
 count(*) as c
 FROM $table
 WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t

Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Проценат неуспешних појединачних статистика:

SELECT
 1 as t, (sum(status = 500 or status = 499)/sum(status = 200 or status = 201 or status = 401))*100 FROM $table
 WHERE $timeFilter GROUP BY t

Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Просечно време одговора за појединачну статистику:

SELECT
 1, avg(request_time) FROM $table
 WHERE $timeFilter GROUP BY 1

Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Максимално време одговора за појединачну статистику:

SELECT
 1 as t, max(request_time) as c
 FROM $table
 WHERE $timeFilter GROUP BY t

Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Статус бројања:

$columns(status, count(*) as c) from $table

Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Да бисте избацили податке као колач, потребно је да инсталирате додатак и поново учитате графану.

grafana-cli plugins install grafana-piechart-panel
service grafana-server restart

Пита ТОП 5 Статус:

SELECT
    1, /* fake timestamp value */
    status,
    sum(status) AS Reqs
FROM $table
WHERE $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5

Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Даље ћу дати захтеве без снимака екрана:

Број хттп_усер_агент:

$columns(http_user_agent, count(*) c) FROM $table

ГоодРате/БадРате:

$rate(countIf(status = 200) AS good, countIf(status != 200) AS bad) FROM $table

време одговора:

$rate(avg(request_time) as request_time) FROM $table

Време одговора узводно (време одговора 1. узводно):

$rate(avg(arrayElement(upstream_response_time,1)) as upstream_response_time) FROM $table

Статус броја табела за све вхостове:

$columns(status, count(*) as c) from $table

Општи поглед на контролну таблу

Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Поређење авг() и куантиле()

авг()
Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе
квантил()
Нгинк-лог-цоллецтор услужни програм из Авито за слање нгинк дневника у Цлицкхоусе

Закључак:

Надамо се да ће се заједница укључити у развој/тестирање и коришћење нгинк-лог-цоллецтор-а.
А када неко имплементира нгинк-лог-цоллецтор, он ће вам рећи колико је уштедео диск, РАМ, ЦПУ.

Телеграм канали:

Милисекунде:

Кога брига за милисекунде, пишите или гласајте, молим вас, у овоме емисија.

Извор: ввв.хабр.цом

Додај коментар