Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Selles artiklis käsitletakse projekti nginx-log-kollektor, mis loeb nginxi logisid ja saadab need Clickhouse'i klastrisse. Tavaliselt kasutatakse logide jaoks ElasticSearchi. Clickhouse nõuab vähem ressursse (kettaruumi, RAM, CPU). Clickhouse salvestab andmed kiiremini. Clickhouse tihendab andmed, muutes kettal olevad andmed veelgi kompaktsemaks. Clickhouse'i eelised on nähtavad aruande kahel slaidil Kuidas VK lisab ClickHouse'i andmeid kümnetest tuhandetest serveritest.

Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Logidel põhineva analüütika vaatamiseks loome Grafana jaoks armatuurlaua.

Kõik huvilised, tere tulemast kassile.

Installige nginx, grafana standardsel viisil.

Clickhouse'i klastri installimine ansible-playbooki abil Denis Proskurin.

Andmebaaside ja tabelite loomine Clickhouse'is

Selles faili Kirjeldatakse SQL-päringuid nginx-log-collectori andmebaaside ja tabelite loomiseks Clickhouse'is.

Teeme iga päringu ükshaaval igas Clickhouse klastri serveris.

Oluline märkus. Sellel real tuleb logs_cluster asendada teie klastri nimega faili clickhouse_remote_servers.xml vahel "remote_servers" ja "shard".

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

Nginx-log-collector-rpm installimine ja konfigureerimine

Nginx-log-kollektoril pole pööret minutis. Siin https://github.com/patsevanton/nginx-log-collector-rpm looge selle jaoks pöörete arv. rpm kompileeritakse kasutades Fedora Copr

Installige rpm pakett 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

Redigeerige konfiguratsiooni /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/

Nginxi seadistamine

Üldine nginxi konfiguratsioon:

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

Üks virtuaalne 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;
    }
}

Lisage faili /etc/hosts virtuaalsed hostid:

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

HTTP serveri emulaator

HTTP-serveri emulaatorina kasutame nodejs-stub-server pärit Maksim Ignatenko

Nodejs-stub-serveril pole rpm. Siin https://github.com/patsevanton/nodejs-stub-server looge selle jaoks pöörete arv. rpm kompileeritakse kasutades Fedora Copr

Installige pakett nodejs-stub-server ülesvoolu 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

Stressi testimine

Testime läbi Apache etaloniga.

Installige see:

yum install -y httpd-tools

Alustame testimist Apache etaloniga viies erinevas serveris:

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 seadistamine

Armatuurlauda Grafana ametlikult veebisaidilt ei leia.

Seetõttu teeme seda käsitsi.

Leiate minu salvestatud armatuurlaua siin.

Samuti peate looma sisuga tabelimuutuja nginx.access_log.
Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Singlestati taotluste koguarv:

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

Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Singlestat ebaõnnestunud taotlused:

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

Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Singlestat ebaõnnestumise protsent:

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

Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Singlestati keskmine reageerimisaeg:

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

Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Singlestat maksimaalne reageerimisaeg:

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

Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Loenduse olek:

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

Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Andmete nagu pirukas väljastamiseks peate installima pistikprogrammi ja taaskäivitama grafana.

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

Piruka TOP 5 staatus:

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

Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Lisaks annan taotlusi ilma ekraanipiltideta:

Loe 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

Vastuse ajastus:

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

Ülesvoolu reaktsiooniaeg (1. ülesvoolu reaktsiooniaeg):

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

Tabeliloenduse olek kõigi vhosti jaoks:

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

Armatuurlaua üldvaade

Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Avg() ja quantile() võrdlus

avg()
Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i
kvantiil()
Avito Nginx-log-collectori utiliit nginxi logide saatmiseks Clickhouse'i

Järeldus:

Loodan, et kogukond osaleb nginx-log-collectori arendamisel/testimisel ja kasutamisel.
Ja kui keegi rakendab nginx-log-collectori, ütleb ta teile, kui palju nad kettale, RAM-ile ja protsessorile säästsid.

Telegrami kanalid:

Millisekundid:

Kellele millisekundid on olulised, palun kirjutage või hääletage selles probleem.

Allikas: www.habr.com

Lisa kommentaar