I denne artikel vil projektet blive gennemgået , som vil læse logs fra nginx og sende dem til Clickhouse-klyngen. Normalt bruges ElasticSearch til logs. Clickhouse kræver færre ressourcer (diskplads, RAM, CPU). Clickhouse skriver data hurtigere. Clickhouse komprimerer data, hvilket gør dataene på disken endnu mere kompakte. Fordelene ved Clickhouse kan ses i 2 slides fra præsentationen


For at se analytik om logs vil vi oprette et dashboard til Grafana.
De, der er interesseret, er velkomne til at læse videre.
Vi installerer nginx, grafana på den sædvanlige måde.
Vi installerer en Clickhouse-klynge ved hjælp af ansible-playbook fra .
Oprettelse af database og tabeller i Clickhouse
I denne beskrives SQL-forespørgslerne til oprettelse af database og tabeller for nginx-log-collector i Clickhouse.
Hver forespørgsel udføres sekventielt på hver server i Clickhouse-klyngen.
Vigtigt bemærkning. I denne linje skal logs_cluster ændres til dit klyngenavn fra filen clickhouse_remote_servers.xml mellem "remote_servers" og "shard".
ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())Installation og konfiguration af nginx-log-collector-rpm
Nginx-log-collector har ikke en rpm. Her opretter vi en rpm for det. RPM'en vil blive bygget ved hjælp af
Installerer rpm-pakken 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-collectorVi retter konfigurationsfilen /etc/nginx-log-collector/config.yaml:
.......
upload:
table: nginx.access_log
dsn: http://ip-adressen-til-clickhouse-klyngen:8123/
- tag: "nginx_error:"
format: error # access | error
buffer_size: 1048576
upload:
table: nginx.error_log
dsn: http://ip-adressen-til-clickhouse-klyngen:8123/Konfiguration af nginx
Den samlede nginx-konfiguration:
bruger 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;
}
Virtuel vært én:
vhost1.conf:
upstream backend {
server ip-adresse-på-server-med-stub_http_server:8080;
server ip-adresse-på-server-med-stub_http_server:8080;
server ip-adresse-på-server-med-stub_http_server:8080;
server ip-adresse-på-server-med-stub_http_server:8080;
server ip-adresse-på-server-med-stub_http_server:8080;
}
server {
listen 80;
server_name vhost1;
location / {
proxy_pass http://backend;
}
}Tilføj virtuelle værter til filen /etc/hosts:
ip-adresse-på-server-med-nginx vhost1HTTP server emulator
Som HTTP server emulator vil vi bruge fra
Nodejs-stub-server har ikke rpm. Her opretter vi en rpm for det. RPM'en vil blive bygget ved hjælp af
Installerer nodejs-stub-server rpm-pakken på upstream nginx
yum -y install yum-plugin-copr
yum copr enable antonpatsev/nodejs-stub-server
yum -y install stub_http_server
systemctl start stub_http_serverBelastningstest
Testen udføres ved hjælp af Apache benchmark.
Installerer det:
yum install -y httpd-toolsStarter testningen med Apache benchmark fra 5 forskellige servere:
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; doneKonfiguration af Grafana
På den officielle Grafana hjemmeside finder du ikke dashboardet.
Derfor vil vi gøre det manuelt.
Du kan finde mit gemte dashboard .
Du skal også oprette en variabel table med indholdet nginx.access_log.

Singlestat Totale Anmodninger:
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter GROUP BY t
Singlestat Mislykkede Anmodninger:
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t
Singlestat Fejlprocent:
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 Gennemsnitlig svartid:
SELECT
1, avg(request_time) FROM $table
WHERE $timeFilter GROUP BY 1
Singlestat Maksimal svartid:
SELECT
1 as t, max(request_time) as c
FROM $table
WHERE $timeFilter GROUP BY t
Tæl Status:
$columns(status, count(*) as c) from $table
For at vise data som et cirkeldiagram, skal du installere et plugin og genstarte grafana.
grafana-cli plugins install grafana-piechart-panel
service grafana-server restartCirkeldiagram TOP 5 Status:
SELECT
1,
status,
sum(status) AS Reqs
FROM $table
WHERE $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5
Herefter vil jeg præsentere forespørgsler uden skærmbilleder:
Tæl http_user_agent:
$columns(http_user_agent, count(*) c) FROM $tableGodRate/DårligRate:
$rate(countIf(status = 200) AS good, countIf(status != 200) AS bad) FROM $tableSvar Timing:
$rate(avg(request_time) as request_time) FROM $tableUpstream svartid (tid til første upstream svar):
$rate(avg(arrayElement(upstream_response_time,1)) as upstream_response_time) FROM $tableTabel Tæl Status for alle vhost:
$columns(status, count(*) as c) from $tableGenerelt dashboard layout



Sammenligning af avg() og quantile()
avg()

quantile()

Output:
Jeg håber, at samfundet vil deltage i udvikling/testing og brugen af nginx-log-collector.
Og at nogen, når de implementerer nginx-log-collector, vil fortælle hvor meget disk, RAM, CPU de har sparet.
Telegram kanaler:
Millisekunder:
For dem, der værdsætter millisekunder, skriv eller stem venligst på dette .
Kilde: habr.com
