Nástroj Nginx-log-collector od spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Tento článok bude diskutovať o projekte nginx-log-collector, ktorý načíta protokoly nginx a odošle ich do klastra Clickhouse. ElasticSearch sa zvyčajne používa pre denníky. Clickhouse vyžaduje menej zdrojov (miesto na disku, RAM, CPU). Clickhouse zaznamenáva dáta rýchlejšie. Clickhouse komprimuje dáta, vďaka čomu sú dáta na disku ešte kompaktnejšie. Výhody Clickhouse sú viditeľné na 2 snímkach z prehľadu Ako VK vkladá dáta do ClickHouse z desiatok tisíc serverov.

Nástroj Nginx-log-collector od spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Nástroj Nginx-log-collector od spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Ak chcete zobraziť analýzy založené na protokoloch, vytvoríme dashboard pre Grafana.

Kto má záujem, vitajte v kat.

Nainštalujte nginx, grafana štandardným spôsobom.

Inštalácia klastra clickhouse pomocou ansible-playbook from Denis Proskurin.

Vytváranie databáz a tabuliek v Clickhouse

v tejto súbor Sú popísané SQL dotazy na vytváranie databáz a tabuliek pre nginx-log-collector v Clickhouse.

Každú požiadavku robíme jednu po druhej na každom serveri v klastri Clickhouse.

Dôležitá poznámka. V tomto riadku je potrebné nahradiť logs_cluster názvom vášho klastra zo súboru clickhouse_remote_servers.xml medzi „remote_servers“ a „shard“.

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

Inštalácia a konfigurácia nginx-log-collector-rpm

Nginx-log-collector nemá otáčky za minútu. Tu https://github.com/patsevanton/nginx-log-collector-rpm vytvorte pre to otáčky za minútu. rpm sa skompiluje pomocou Fedora Copr

Nainštalujte balík 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 súbor 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/

Nastavenie nginx

Všeobecná konfigurácia 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álny hostiteľ:

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

Pridajte virtuálnych hostiteľov do súboru /etc/hosts:

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

emulátor servera HTTP

Ako emulátor HTTP servera budeme používať nodejs-stub-server od Maxim Ignatenko

Nodejs-stub-server nemá otáčky za minútu. Tu https://github.com/patsevanton/nodejs-stub-server vytvorte pre to otáčky za minútu. rpm sa skompiluje pomocou Fedora Copr

Nainštalujte balík 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áťažové testovanie

Testovanie vykonávame pomocou benchmarku Apache.

Nainštalujte ho:

yum install -y httpd-tools

Začíname testovať pomocou benchmarku Apache z 5 rôznych serverov:

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

Nastavenie Grafana

Na oficiálnej stránke Grafany nenájdete dashboard.

Preto to urobíme ručne.

Môžete nájsť môj uložený informačný panel tu.

Musíte tiež vytvoriť premennú tabuľky s obsahom nginx.access_log.
Nástroj Nginx-log-collector od spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Celkový počet žiadostí Singlestat:

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

Nástroj Nginx-log-collector od spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Singlestat neúspešné žiadosti:

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 spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Percento zlyhaní singlestatu:

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 spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Priemerný čas odozvy jedného statu:

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

Nástroj Nginx-log-collector od spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Maximálna doba odozvy jedného statu:

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

Nástroj Nginx-log-collector od spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Stav počtu:

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

Nástroj Nginx-log-collector od spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Ak chcete vydávať dáta ako koláč, musíte si nainštalovať plugin a reštartovať grafana.

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

Stav koláča 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 spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Ďalej poskytnem požiadavky bez snímok 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časovanie odozvy:

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

Čas odozvy upstream (prvý upstream odozva):

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

Stav počtu tabuliek pre všetky vhost:

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

Celkový pohľad na palubnú dosku

Nástroj Nginx-log-collector od spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Nástroj Nginx-log-collector od spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Nástroj Nginx-log-collector od spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Porovnanie avg() a quantile()

avg()
Nástroj Nginx-log-collector od spoločnosti Avito na odosielanie protokolov nginx do Clickhouse
kvantil()
Nástroj Nginx-log-collector od spoločnosti Avito na odosielanie protokolov nginx do Clickhouse

Záver:

Dúfam, že sa komunita zapojí do vývoja/testovania a používania nginx-log-collector.
A keď niekto implementuje nginx-log-collector, povie vám, koľko ušetril na disku, RAM a CPU.

Telegramové kanály:

milisekundy:

Komu záleží na milisekundách, napíšte alebo hlasujte otázka.

Zdroj: hab.com

Pridať komentár