Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Αυτό το άρθρο θα συζητήσει το έργο nginx-log-συλλέκτης, το οποίο θα διαβάζει τα αρχεία καταγραφής nginx και θα τα στέλνει στο σύμπλεγμα Clickhouse. Συνήθως το ElasticSearch χρησιμοποιείται για αρχεία καταγραφής. Το Clickhouse απαιτεί λιγότερους πόρους (χώρος στο δίσκο, RAM, CPU). Το Clickhouse καταγράφει τα δεδομένα πιο γρήγορα. Το Clickhouse συμπιέζει δεδομένα, καθιστώντας τα δεδομένα στο δίσκο ακόμα πιο συμπαγή. Τα πλεονεκτήματα του Clickhouse είναι ορατά σε 2 διαφάνειες από την αναφορά Πώς η VK εισάγει δεδομένα στο ClickHouse από δεκάδες χιλιάδες διακομιστές.

Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Για να προβάλετε αναλυτικά στοιχεία που βασίζονται σε αρχεία καταγραφής, θα δημιουργήσουμε έναν πίνακα ελέγχου για το Grafana.

Όποιος ενδιαφέρεται, καλώς ήρθε στο cat.

Εγκαταστήστε το nginx, grafana με τον τυπικό τρόπο.

Εγκατάσταση συμπλέγματος clickhouse χρησιμοποιώντας ansible-playbook από Ντένις Προσκούριν.

Δημιουργία βάσεων δεδομένων και πινάκων στο Clickhouse

σε αυτό το αρχείο Περιγράφονται ερωτήματα SQL για τη δημιουργία βάσεων δεδομένων και πινάκων για το nginx-log-collector στο Clickhouse.

Κάνουμε κάθε αίτημα ένα προς ένα σε κάθε διακομιστή στο σύμπλεγμα Clickhouse.

Σημαντική σημείωση. Σε αυτήν τη γραμμή, το logs_cluster πρέπει να αντικατασταθεί με το όνομα του συμπλέγματος από το αρχείο clickhouse_remote_servers.xml μεταξύ "remote_servers" και "shard".

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

Εγκατάσταση και διαμόρφωση του nginx-log-collector-rpm

Το Nginx-log-collector δεν έχει rpm. Εδώ https://github.com/patsevanton/nginx-log-collector-rpm δημιουργήστε στροφές ανά λεπτό για αυτό. rpm θα μεταγλωττιστεί χρησιμοποιώντας Fedora Copr

Εγκαταστήστε το πακέτο 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

Επεξεργαστείτε το config /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

Γενική διαμόρφωση 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;
}

Ένας εικονικός οικοδεσπότης:

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

Προσθέστε εικονικούς κεντρικούς υπολογιστές στο αρχείο /etc/hosts:

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

Εξομοιωτής διακομιστή HTTP

Ως εξομοιωτή διακομιστή HTTP θα χρησιμοποιήσουμε nodejs-stub-server από Μαξίμ Ιγκνατένκο

Ο Nodejs-stub-server δεν έχει rpm. Εδώ https://github.com/patsevanton/nodejs-stub-server δημιουργήστε στροφές ανά λεπτό για αυτό. rpm θα μεταγλωττιστεί χρησιμοποιώντας Fedora Copr

Εγκαταστήστε το πακέτο nodejs-stub-server σε upstream 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

Stress Testing

Πραγματοποιούμε δοκιμές χρησιμοποιώντας το Apache benchmark.

Εγκαταστήστε το:

yum install -y httpd-tools

Ξεκινάμε τη δοκιμή χρησιμοποιώντας το Apache benchmark από 5 διαφορετικούς διακομιστές:

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

Δεν θα βρείτε πίνακα ελέγχου στον επίσημο ιστότοπο της Grafana.

Επομένως, θα το κάνουμε με το χέρι.

Μπορείτε να βρείτε τον αποθηκευμένο μου πίνακα ελέγχου εδώ.

Πρέπει επίσης να δημιουργήσετε μια μεταβλητή πίνακα με τα περιεχόμενα nginx.access_log.
Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Συνολικά αιτήματα Singlestat:

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

Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Singlestat αποτυχημένα αιτήματα:

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

Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Ποσοστό αποτυχίας Singlestat:

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-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Μέσος χρόνος απόκρισης Singlestat:

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

Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Μέγιστος χρόνος απόκρισης Singlestat:

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

Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Κατάσταση καταμέτρησης:

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

Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Για να εξάγετε δεδομένα σαν πίτα, πρέπει να εγκαταστήσετε το πρόσθετο και να επανεκκινήσετε το grafana.

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

Κατάσταση Pie TOP 5:

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

Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Περαιτέρω θα δώσω αιτήματα χωρίς στιγμιότυπα οθόνης:

Μετρήστε 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

Χρόνος απόκρισης:

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

Χρόνος απόκρισης ανάντη (1ος χρόνος απόκρισης ανάντη):

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

Κατάσταση καταμέτρησης πίνακα για όλους τους vhost:

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

Γενική άποψη του ταμπλό

Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Σύγκριση του μέσου () και του quantile ()

μέσος ()
Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse
quantile()
Βοηθητικό πρόγραμμα Nginx-log-collector από την Avito για αποστολή αρχείων καταγραφής nginx στο Clickhouse

Συμπέρασμα:

Ελπίζω η κοινότητα να εμπλακεί στην ανάπτυξη/δοκιμή και χρήση του nginx-log-collector.
Και όταν κάποιος εφαρμόζει το nginx-log-collector, θα σας πει πόσο δίσκο, RAM και CPU εξοικονόμησε.

Κανάλια Telegram:

Χιλιοστά του δευτερολέπτου:

Για όσους έχουν σημασία τα χιλιοστά του δευτερολέπτου, γράψτε ή ψηφίστε σε αυτό ζήτημα.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο