Denna artikel kommer att behandla projektet , som kommer att lÀsa nginx-loggar och skicka dem till Clickhouse-klustret. Oftast anvÀnds ElasticSearch för loggar. Clickhouse krÀver fÀrre resurser (diskutrymme, RAM, CPU). Clickhouse skriver data snabbare. Clickhouse komprimerar data, vilket gör att datan pÄ disken blir Ànnu mer komprimerad. Fördelarna med Clickhouse syns i de tvÄ bilderna frÄn presentationen


För att se analysen av loggarna kommer vi att skapa en instrumentpanel för Grafana.
Den som Àr intresserad Àr vÀlkommen att lÀsa vidare.
Vi installerar nginx och grafana pÄ standard sÀtt.
Vi installerar Clickhouse-klustret med hjÀlp av ansible-playbook frÄn .
Skapande av databas och tabeller i Clickhouse
I den hÀr beskrivs SQL-frÄgor för att skapa databas och tabeller för nginx-log-collector i Clickhouse.
Vi kör varje frÄga sekventiellt pÄ varje server i Clickhouse-klustret.
Viktig notering. I denna rad mÄste logs_cluster ersÀttas med ert klusternamn frÄn filen clickhouse_remote_servers.xml mellan "remote_servers" och "shard".
ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())Installation och konfiguration av nginx-log-collector-rpm
Nginx-log-collector har ingen rpm. HÀr skapar vi en rpm för den. RPM kommer att byggas med hjÀlp av
Vi installerar rpm-paketet 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 redigerar konfigurationsfilen /etc/nginx-log-collector/config.yaml:
.......
upload:
table: nginx.access_log
dsn: http://ip-adress-kluster-clickhouse:8123/
- tag: "nginx_error:"
format: error # access | error
buffer_size: 1048576
upload:
table: nginx.error_log
dsn: http://ip-adress-kluster-clickhouse:8123/Konfiguration av nginx
Generell konfiguration av 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;
}
Virtuell vÀrd en:
vhost1.conf:
upstream backend {
server server-ip-address-with-stub_http_server:8080;
server server-ip-address-with-stub_http_server:8080;
server server-ip-address-with-stub_http_server:8080;
server server-ip-address-with-stub_http_server:8080;
server server-ip-address-with-stub_http_server:8080;
}
server {
listen 80;
server_name vhost1;
location / {
proxy_pass http://backend;
}
}LÀgg till virtuella vÀrdar i filen /etc/hosts:
server-ip-address-with-nginx vhost1HTTP server emulator
Som HTTP server emulator kommer vi att anvÀnda frÄn
Nodejs-stub-server har inget rpm. HÀr skapar vi en rpm för den. RPM kommer att byggas med hjÀlp av
Installerar nodejs-stub-server rpm paket 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_serverBelastningstestning
Testningen utförs med hjÀlp av Apache benchmark.
Vi installerar det:
yum install -y httpd-toolsVi startar testningen med hjÀlp av Apache benchmark frÄn 5 olika servrar:
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 konfiguration
PĂ„ Grafanas officiella webbplats hittar du ingen dashboard.
DÀrför kommer vi att göra det manuellt.
Min sparade instrumentpanel kan du hitta .
Du behöver ocksÄ skapa en variabel table med innehÄllet nginx.access_log.

Singlestat Totala FörfrÄgningar:
VĂLJ
1 som t,
count(*) som c
FRĂ
N $table
DĂR $timeFilter GRUPPERA EFTER t
Singlestat Misslyckade FörfrÄgningar:
VĂLJ
1 som t,
count(*) som c
FRĂ
N $table
DĂR $timeFilter OCH status INTE I (200, 201, 401) GRUPPERA EFTER t
Singlestat Misslyckande Andel:
VĂLJ
1 som t, (sum(status = 500 eller status = 499) / sum(status = 200 eller status = 201 eller status = 401)) * 100 FRĂ
N $table
DĂR $timeFilter GRUPPERA EFTER t
Singlestat Genomsnittlig Svarstid:
VĂLJ
1, avg(request_time) FRĂ
N $table
DĂR $timeFilter GRUPPERA EFTER 1
Singlestat Max Svarstid:
VĂLJ
1 som t, max(request_time) som c
FRĂ
N $table
DĂR $timeFilter GRUPPERA EFTER t
RĂ€kna Status:
$columns(status, count(*) som c) FRĂ
N $table
För att visa data som ett cirkeldiagram, mÄste du installera pluginet och starta om grafana.
grafana-cli plugins installera grafana-piechart-panel
service grafana-server starta omCirkeldiagram Topp 5 Status:
VĂLJ
1,
status,
sum(status) AS Reqs
FRĂ
N $table
DĂR $timeFilter
GRUPPERA EFTER status
ORDNA EFTER Reqs desc
BEGRĂNSA 5
Vidare kommer jag att ge förfrÄgningar utan skÀrmbilder:
RĂ€kna http_user_agent:
$columns(http_user_agent, count(*) c) FRĂ
N $tableBra Rate/DÄlig Rate:
$rate(countIf(status = 200) AS good, countIf(status != 200) AS bad) FRĂ
N $tableSvarstider:
$rate(avg(request_time) som request_time) FRĂ
N $tableUpstream svarstid (svarstid frÄn första upstream):
$rate(avg(arrayElement(upstream_response_time, 1)) som upstream_response_time) FRĂ
N $tableTabell RÀkna Status för alla vhost:
$columns(status, count(*) som c) FRĂ
N $tableĂversikt av instrumentpanelen



JÀmförelse avg() och quantile()
avg()

quantile()

Slutsats:
Jag hoppas att gemenskapen kommer att engagera sig i utveckling/testning och anvÀndning av nginx-log-collector.
Och nÄgon som implementerar nginx-log-collector kommer att berÀtta hur mycket de har sparat i disk, RAM, CPU.
Telegram-kanaler:
Millisekunder:
Om millisekunder Àr viktiga för dig, skriv eller rösta gÀrna i detta .
KĂ€lla: habr.com
