Selles artiklis käsitletakse projekti , mis loeb nginx logisid ja saadab need Clickhouse'i klastrisse. Tavajuhul kasutatakse logide jaoks ElasticSearch'i. Clickhouse nõuab vähem ressursse (kettaruumi, RAM-i, CPU-d). Clickhouse kirjutab andmeid kiiremini. Clickhouse tihendab andmeid, mis muudab andmed kettal veel kompaktsel kujul. Clickhouse'i eelised on nähtavad kahest slaidist esitluses.


Logide analüütika vaatamiseks loome Grafanale armatuurlaua.
Kellele huvi pakub, tulge allapoole.
Paigaldame nginx, grafana tavalisel viisil.
Paigaldame Clickhouse'i klastrit kasutades Deniss Proskurini ansible-playbook'i. .
Andmebaasi ja tabelite loomine Clickhouse'is
Selles on toodud SQL päringud andmebaasi ja tabelite loomiseks nginx-log-collector'i jaoks Clickhouse'is.
Teeme iga päringu järjestikulised igas Clickhouse'i klastris asuvates serverites.
Oluline märkus. Sel real logs_cluster tuleb asendada teie klastrinimega failis clickhouse_remote_servers.xml "remote_servers" ja "shard" vahel.
ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())Nginx-log-collector-rpm paigaldamine ja seadistamine
Nginx-log-collector'il ei ole rpm-i. Siin loome sellele rpm-i. RPM koostatakse
Paigaldame nginx-log-collector-rpm paketi
yum -y install yum-plugin-copr
yum copr enable antonpatsev/nginx-log-collector-rpm
yum -y install nginx-log-collector
systemctl start nginx-log-collectorParandame konfiguratsiooni /etc/nginx-log-collector/config.yaml:
.......
upload:
table: nginx.access_log
dsn: http://klaster-clickhouse-ip:8123/
- tag: "nginx_error:"
format: error # access | error
buffer_size: 1048576
upload:
table: nginx.error_log
dsn: http://klaster-clickhouse-ip:8123/Nginx'i seadistamine
Üldine nginx konfiguratsioon:
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;
}
Virtuaalne host number üks:
vhost1.conf:
upstream backend {
server ip-aadress-teenuse-serveriga-stub_http_server:8080;
server ip-aadress-teenuse-serveriga-stub_http_server:8080;
server ip-aadress-teenuse-serveriga-stub_http_server:8080;
server ip-aadress-teenuse-serveriga-stub_http_server:8080;
server ip-aadress-teenuse-serveriga-stub_http_server:8080;
}
server {
listen 80;
server_name vhost1;
location / {
proxy_pass http://backend;
}
}Lisame failile /etc/hosts virtuaalsed hostid:
ip-aadress-teenuse-serveriga-nginx vhost1HTTP teenuse emulaator
Emulaatorina kasutame HTTP teenust alates
Nodejs-stub-server ei sisalda rpm-paketti. Siin loome sellele rpm-i. RPM koostatakse
Installime upstream nginx jaoks rpm paketti nodejs-stub-server
yum -y install yum-plugin-copr
yum copr enable antonpatsev/nodejs-stub-server
yum -y install stub_http_server
systemctl start stub_http_serverKoormuse testimine
Testimine toimub Apache benchmark'iga.
Installime selle:
yum install -y httpd-toolsAlustame testimist Apache benchmark'iga 5 erinevalt serverilt:
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 seadistus
Grafana ametlikul veebilehel te ei leia armatuurlauda.
Seetõttu loome selle käsitsi.
Teie salvestatud juhtpaneel asub siin .
Samuti peate looma muutuja table sisu jaoks nginx.access_log.

Ühe kordse staatuse kokkuvõte:
VALI
1 kui t,
count(*) kui c
$table-st
KUS $timeFilter GRUPPEERI t järgi
Ühe kordse ebaõnnestumise kokkuvõte:
VALI
1 kui t,
count(*) kui c
$table-st
KUS $timeFilter JA staatuse KUIDAS ON (200, 201, 401) GRUPPEERI t järgi
Ühe kordse ebaõnnestumise protsent:
VALI
1 kui t, (sum(status = 500 või status = 499) / sum(status = 200 või status = 201 või status = 401)) * 100 FROM $table
KUS $timeFilter GRUPPEERI t järgi
Ühe kordse keskmise vastuse aeg:
VALI
1, avg(request_time) FROM $table
KUS $timeFilter GRUPPEERI 1 järgi
Ühe kordse maksimaalse vastuse aeg:
VALI
1 kui t, max(request_time) kui c
$table-st
KUS $timeFilter GRUPPEERI t järgi
Seisundi arv:
$columns(status, count(*) kui c) FROM $table
Andmete kuvamiseks nagu pirukas, peate installima pistiku ja taaskäivitama grafana.
grafana-cli plugins install grafana-piechart-panel
service grafana-server restartPiruka TOP 5 seisund:
VALI
1,
/* vale ajatempli väärtus */
status,
sum(status) KUI Reqs
FROM $table
KUS $timeFilter
GRUPPEERI staatuse järgi
KORRALDA Reqs languses
PIIRANG 5
Edasi toome päringud ilma ekraanipiltideta:
http_user_agent arvu:
$columns(http_user_agent, count(*) c) FROM $tableHea hind / halb hind:
$rate(countIf(status = 200) KUI hea, countIf(status != 200) KUI halb) FROM $tableVastuse ajastus:
$rate(avg(request_time) kui request_time) FROM $tableÜlemine vastuse aeg (1. ülemine vastus):
$rate(avg(arrayElement(upstream_response_time,1)) kui upstream_response_time) FROM $tableTabeli seisundi arv kõigi vhostide jaoks:
$columns(status, count(*) kui c) FROM $tableÜksikasjalik juhtpaneel



Avg() ja quantile() võrdlemine
avg()

quantile()

Kokkuvõte:
Loodan, et kogukond liitub nginx-log-collector arendamise/töötamise ja kasutamisega.
Ja keegi, kes rakendab nginx-log-collector, räägib, kui palju kettaruumi, RAM-i ja CPU-d kokku hoiti.
Telegrami kanalid:
Millisekundid:
Kellele on millisekundid olulised, kirjutage või hääletage palun siin .
Allikas: habr.com
