ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

این مقاله در مورد پروژه بحث خواهد کرد nginx-log-collector، که لاگ های nginx را می خواند، آنها را به خوشه Clickhouse ارسال می کند. معمولاً ElasticSearch برای لاگ ها استفاده می شود. کلیک هاوس به منابع کمتری (فضای دیسک، RAM، CPU) نیاز دارد. Clickhouse داده ها را سریعتر می نویسد. Clickhouse داده ها را فشرده می کند، که داده های روی دیسک را حتی فشرده تر می کند. مزایای کلیک هاوس را می توان در 2 اسلاید از گزارش مشاهده کرد چگونه VK داده ها را از ده ها هزار سرور به ClickHouse وارد می کند.

ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

برای مشاهده تجزیه و تحلیل بر اساس گزارش، اجازه دهید یک داشبورد برای Grafana ایجاد کنیم.

چه کسی اهمیت می دهد، به زیر گربه خوش آمدید.

nginx، grafana را به روش استاندارد نصب کنید.

نصب cluster house with ansible-playbook from دنیس پروسکورین.

ایجاد پایگاه داده و جداول در کلیک هاوس

در این فایل پرس و جوهای SQL برای ایجاد پایگاه داده و جداول برای nginx-log-collector در Clickhouse شرح داده شده است.

ما هر درخواست را به نوبه خود در هر سرور از خوشه Clickhouse انجام می دهیم.

یادداشت مهم. در این خط، logs_cluster باید با نام خوشه شما از فایل clickhouse_remote_servers.xml بین "remote_servers" و "shard" جایگزین شود.

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

نصب و پیکربندی nginx-log-collector-rpm

Nginx-log-collector دور در دقیقه ندارد. اینجا https://github.com/patsevanton/nginx-log-collector-rpm دور در دقیقه برای آن ایجاد کنید. دور در دقیقه با استفاده از فدورا Copr

بسته rpm 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-server از ماکسیم ایگناتنکو

nodejs-stub-server rpm ندارد. اینجا https://github.com/patsevanton/nodejs-stub-server دور در دقیقه برای آن ایجاد کنید. دور در دقیقه با استفاده از فدورا Copr

بسته nodejs-stub-server را روی nginx rpm بالادست نصب کنید

yum -y install yum-plugin-copr
yum copr enable antonpatsev/nodejs-stub-server
yum -y install stub_http_server
systemctl start stub_http_server

تست استرس

تست با استفاده از معیار آپاچی انجام می شود.

نصبش کن:

yum install -y httpd-tools

ما آزمایش را با استفاده از معیار Apache از 5 سرور مختلف شروع می کنیم:

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

در وب سایت رسمی گرافانا داشبوردی پیدا نخواهید کرد.

بنابراین، ما این کار را با دست انجام خواهیم داد.

می توانید داشبورد ذخیره شده من را پیدا کنید اینجا.

همچنین باید یک متغیر جدول با محتوا ایجاد کنید nginx.access_log.
ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

مجموع درخواست های Singlestat:

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

ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

درخواست های شکست خورده Singlestat:

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

ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

درصد شکست Singlestat:

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

ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

میانگین زمان پاسخ Singlestat:

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

ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

حداکثر زمان پاسخگویی Singlestat:

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

ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

وضعیت شمارش:

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

ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

برای خروجی داده‌هایی مانند پای، باید افزونه را نصب کرده و grafana را مجدداً بارگذاری کنید.

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

ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

علاوه بر این، بدون اسکرین شات درخواست می دهم:

تعداد 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

زمان پاسخ دهی بالادست (زمان پاسخ دهی اول بالادست):

$rate(avg(arrayElement(upstream_response_time,1)) as upstream_response_time) FROM $table

وضعیت تعداد جدول برای همه vhost ها:

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

نمای کلی داشبورد

ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

مقایسه میانگین() و quantile()

avg()
ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse
quantile()
ابزار Nginx-log-collector از Avito برای ارسال لاگ های nginx به Clickhouse

نتیجه گیری:

امیدواریم جامعه در توسعه/تست و استفاده از nginx-log-collector مشارکت کند.
و وقتی کسی nginx-log-collector را پیاده سازی می کند، به شما خواهد گفت که چقدر دیسک، رم، CPU ذخیره کرده است.

کانال های تلگرام:

میلی ثانیه:

کسی که به میلی ثانیه اهمیت می دهد، بنویسد یا رأی بدهد، لطفاً در این موضوع.

منبع: www.habr.com

اضافه کردن نظر