Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Selles artiklis räägitakse projektist nginx-log-collector, mis loeb nginx logisid ja saadab need Clickhouse'i klastrisse. Tavaliselt kasutatakse logide jaoks ElasticSearchi. Clickhouse'i jaoks on vaja vähem ressursse (ketta ruumi, RAM-i, CPU-d). Clickhouse kirjutab andmeid kiiremini. Clickhouse tihendab andmeid, mis muudab andmed kettal veel kompaktsemaks. Clickhouse'i eelised on nähtavad kahel selle esitluse slaidil. Kuidas VK sisestab andmeid ClickHouse'i kümnetelt tuhandelt serverilt.

Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Logide analüütika vaatamiseks loome Grafana jaoks juhtpaneeli.

Kellele see huvi pakub, olete teretulnud lugema edasi.

Installime nginx ja grafana standardmeetodil.

Installime Clickhouse'i klastrit ansible-playbooki abil, mida on koostanud Denis Proskurin.

Andmebaasi ja tabelite loomine Clickhouse'is

Selles failis on kirjeldatud SQL-küsimused andmebaasi ja tabelite loomiseks nginx-log-collector'i jaoks Clickhouse'is.

Iga päring teeme kordamööda iga serveri jaoks Clickhouse'i klastri kaupa.

Oluline märkus. Selles reas tuleb logs_cluster asendada teie klastrinimega failis clickhouse_remote_servers.xml sõnade "remote_servers" ja "shard" vahel.

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

Nginx-log-collector'i rpm-i installimine ja seadistamine

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

Paigaldame rpm paketi 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

Muutame 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/

nginx seadistus

Üksikasjalik nginx konfigureerimine:

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 üks:

vhost1.conf:

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

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

Lisame faili /etc/hosts virtuaalsed hostid:

ip-aadress-serveri-nginx vhost1

HTTP serveri emulaator

Kuna HTTP serveri emulaatorina kasutame nodejs-stub-server alates Maxim Ignatenko

Nodejs-stub-server'il ei ole rpm. Siin https://github.com/patsevanton/nodejs-stub-server loome tale rpm. RPM koguneb abil Fedora Copr

Paigaldame upstream nginx rpm paketi 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

Koormustestimine

Testime Apache benchmarki abil.

Paigaldame selle:

yum install -y httpd-tools

Alustame testimist Apache benchmarkiga 5 erinevast serverist:

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

Grafana ametlikul veebilehel ei leia te juhtpaneeli.

Seega teeme seda käsitsi.

Minu salvestatud armatuurlauda leiate siin.

Samuti peate looma muutuja table sisuga nginx.access_log.
Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Singlestat Kokkuvõttes Päringud:

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

Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Singlestat Ebaõnnestunud Päringud:

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

Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Singlestat Ebaregulaarsete 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

Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Singlestat Keskmine Vastamisaeg:

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

Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Singlestat Maksimaalne Vastamisaeg:

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

Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Loenduse Oleku:

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

Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Andmete kuvamiseks kui pirukaks, tuleb installida plugina ning taaskäivitada grafana.

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

Piruka TOP 5 Oleku:

SELECT
    1, /* vale ajamärk */
    status,
    sum(status) AS Reqs
FROM $table
WHERE $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5

Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Edasi toodan päringud ilma ekraanipiltideta:

Loenda http_user_agent:

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

HeaMäär/EbaMäär:

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

Vastamise Aeg:

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

Proovin aega (esimese upstreami vastamise aeg):

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

Tabel Loenduse Oleku kõigi vhostide jaoks:

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

Ülevaade armatuurlaud

Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Keskmise ja kvantiilide võrdlemine

avg()
Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i
quantile()
Nginx-logi-kogumise utiliit Avitolt, et saata Nginxi logisid Clickhouse'i

Väljund:

Loodan, et kogukond liitub nginx-log-collectori arendamise, testimise ja kasutamisega.
Ja keegi, kes implementeerib nginx-log-collectori, räägib, kui palju kõvakettaruumi, RAM-i ja CPU-d kokku hoiti.

Telegrami kanalid:

Millisekundid:

Kes peab millisekundeid oluliseks, palun kirjutage või hääletage selle eest. probleem.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster