Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

In dit artikel wordt het project besproken nginx-log-collector, dat logboeken van nginx leest en deze naar een Clickhouse-cluster verzendt. Gewoonlijk worden ElasticSearch logboeken gebruikt. Clickhouse vereist minder middelen (schijfruimte, RAM, CPU). Clickhouse schrijft gegevens sneller. Clickhouse comprimeert gegevens, wat de gegevens op de schijf nog compacter maakt. De voordelen van Clickhouse zijn duidelijk zichtbaar aan de hand van 2 dia's uit de presentatie. Hoe VK gegevens in ClickHouse invoegt vanaf duizenden servers.

Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Om analytics voor de logboeken te bekijken, maken we een dashboard voor Grafana.

Voor wie geĆÆnteresseerd is, welkom onder de cut.

We installeren nginx en grafana op de gebruikelijke manier.

We installeren een Clickhouse-cluster met behulp van het ansible-playbook van Denis Proskurin.

Creatie van db en tabellen in Clickhouse

In dit bestand staan de SQL-query's voor het maken van db en tabellen voor nginx-log-collector in Clickhouse beschreven.

Elke query voeren we ƩƩn voor ƩƩn uit op elke server van het Clickhouse-cluster.

Belangrijke opmerking. In deze regel moet logs_cluster worden vervangen door de naam van uw cluster uit het bestand clickhouse_remote_servers.xml tussen "remote_servers" en "shard".

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

Installatie en configuratie van nginx-log-collector-rpm

Nginx-log-collector heeft geen rpm. Hier https://github.com/patsevanton/nginx-log-collector-rpm maken we een rpm. De rpm zal worden gebouwd met behulp van Fedora Copr

We installeren het rpm-pakket 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

We passen de configuratie aan /etc/nginx-log-collector/config.yaml:

  .......
  upload:
    table: nginx.access_log
    dsn: http://ip-adres-van-clickhouse-cluster:8123/

- tag: "nginx_error:"
  format: error  # access | error
  buffer_size: 1048576
  upload:
    table: nginx.error_log
    dsn: http://ip-adres-van-clickhouse-cluster:8123/

Configuratie van nginx

Algemene configuratie van 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;
}

Virtuele host ƩƩn:

vhost1.conf:

upstream backend {
    server ip-adres-van-server-met-stub_http_server:8080;
    server ip-adres-van-server-met-stub_http_server:8080;
    server ip-adres-van-server-met-stub_http_server:8080;
    server ip-adres-van-server-met-stub_http_server:8080;
    server ip-adres-van-server-met-stub_http_server:8080;
}

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

Voeg virtuele hosts toe aan het bestand /etc/hosts:

ip-adres-van-server-met-nginx vhost1

HTTP-server emulator

We gaan gebruikmaken van een HTTP-server emulator: nodejs-stub-server van Maxim Ignatenko

Nodejs-stub-server heeft geen rpm. Hier: https://github.com/patsevanton/nodejs-stub-server maken we een rpm. De rpm zal worden gebouwd met behulp van Fedora Copr

Installeer het rpm-pakket nodejs-stub-server op upstream nginx

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

Belastingstest

De test wordt uitgevoerd met behulp van Apache benchmark.

Installeer het:

yum install -y httpd-tools

Start de test met behulp van Apache benchmark vanaf 5 verschillende servers:

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

Grafana-configuratie

Op de officiƫle website van Grafana vindt u geen dashboard.

Daarom gaan we het handmatig doen.

Je kunt mijn opgeslagen dashboard vinden here.

Je moet ook een variabele table maken met de inhoud nginx.access_log.
Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Singlestat Totale Verzoeken:

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

Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Singlestat Mislukte Verzoeken:

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

Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Singlestat Mislukte Percentage:

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

Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Singlestat Gemiddelde Reactietijd:

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

Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Singlestat Maximale Reactietijd:

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

Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Aantal Status:

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

Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Voor het weergeven van gegevens als taart, moet je de plugin installeren en grafana herstarten.

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

Taart TOP 5 Status:

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

Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Hierna geef ik de queries zonder screenshots:

Aantal http_user_agent:

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

Goede Ratio/Slechte Ratio:

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

Reactietiming:

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

Upstream reactietijd (reactietijd van 1 upstream):

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

Tabel Aantal Status voor alle vhosts:

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

Algemeen overzicht van het dashboard

Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Vergelijking avg() en quantile()

avg()
Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse
quantile()
Nginx-log-collector is een tool van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Uitvoer:

Ik hoop dat de community zich aansluit bij de ontwikkeling/testen en het gebruik van nginx-log-collector.
En dat iemand, wanneer nginx-log-collector wordt geĆÆmplementeerd, zal vertellen hoeveel schijfruimte, RAM en CPU is bespaard.

Telegram-kanalen:

Milliseconden:

Voor wie milliseconden belangrijk zijn, schrijf alsjeblieft of stem in deze probleem.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster