Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Tento článek bude diskutovat o projektu nginx-log-collector, který bude číst protokoly nginx a odesílat je do clusteru Clickhouse. Obvykle se pro protokoly používá ElasticSearch. Clickhouse vyžaduje méně zdrojů (místo na disku, RAM, CPU). Clickhouse zaznamenává data rychleji. Clickhouse komprimuje data, díky čemuž jsou data na disku ještě kompaktnější. Výhody Clickhouse jsou viditelné na 2 snímcích z přehledu Jak VK vkládá data do ClickHouse z desítek tisíc serverů.

Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Chcete-li zobrazit analýzy založené na protokolech, vytvoříme dashboard pro Grafana.

Kdo má zájem, vítejte na kočičce.

Nainstalujte nginx, grafana standardním způsobem.

Instalace clusteru clickhouse pomocí ansible-playbook from Denis Proskurin.

Vytváření databází a tabulek v Clickhouse

v této soubor Jsou popsány SQL dotazy pro vytváření databází a tabulek pro nginx-log-collector v Clickhouse.

Každý požadavek provádíme jeden po druhém na každém serveru v clusteru Clickhouse.

Důležitá poznámka. V tomto řádku je třeba logs_cluster nahradit názvem vašeho clusteru ze souboru clickhouse_remote_servers.xml mezi „remote_servers“ a „shard“.

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

Instalace a konfigurace nginx-log-collector-rpm

Nginx-log-collector nemá otáčky za minutu. Tady https://github.com/patsevanton/nginx-log-collector-rpm vytvořte pro to otáčky za minutu. rpm bude zkompilován pomocí Fedora Copr

Nainstalujte balíček rpm 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

Upravte soubor config /etc/nginx-log-collector/config.yaml:

  .......
  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/

Nastavení nginx

Obecná konfigurace nginx:

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;
}

Jeden virtuální hostitel:

vhost1.conf:

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;
    }
}

Přidejte virtuální hostitele do souboru /etc/hosts:

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

emulátor HTTP serveru

Jako emulátor HTTP serveru budeme používat nodejs-stub-server z Maxim Ignatenko

Nodejs-stub-server nemá otáčky za minutu. Tady https://github.com/patsevanton/nodejs-stub-server vytvořte pro to otáčky za minutu. rpm bude zkompilován pomocí Fedora Copr

Nainstalujte balíček nodejs-stub-server na upstream nginx rpm

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

Zátěžové testování

Testování provádíme pomocí benchmarku Apache.

Nainstalujte to:

yum install -y httpd-tools

Začínáme testovat pomocí benchmarku Apache z 5 různých serverů:

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

Nastavení Grafany

Na oficiálních stránkách Grafany nenajdete dashboard.

Proto to uděláme ručně.

Můžete najít můj uložený řídicí panel zde.

Musíte také vytvořit proměnnou tabulky s obsahem nginx.access_log.
Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Celkový počet požadavků Singlestat:

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

Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Singlestat neúspěšné požadavky:

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

Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Procento selhání jednoho statu:

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

Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Jednostatová průměrná doba odezvy:

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

Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Maximální doba odezvy jednoho statu:

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

Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Stav počtu:

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

Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Pro výstup dat jako koláč je potřeba nainstalovat plugin a restartovat grafana.

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

Stav koláče TOP 5:

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

Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Dále zašlu požadavky bez snímků obrazovky:

Počet http_user_agent:

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

GoodRate/BadRate:

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

Načasování odezvy:

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

Doba odezvy upstream (doba odezvy 1. upstream):

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

Stav počtu tabulek pro všechny vhost:

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

Celkový pohled na palubní desku

Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Porovnání avg() a quantile()

avg()
Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse
kvantil()
Nástroj Nginx-log-collector od společnosti Avito pro odesílání protokolů nginx do Clickhouse

Závěr:

Doufám, že se komunita zapojí do vývoje/testování a používání nginx-log-collector.
A když někdo implementuje nginx-log-collector, řekne vám, kolik ušetřil na disku, RAM a CPU.

Telegramové kanály:

milisekundy:

Komu záleží na milisekundách, pište nebo hlasujte zde otázka.

Zdroj: www.habr.com

Přidat komentář