ايويٽو کان نينڪس-لاگ-ڪليڪٽر يوٽيليٽي nginx لاگ موڪلڻ لاءِ Clickhouse ڏانهن

هي مضمون هن منصوبي تي بحث ڪندو nginx-log-ڪليڪٽر، جيڪو nginx لاگ پڙهندو ۽ انهن کي ڪلڪ هائوس ڪلستر ڏانهن موڪليندو. عام طور تي ElasticSearch لاگن لاءِ استعمال ٿيندو آهي. ڪلڪ هائوس کي گهٽ وسيلن جي ضرورت آهي (ڊسڪ اسپيس، رام، سي پي يو). ڪلڪ هائوس ڊيٽا تيزيءَ سان رڪارڊ ڪري ٿو. ڪلڪ هاؤس ڊيٽا کي دٻائي ٿو، ڊسڪ تي ڊيٽا کي اڃا به وڌيڪ ٺهڪندڙ بڻائي ٿو. ڪلڪ هاؤس جا فائدا رپورٽ مان 2 سلائڊ ۾ نظر اچن ٿا VK ڪئين هزارين سرورن مان ڪلڪ هائوس ۾ ڊيٽا داخل ڪري ٿو.

ايويٽو کان نينڪس-لاگ-ڪليڪٽر يوٽيليٽي nginx لاگ موڪلڻ لاءِ Clickhouse ڏانهن

ايويٽو کان نينڪس-لاگ-ڪليڪٽر يوٽيليٽي nginx لاگ موڪلڻ لاءِ Clickhouse ڏانهن

لاگن جي بنياد تي تجزياتي ڏسڻ لاءِ، اسان Grafana لاءِ ڊيش بورڊ ٺاهينداسين.

ڪنهن کي به دلچسپي، ٻلي ۾ ڀليڪار.

انسٽال ڪريو nginx، گرافانا معياري طريقي سان.

جوابي-پلے بڪ مان استعمال ڪندي ڪلڪ هائوس ڪلسٽر کي انسٽال ڪرڻ Denis Proskurin.

Clickhouse ۾ ڊيٽابيس ۽ ٽيبل ٺاهڻ

هن ۾ فائل ڪلڪ هائوس ۾ nginx-log-collector لاءِ ڊيٽابيس ۽ ٽيبل ٺاهڻ لاءِ SQL سوال بيان ڪيا ويا آهن.

اسان ڪلڪ هاؤس ڪلستر ۾ هر سرور تي هڪ هڪ ڪري هر درخواست ڪريون ٿا.

اهم نوٽ. هن لائن ۾، logs_cluster کي "remote_servers" ۽ "shard" جي وچ ۾ clickhouse_remote_servers.xml فائل مان توهان جي ڪلستر جي نالي سان تبديل ڪرڻ جي ضرورت آهي.

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

nginx-log-collector-rpm انسٽال ڪرڻ ۽ ترتيب ڏيڻ

نينگڪس-لاگ-ڪليڪٽر وٽ آر پي ايم ناهي. هتي https://github.com/patsevanton/nginx-log-collector-rpm ان لاءِ 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;

#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 от ميڪسم Ignatenko

Nodejs-stub-server وٽ rpm ڪونهي. هتي https://github.com/patsevanton/nodejs-stub-server ان لاءِ rpm ٺاهيو. rpm استعمال ڪندي مرتب ڪيو ويندو Fedora Copr

انسٽال ڪريو nodejs-stub-server package upstream 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

اسان 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

گرافانا کي ترتيب ڏيڻ

توهان سرڪاري گرافانا ويب سائيٽ تي ڊيش بورڊ نه ڳوليندا.

تنهن ڪري، اسان اهو هٿ سان ڪنداسين.

توھان ڳولي سگھوٿا منھنجو محفوظ ڪيل ڊيش بورڊ هتي.

توهان کي مواد سان گڏ ٽيبل متغير ٺاهڻ جي ضرورت آهي nginx.access_log.
ايويٽو کان نينڪس-لاگ-ڪليڪٽر يوٽيليٽي nginx لاگ موڪلڻ لاءِ Clickhouse ڏانهن

سنگل اسٽيٽ ڪل درخواستون:

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

ايويٽو کان نينڪس-لاگ-ڪليڪٽر يوٽيليٽي 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 لاگ موڪلڻ لاءِ Clickhouse ڏانهن

سنگل اسٽيٽ ناڪامي جو سيڪڙو:

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 لاگ موڪلڻ لاءِ Clickhouse ڏانهن

سنگل اسٽيٽ اوسط جوابي وقت:

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

ايويٽو کان نينڪس-لاگ-ڪليڪٽر يوٽيليٽي nginx لاگ موڪلڻ لاءِ Clickhouse ڏانهن

سنگل اسٽيٽ ميڪس جوابي وقت:

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

ايويٽو کان نينڪس-لاگ-ڪليڪٽر يوٽيليٽي nginx لاگ موڪلڻ لاءِ Clickhouse ڏانهن

ڳڻپ جي حالت:

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

ايويٽو کان نينڪس-لاگ-ڪليڪٽر يوٽيليٽي nginx لاگ موڪلڻ لاءِ Clickhouse ڏانهن

هڪ پائي وانگر ڊيٽا کي ڪڍڻ لاء، توهان کي پلگ ان کي انسٽال ڪرڻ ۽ گرافانا کي ٻيهر شروع ڪرڻ جي ضرورت آهي.

grafana-cli plugins install grafana-piechart-panel
service grafana-server restart

پائي ٽاپ 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 لاگ موڪلڻ لاءِ Clickhouse ڏانهن

وڌيڪ آئون اسڪرين شاٽ کان سواءِ درخواستون ڏيندس:

شمار http_user_agent:

$columns(http_user_agent, count(*) c) FROM $table

سٺي شرح / خراب شرح:

$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 لاگ موڪلڻ لاءِ Clickhouse ڏانهن

ايويٽو کان نينڪس-لاگ-ڪليڪٽر يوٽيليٽي nginx لاگ موڪلڻ لاءِ Clickhouse ڏانهن

ايويٽو کان نينڪس-لاگ-ڪليڪٽر يوٽيليٽي nginx لاگ موڪلڻ لاءِ Clickhouse ڏانهن

اوسط () ۽ مقدار () جو مقابلو

سراسري ()
ايويٽو کان نينڪس-لاگ-ڪليڪٽر يوٽيليٽي nginx لاگ موڪلڻ لاءِ Clickhouse ڏانهن
مقدار ()
ايويٽو کان نينڪس-لاگ-ڪليڪٽر يوٽيليٽي nginx لاگ موڪلڻ لاءِ Clickhouse ڏانهن

نتيجو:

مون کي اميد آهي ته ڪميونٽي ڊولپمينٽ/ٽيسٽنگ ۽ استعمال ڪرڻ ۾ شامل ٿيندي nginx-log-collector.
۽ جڏهن ڪو nginx-log-collecter لاڳو ڪندو، اهي توهان کي ٻڌائيندا ته انهن ڊسڪ، ريم، ۽ سي پي يو تي ڪيترو محفوظ ڪيو.

ٽيليگرام چينل:

ملي سيڪنڊ:

جنهن لاءِ مليس سيڪنڊ اهم آهن، مهرباني ڪري هن ۾ لکو يا ووٽ ڏيو مسئلو.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو