Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Ovaj članak govori o projektu nginx-sakupljač dnevnika, koji će čitati nginx zapise i slati ih u Clickhouse klaster. Obično se ElasticSearch koristi za zapisnike. Clickhouse zahtijeva manje resursa (prostor na disku, RAM, CPU). Clickhouse brže bilježi podatke. Clickhouse sažima podatke, čineći podatke na disku još kompaktnijima. Prednosti Clickhousea vidljive su na 2 slajda iz izvješća Kako VK ubacuje podatke u ClickHouse s desetaka tisuća poslužitelja.

Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Za pregled analitike temeljene na zapisnicima izradit ćemo nadzornu ploču za Grafanu.

Svi zainteresirani, dobrodošli u cat.

Instalirajte nginx, grafana na standardni način.

Instaliranje clickhouse klastera pomoću ansible-playbook from Denis Proskurin.

Izrada baza podataka i tablica u Clickhouseu

U ovom datoteka Opisani su SQL upiti za kreiranje baza podataka i tablica za nginx-log-collector u Clickhouseu.

Svaki zahtjev postavljamo jedan po jedan na svakom poslužitelju u klasteru Clickhouse.

Važna nota. U ovom retku, logs_cluster treba zamijeniti nazivom vašeg klastera iz datoteke clickhouse_remote_servers.xml između "remote_servers" i "shard".

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

Instalacija i konfiguracija nginx-log-collector-rpm

Nginx-log-collector nema rpm. Ovdje https://github.com/patsevanton/nginx-log-collector-rpm stvoriti rpm za to. rpm će se kompajlirati pomoću Fedora Copr

Instalirajte rpm paket 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

Uredite konfiguraciju /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/

Postavljanje nginxa

Opća nginx konfiguracija:

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

Jedan virtualni host:

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

Dodajte virtualne hostove u datoteku /etc/hosts:

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

Emulator HTTP poslužitelja

Kao emulator HTTP poslužitelja koristit ćemo se nodejs-stub-poslužitelj iz Maksim Ignatenko

Nodejs-stub-server nema rpm. Ovdje https://github.com/patsevanton/nodejs-stub-server stvoriti rpm za to. rpm će se kompajlirati pomoću Fedora Copr

Instalirajte nodejs-stub-server paket na uzvodni 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

Testiranje otpornosti na stres

Provodimo testiranje koristeći Apache benchmark.

Instalirajte ga:

yum install -y httpd-tools

Započinjemo testiranje koristeći Apache benchmark s 5 različitih poslužitelja:

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

Postavljanje Grafana

Na službenim stranicama Grafana nećete pronaći nadzornu ploču.

Stoga ćemo to učiniti ručno.

Možete pronaći moju spremljenu nadzornu ploču ovdje.

Također morate stvoriti varijablu tablice sa sadržajem nginx.access_log.
Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Ukupni zahtjevi za Singlestat:

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

Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Singlestat neuspjeli zahtjevi:

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

Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Postotak neuspjelih pojedinačnih statusa:

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

Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Prosječno vrijeme odgovora za Singlestat:

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

Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Singlestat maksimalno vrijeme odziva:

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

Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Status brojanja:

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

Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Da biste ispisali podatke poput pite, morate instalirati dodatak i ponovno pokrenuti Grafanu.

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

Pita TOP 5 Status:

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

Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Dalje ću davati zahtjeve bez snimaka zaslona:

Računaj 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

Vrijeme odgovora:

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

Vrijeme odgovora uzvodno (1. vrijeme odgovora uzvodno):

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

Status broja tablice za sve vhostove:

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

Opći pogled na kontrolnu ploču

Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Usporedba avg() i quantile()

prosj.()
Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse
kvantil()
Pomoćni program Nginx-log-collector tvrtke Avito za slanje nginx zapisa u Clickhouse

Zaključak:

Nadam se da će se zajednica uključiti u razvoj/testiranje i korištenje nginx-log-collector-a.
A kada netko implementira nginx-log-collector, reći će vam koliko je uštedio na disku, RAM-u i CPU-u.

Telegram kanali:

milisekunde:

Kome su milisekunde bitne, molimo vas da napišete ili glasate u ovome izdanje.

Izvor: www.habr.com

Dodajte komentar