Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Selles artiklis käsitletakse projekti nginx-log-collector, mis loeb nginx logisid ja saadab need Clickhouse'i klastrisse. Tavajuhul kasutatakse logide jaoks ElasticSearch'i. Clickhouse nõuab vähem ressursse (kettaruumi, RAM-i, CPU-d). Clickhouse kirjutab andmeid kiiremini. Clickhouse tihendab andmeid, mis muudab andmed kettal veel kompaktsel kujul. Clickhouse'i eelised on nähtavad kahest slaidist esitluses. Kuidas VK edastab andmeid ClickHouse'i kümnetelt tuhandelt serverilt.

Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Logide analüütika vaatamiseks loome Grafanale armatuurlaua.

Kellele huvi pakub, tulge allapoole.

Paigaldame nginx, grafana tavalisel viisil.

Paigaldame Clickhouse'i klastrit kasutades Deniss Proskurini ansible-playbook'i. Deniss Proskurin.

Andmebaasi ja tabelite loomine Clickhouse'is

Selles failis on toodud SQL päringud andmebaasi ja tabelite loomiseks nginx-log-collector'i jaoks Clickhouse'is.

Teeme iga päringu järjestikulised igas Clickhouse'i klastris asuvates serverites.

Oluline märkus. Sel real logs_cluster tuleb asendada teie klastrinimega failis clickhouse_remote_servers.xml "remote_servers" ja "shard" vahel.

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

Nginx-log-collector-rpm paigaldamine ja seadistamine

Nginx-log-collector'il ei ole rpm-i. Siin https://github.com/patsevanton/nginx-log-collector-rpm loome sellele rpm-i. RPM koostatakse Fedora Copr abil.

Paigaldame nginx-log-collector-rpm paketi

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

Parandame konfiguratsiooni /etc/nginx-log-collector/config.yaml:

  .......
  upload:
    table: nginx.access_log
    dsn: http://klaster-clickhouse-ip:8123/

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

Nginx'i seadistamine

Üldine nginx 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;
}

Virtuaalne host number üks:

vhost1.conf:

upstream backend {
    server ip-aadress-teenuse-serveriga-stub_http_server:8080;
    server ip-aadress-teenuse-serveriga-stub_http_server:8080;
    server ip-aadress-teenuse-serveriga-stub_http_server:8080;
    server ip-aadress-teenuse-serveriga-stub_http_server:8080;
    server ip-aadress-teenuse-serveriga-stub_http_server:8080;
}

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

Lisame failile /etc/hosts virtuaalsed hostid:

ip-aadress-teenuse-serveriga-nginx vhost1

HTTP teenuse emulaator

Emulaatorina kasutame HTTP teenust nodejs-stub-server alates Maxim Ignatenko

Nodejs-stub-server ei sisalda rpm-paketti. Siin https://github.com/patsevanton/nodejs-stub-server loome sellele rpm-i. RPM koostatakse Fedora Copr abil.

Installime upstream nginx jaoks rpm paketti nodejs-stub-server

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

Koormuse testimine

Testimine toimub Apache benchmark'iga.

Installime selle:

yum install -y httpd-tools

Alustame testimist Apache benchmark'iga 5 erinevalt serverilt:

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 seadistus

Grafana ametlikul veebilehel te ei leia armatuurlauda.

Seetõttu loome selle käsitsi.

Teie salvestatud juhtpaneel asub siin siit.

Samuti peate looma muutuja table sisu jaoks nginx.access_log.
Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Ühe kordse staatuse kokkuvõte:

VALI
 1 kui t,
 count(*) kui c
 $table-st
 KUS $timeFilter GRUPPEERI t järgi

Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Ühe kordse ebaõnnestumise kokkuvõte:

VALI
 1 kui t,
 count(*) kui c
 $table-st
 KUS $timeFilter JA staatuse KUIDAS ON (200, 201, 401) GRUPPEERI t järgi

Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Ühe kordse ebaõnnestumise protsent:

VALI
 1 kui t, (sum(status = 500 või status = 499) / sum(status = 200 või status = 201 või status = 401)) * 100 FROM $table
 KUS $timeFilter GRUPPEERI t järgi

Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Ühe kordse keskmise vastuse aeg:

VALI
 1, avg(request_time) FROM $table
 KUS $timeFilter GRUPPEERI 1 järgi

Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Ühe kordse maksimaalse vastuse aeg:

VALI
 1 kui t, max(request_time) kui c
 $table-st
 KUS $timeFilter GRUPPEERI t järgi

Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Seisundi arv:

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

Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Andmete kuvamiseks nagu pirukas, peate installima pistiku ja taaskäivitama grafana.

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

Piruka TOP 5 seisund:

VALI
    1, 
    /* vale ajatempli väärtus */
    status,
    sum(status) KUI Reqs
FROM $table
KUS $timeFilter
GRUPPEERI staatuse järgi
KORRALDA Reqs languses
PIIRANG 5

Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Edasi toome päringud ilma ekraanipiltideta:

http_user_agent arvu:

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

Hea hind / halb hind:

$rate(countIf(status = 200) KUI hea, countIf(status != 200) KUI halb) FROM $table

Vastuse ajastus:

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

Ülemine vastuse aeg (1. ülemine vastus):

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

Tabeli seisundi arv kõigi vhostide jaoks:

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

Üksikasjalik juhtpaneel

Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Avg() ja quantile() võrdlemine

avg()
Nginx-log-collector on Avito logide edastamiseks Clickhouse'i
quantile()
Nginx-log-collector on Avito logide edastamiseks Clickhouse'i

Kokkuvõte:

Loodan, et kogukond liitub nginx-log-collector arendamise/töötamise ja kasutamisega.
Ja keegi, kes rakendab nginx-log-collector, räägib, kui palju kettaruumi, RAM-i ja CPU-d kokku hoiti.

Telegrami kanalid:

Millisekundid:

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

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster