Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

Энэ нийтлэлд төслийн талаар ярих болно nginx-лог цуглуулагч, энэ нь nginx бүртгэлийг уншиж, Clickhouse кластер руу илгээх болно. Ихэвчлэн ElasticSearch нь бүртгэлд ашиглагддаг. Clickhouse нь бага нөөц шаарддаг (дискний зай, RAM, CPU). Clickhouse нь өгөгдлийг илүү хурдан бүртгэдэг. Clickhouse нь өгөгдлийг шахаж, дискэн дээрх өгөгдлийг улам нягт болгодог. Clickhouse-ийн давуу талуудыг тайлангаас 2 слайдаас харж болно VK нь хэдэн арван мянган серверээс ClickHouse-д өгөгдлийг хэрхэн оруулдаг вэ.

Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

Лог дээр суурилсан аналитикийг үзэхийн тулд бид Grafana-д зориулсан хяналтын самбар үүсгэх болно.

Сонирхсон хүн мууранд тавтай морилно уу.

Nginx, grafana-г стандарт аргаар суулгаарай.

from ansible-playbook ашиглан clickhouse кластер суулгаж байна Денис Проскурин.

Clickhouse-д мэдээллийн сан, хүснэгт үүсгэх

Үүнд файл Clickhouse дахь nginx-log-collector-д зориулсан өгөгдлийн сан болон хүснэгт үүсгэх SQL асуулгыг тайлбарласан болно.

Бид Clickhouse кластерын сервер бүр дээр хүсэлт бүрийг нэг нэгээр нь хийдэг.

Чухал тэмдэглэл. Энэ мөрөнд logs_cluster-г "алсын_серверүүд" болон "хэсэг" хооронд clickhouse_remote_servers.xml файлаас өөрийн кластерын нэрээр солих шаардлагатай.

ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())

Nginx-log-collector-rpm суулгаж, тохируулж байна

Nginx-лог-коллекторт эргэлт байхгүй байна. Энд https://github.com/patsevanton/nginx-log-collector-rpm үүний тулд rpm үүсгэнэ үү. ашиглан rpm-ийг эмхэтгэнэ Fedora Copr

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

/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-сервер нь Максим Игнатенко

Nodejs-stub-серверт эргэлт байхгүй байна. Энд https://github.com/patsevanton/nodejs-stub-server үүний тулд rpm үүсгэнэ үү. ашиглан rpm-ийг эмхэтгэнэ Fedora Copr

upstream nginx rpm дээр 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_server

Стресс тест

Бид Apache бенчмарк ашиглан туршилт хийдэг.

Үүнийг суулгах:

yum install -y httpd-tools

Бид 5 өөр серверээс Apache бенчмарк ашиглан туршилт хийж эхэлдэг:

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.
Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

Нэг удаагийн нийт хүсэлт:

SELECT
 1 as t,
 count(*) as c
 FROM $table
 WHERE $timeFilter GROUP BY t

Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

Singlestat амжилтгүй болсон хүсэлтүүд:

SELECT
 1 as t,
 count(*) as c
 FROM $table
 WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t

Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

Нэг удаагийн бүтэлгүйтлийн хувь:

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

Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

Нэг удаагийн дундаж хариу өгөх хугацаа:

SELECT
 1, avg(request_time) FROM $table
 WHERE $timeFilter GROUP BY 1

Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

Хамгийн их хариу өгөх хугацаа:

SELECT
 1 as t, max(request_time) as c
 FROM $table
 WHERE $timeFilter GROUP BY t

Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

Тоолох төлөв:

$columns(status, count(*) as c) from $table

Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

Бялуу шиг өгөгдөл гаргахын тулд залгаасыг суулгаад графана-г дахин эхлүүлэх хэрэгтэй.

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

Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

Цаашид би дэлгэцийн зураггүйгээр хүсэлт гаргах болно:

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

Хяналтын самбарын ерөнхий дүр төрх

Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

avg() болон quantile()-ийн харьцуулалт

дундаж()
Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.
квантил()
Clickhouse руу nginx лог илгээх зориулалттай Avito-ийн Nginx-log-collector хэрэгсэл.

Дүгнэлт:

Нийгэмлэгүүд nginx-log-collector-ийг хөгжүүлэх/турших, ашиглахад оролцоно гэж найдаж байна.
Мөн хэн нэгэн нь nginx-log-collector-ийг хэрэгжүүлэхэд диск, RAM, CPU дээр хэр их хэмнэлт хийснээ хэлэх болно.

Telegram сувгууд:

Миллисекунд:

Миллисекунд хэнд чухал вэ гэвэл энэ хэсэгт бичнэ үү эсвэл саналаа өгнө үү асуудал.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх