In dit artikel wordt het project besproken , dat logboeken van nginx leest en deze naar een Clickhouse-cluster verzendt. Gewoonlijk worden ElasticSearch logboeken gebruikt. Clickhouse vereist minder middelen (schijfruimte, RAM, CPU). Clickhouse schrijft gegevens sneller. Clickhouse comprimeert gegevens, wat de gegevens op de schijf nog compacter maakt. De voordelen van Clickhouse zijn duidelijk zichtbaar aan de hand van 2 dia's uit de presentatie.


Om analytics voor de logboeken te bekijken, maken we een dashboard voor Grafana.
Voor wie geĆÆnteresseerd is, welkom onder de cut.
We installeren nginx en grafana op de gebruikelijke manier.
We installeren een Clickhouse-cluster met behulp van het ansible-playbook van .
Creatie van db en tabellen in Clickhouse
In dit staan de SQL-query's voor het maken van db en tabellen voor nginx-log-collector in Clickhouse beschreven.
Elke query voeren we ƩƩn voor ƩƩn uit op elke server van het Clickhouse-cluster.
Belangrijke opmerking. In deze regel moet logs_cluster worden vervangen door de naam van uw cluster uit het bestand clickhouse_remote_servers.xml tussen "remote_servers" en "shard".
ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())Installatie en configuratie van nginx-log-collector-rpm
Nginx-log-collector heeft geen rpm. Hier maken we een rpm. De rpm zal worden gebouwd met behulp van
We installeren het rpm-pakket 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-collectorWe passen de configuratie aan /etc/nginx-log-collector/config.yaml:
.......
upload:
table: nginx.access_log
dsn: http://ip-adres-van-clickhouse-cluster:8123/
- tag: "nginx_error:"
format: error # access | error
buffer_size: 1048576
upload:
table: nginx.error_log
dsn: http://ip-adres-van-clickhouse-cluster:8123/Configuratie van nginx
Algemene configuratie van 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;
}
Virtuele host ƩƩn:
vhost1.conf:
upstream backend {
server ip-adres-van-server-met-stub_http_server:8080;
server ip-adres-van-server-met-stub_http_server:8080;
server ip-adres-van-server-met-stub_http_server:8080;
server ip-adres-van-server-met-stub_http_server:8080;
server ip-adres-van-server-met-stub_http_server:8080;
}
server {
listen 80;
server_name vhost1;
location / {
proxy_pass http://backend;
}
}Voeg virtuele hosts toe aan het bestand /etc/hosts:
ip-adres-van-server-met-nginx vhost1HTTP-server emulator
We gaan gebruikmaken van een HTTP-server emulator: van
Nodejs-stub-server heeft geen rpm. Hier: maken we een rpm. De rpm zal worden gebouwd met behulp van
Installeer het rpm-pakket nodejs-stub-server op 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_serverBelastingstest
De test wordt uitgevoerd met behulp van Apache benchmark.
Installeer het:
yum install -y httpd-toolsStart de test met behulp van Apache benchmark vanaf 5 verschillende servers:
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; doneGrafana-configuratie
Op de officiƫle website van Grafana vindt u geen dashboard.
Daarom gaan we het handmatig doen.
Je kunt mijn opgeslagen dashboard vinden .
Je moet ook een variabele table maken met de inhoud nginx.access_log.

Singlestat Totale Verzoeken:
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter GROUP BY t
Singlestat Mislukte Verzoeken:
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t
Singlestat Mislukte Percentage:
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 Gemiddelde Reactietijd:
SELECT
1, avg(request_time) FROM $table
WHERE $timeFilter GROUP BY 1
Singlestat Maximale Reactietijd:
SELECT
1 as t, max(request_time) as c
FROM $table
WHERE $timeFilter GROUP BY t
Aantal Status:
$columns(status, count(*) as c) FROM $table
Voor het weergeven van gegevens als taart, moet je de plugin installeren en grafana herstarten.
grafana-cli plugins install grafana-piechart-panel
service grafana-server restartTaart TOP 5 Status:
SELECT
1,
status,
sum(status) AS Reqs
FROM $table
WHERE $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5
Hierna geef ik de queries zonder screenshots:
Aantal http_user_agent:
$columns(http_user_agent, count(*) c) FROM $tableGoede Ratio/Slechte Ratio:
$rate(countIf(status = 200) AS good, countIf(status != 200) AS bad) FROM $tableReactietiming:
$rate(avg(request_time) as request_time) FROM $tableUpstream reactietijd (reactietijd van 1 upstream):
$rate(avg(arrayElement(upstream_response_time,1)) as upstream_response_time) FROM $tableTabel Aantal Status voor alle vhosts:
$columns(status, count(*) as c) FROM $tableAlgemeen overzicht van het dashboard



Vergelijking avg() en quantile()
avg()

quantile()

Uitvoer:
Ik hoop dat de community zich aansluit bij de ontwikkeling/testen en het gebruik van nginx-log-collector.
En dat iemand, wanneer nginx-log-collector wordt geĆÆmplementeerd, zal vertellen hoeveel schijfruimte, RAM en CPU is bespaard.
Telegram-kanalen:
Milliseconden:
Voor wie milliseconden belangrijk zijn, schrijf alsjeblieft of stem in deze .
Bron: habr.com
