الأداة المساعدة Nginx-log-Collector من Avito لإرسال سجلات nginx إلى Clickhouse

هذه المقالة سوف تناقش المشروع جامع سجل nginx، التي ستقرأ سجلات nginx ، ترسلها إلى مجموعة Clickhouse. عادة ما يتم استخدام ElasticSearch للسجلات. يتطلب Clickhouse موارد أقل (مساحة القرص ، ذاكرة الوصول العشوائي ، وحدة المعالجة المركزية). Clickhouse يكتب البيانات بشكل أسرع. Clickhouse يضغط البيانات ، مما يجعل البيانات الموجودة على القرص أكثر ضغطًا. يمكن رؤية فوائد Clickhouse في شريحتين من التقرير كيف يُدرج VK البيانات في ClickHouse من عشرات الآلاف من الخوادم.

الأداة المساعدة Nginx-log-Collector من Avito لإرسال سجلات nginx إلى Clickhouse

الأداة المساعدة Nginx-log-Collector من Avito لإرسال سجلات nginx إلى Clickhouse

لعرض التحليلات من خلال السجلات ، دعنا ننشئ لوحة تحكم لـ Grafana.

من يهتم ، أهلا بك تحت القط.

قم بتثبيت nginx، grafana بالطريقة القياسية.

قم بتثبيت مجموعة clickhouse مع دليل التشغيل الثابت من دينيس بروسكورين.

إنشاء قاعدة بيانات وجداول في Clickhouse

في هذا ملف تم وصف استعلامات 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 إنشاء دورة في الدقيقة لذلك. rpm سيتم بناؤها باستخدام فيدورا كوبر

قم بتثبيت حزمة 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

تحرير config /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-server ليس لديه rpm. هنا https://github.com/patsevanton/nodejs-stub-server إنشاء دورة في الدقيقة لذلك. rpm سيتم بناؤها باستخدام فيدورا كوبر

قم بتثبيت حزمة 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

إجمالي الطلبات الفردية:

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

الأداة المساعدة Nginx-log-Collector من Avito لإرسال سجلات nginx إلى Clickhouse

الطلبات المنفردة الفاشلة:

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 Max:

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

حالة الفطيرة 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

حالة عدد الجدول لجميع vhosts:

$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

مقارنة المتوسط ​​() والكمية ()

متوسط ​​()
الأداة المساعدة Nginx-log-Collector من Avito لإرسال سجلات nginx إلى Clickhouse
كمية ()
الأداة المساعدة Nginx-log-Collector من Avito لإرسال سجلات nginx إلى Clickhouse

الخلاصة:

نأمل أن يشارك المجتمع في تطوير / اختبار واستخدام nginx-log-Collector.
وعندما يقوم شخص ما بتنفيذ nginx-log-Collector ، فسوف يخبرك عن مقدار ما وفره على القرص ، وذاكرة الوصول العشوائي ، ووحدة المعالجة المركزية.

قنوات Telegram:

ميلي ثانية:

من يهتم بالمللي ثانية ، اكتب أو صوت ، من فضلك ، في هذا قضية.

المصدر: www.habr.com

إضافة تعليق