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


لعرض تحليلات السجل ، أنشئ لوحة معلومات لـ Grafana.
من يهتم ، مرحبا بكم في القط.
تثبيت nginx ، grafana بالطريقة القياسية.
قم بتثبيت مجموعة clickhouse باستخدام ansible-playbook بواسطة Denis Proskurin .
إنشاء قواعد البيانات والجداول في Clickhouse
يصف هذا الملف استعلامات SQL لإنشاء قواعد البيانات والجداول لجامع سجل nginx في 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 لذلك. سيتم جمع دورة في الدقيقة باستخدام Fedora 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
قم بتحرير 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;
المضيف الظاهري هو واحد:
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 من Maxim Ignatenko
لا يحتوي Nodejs-stub-server على عدد دورات في الدقيقة. هنا https://github.com/patsevanton/nodejs-stub-server إنشاء دورة في الدقيقة لذلك. سيتم جمع دورة في الدقيقة باستخدام Fedora 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
اختبار الحمل
تم الاختبار باستخدام معيار Apache.
تثبيته:
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
.

إجمالي طلبات Singlestat:
SELECT 1 as t, count(*) as c FROM $table WHERE $timeFilter GROUP BY t

طلبات Singlestat الفاشلة:
SELECT 1 as t, count(*) as c FROM $table WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t

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

Singlestat متوسط وقت الاستجابة:
SELECT 1, avg(request_time) FROM $table WHERE $timeFilter GROUP BY 1

وقت استجابة Singlestat Max:
SELECT 1 as t, max(request_time) as c FROM $table WHERE $timeFilter GROUP BY t

حالة العد:
$columns(status, count(*) as c) from $table

لإخراج البيانات كفطيرة ، تحتاج إلى تثبيت المكون الإضافي وإعادة تشغيل grafana.
grafana-cli plugins install grafana-piechart-panel service grafana-server restart
فطيرة TOP 5
SELECT 1, status, sum(status) AS Reqs FROM $table WHERE $timeFilter GROUP BY status ORDER BY Reqs desc LIMIT 5

علاوة على ذلك ، سأقدم طلبات بدون لقطات شاشة:
عد 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.
وسيخبرك شخص ما ، عندما ينفذ أداة تجميع سجل nginx ، كم أنقذ القرص وذاكرة الوصول العشوائي ووحدة المعالجة المركزية.
قنوات البرق
مللي ثانية:
إلى من يهم ميلي ثانية ، اكتب أو صوت ، من فضلك ، في هذه المسألة .