Αυτό το άρθρο θα συζητήσει το έργο
Για να προβάλετε αναλυτικά στοιχεία που βασίζονται σε αρχεία καταγραφής, θα δημιουργήσουμε έναν πίνακα ελέγχου για το Grafana.
Όποιος ενδιαφέρεται, καλώς ήρθε στο cat.
Εγκαταστήστε το nginx, grafana με τον τυπικό τρόπο.
Εγκατάσταση συμπλέγματος clickhouse χρησιμοποιώντας ansible-playbook από
Δημιουργία βάσεων δεδομένων και πινάκων στο 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. Εδώ
Εγκαταστήστε το πακέτο 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 δεν έχει rpm. Εδώ
Εγκαταστήστε το πακέτο 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
.
Συνολικά αιτήματα Singlestat:
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter GROUP BY t
Singlestat αποτυχημένα αιτήματα:
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t
Ποσοστό αποτυχίας 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
Μέσος χρόνος απόκρισης Singlestat:
SELECT
1, avg(request_time) FROM $table
WHERE $timeFilter GROUP BY 1
Μέγιστος χρόνος απόκρισης Singlestat:
SELECT
1 as t, max(request_time) as c
FROM $table
WHERE $timeFilter GROUP BY t
Κατάσταση καταμέτρησης:
$columns(status, count(*) as c) from $table
Για να εξάγετε δεδομένα σαν πίτα, πρέπει να εγκαταστήσετε το πρόσθετο και να επανεκκινήσετε το 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
Περαιτέρω θα δώσω αιτήματα χωρίς στιγμιότυπα οθόνης:
Μετρήστε 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
Γενική άποψη του ταμπλό
Σύγκριση του μέσου () και του quantile ()
μέσος ()
quantile()
Συμπέρασμα:
Ελπίζω η κοινότητα να εμπλακεί στην ανάπτυξη/δοκιμή και χρήση του nginx-log-collector.
Και όταν κάποιος εφαρμόζει το nginx-log-collector, θα σας πει πόσο δίσκο, RAM και CPU εξοικονόμησε.
Κανάλια Telegram:
Χιλιοστά του δευτερολέπτου:
Για όσους έχουν σημασία τα χιλιοστά του δευτερολέπτου, γράψτε ή ψηφίστε σε αυτό
Πηγή: www.habr.com