Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

Aquest article parlarà del projecte nginx-log-collector, que llegirà els registres de nginx i els enviarà al clúster Clickhouse. Normalment, ElasticSearch s'utilitza per als registres. Clickhouse requereix menys recursos (espai en disc, RAM, CPU). Clickhouse registra les dades més ràpidament. Clickhouse comprimeix les dades, fent que les dades del disc siguin encara més compactes. Els avantatges de Clickhouse són visibles en 2 diapositives de l'informe Com VK insereix dades a ClickHouse des de desenes de milers de servidors.

Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

Per veure les analítiques basades en els registres, crearem un tauler per a Grafana.

Tothom interessat, benvingut a cat.

Instal·leu nginx, grafana de la manera estàndard.

Instal·lació d'un clúster de clics mitjançant ansible-playbook de Denis Proskurin.

Creació de bases de dades i taules a Clickhouse

en aquest dossier Es descriuen les consultes SQL per crear bases de dades i taules per a nginx-log-collector a Clickhouse.

Fem cada sol·licitud una per una a cada servidor del clúster Clickhouse.

Nota important. En aquesta línia, logs_cluster s'ha de substituir pel nom del vostre clúster del fitxer clickhouse_remote_servers.xml entre "remote_servers" i "shard".

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

Instal·lació i configuració de nginx-log-collector-rpm

Nginx-log-collector no té un rpm. Aquí https://github.com/patsevanton/nginx-log-collector-rpm crear rpm per a això. rpm es compilarà amb Fedora Copr

Instal·leu el paquet 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

Editeu la configuració /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/

Configuració de nginx

Configuració general de 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;
}

Un amfitrió virtual:

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

Afegiu amfitrions virtuals al fitxer /etc/hosts:

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

Emulador de servidor HTTP

Com a emulador de servidor HTTP utilitzarem nodejs-stub-server d' Màxim Ignatenko

Nodejs-stub-server no té un rpm. Aquí https://github.com/patsevanton/nodejs-stub-server crear rpm per a això. rpm es compilarà amb Fedora Copr

Instal·leu el paquet nodejs-stub-server a nginx rpm amunt

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

Proves d'estrès

Realitzem proves amb Apache benchmark.

Instal·leu-lo:

yum install -y httpd-tools

Comencem a provar amb Apache benchmark de 5 servidors diferents:

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

Configuració de Grafana

No trobareu cap tauler al lloc web oficial de Grafana.

Per tant, ho farem a mà.

Podeu trobar el meu tauler de control desat aquí.

També heu de crear una variable de taula amb el contingut nginx.access_log.
Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

Sol·licituds totals de Singlestat:

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

Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

Sol·licituds fallides d'estat únic:

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

Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

Percentatge de fallades d'estat únic:

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

Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

Temps mitjà de resposta d'estat únic:

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

Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

Temps de resposta màxim de Singlestat:

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

Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

Estat del recompte:

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

Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

Per generar dades com un pastís, heu d'instal·lar el connector i reiniciar grafana.

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

Pie TOP 5 Estat:

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

Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

A més, donaré sol·licituds sense captures de pantalla:

Compte http_user_agent:

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

Taxa bona/Taxa dolenta:

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

Temps de resposta:

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

Temps de resposta aigües amunt (1r temps de resposta aigües amunt):

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

Estat del recompte de la taula per a tots els hosts virtuals:

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

Vista general del quadre de comandament

Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

Comparació de avg() i quantile()

mitjana ()
Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse
quantil()
Utilitat Nginx-log-collector d'Avito per enviar registres de nginx a Clickhouse

Conclusió:

Espero que la comunitat s'impliqui en el desenvolupament/prova i l'ús de nginx-log-collector.
I quan algú implementi nginx-log-collector, us dirà quant ha estalviat al disc, la memòria RAM i la CPU.

Canals de Telegram:

Mil·lisegons:

Per a qui importen els mil·lisegons, si us plau, escriviu o voteu-hi qüestió.

Font: www.habr.com

Afegeix comentari