Nginx-log-collector utility from Avito የ nginx ምዝግብ ማስታወሻዎችን ወደ Clickhouse ለመላክ

ይህ ጽሑፍ ስለ ፕሮጀክቱ ይብራራል nginx-log-ሰብሳቢ, የ nginx ምዝግብ ማስታወሻዎችን የሚያነብ, ወደ Clickhouse ክላስተር ይላካቸው. ብዙውን ጊዜ ElasticSearch ለመዝገቦች ጥቅም ላይ ይውላል. Clickhouse ያነሱ ሀብቶችን ይፈልጋል (የዲስክ ቦታ፣ RAM፣ CPU)። Clickhouse ውሂብን በፍጥነት ይጽፋል። Clickhouse ውሂቡን ይጨመቃል፣ ይህም በዲስክ ላይ ያለውን መረጃ የበለጠ የታመቀ ያደርገዋል። የ Clickhouse ጥቅሞች ከሪፖርቱ በ 2 ስላይዶች ውስጥ ሊታዩ ይችላሉ ቪኬ ከአስር ሺዎች ከሚቆጠሩ አገልጋዮች ወደ ClickHouse እንዴት እንደሚያስገባ።

Nginx-log-collector utility from Avito የ nginx ምዝግብ ማስታወሻዎችን ወደ Clickhouse ለመላክ

Nginx-log-collector utility from Avito የ nginx ምዝግብ ማስታወሻዎችን ወደ Clickhouse ለመላክ

ትንታኔዎችን በምዝግብ ማስታወሻዎች ለማየት ለግራፋና ዳሽቦርድ እንፍጠር።

ማን ያስባል ፣ በድመት ስር እንኳን ደህና መጡ።

በመደበኛ መንገድ nginx, grafana ን ይጫኑ.

ክሊክ ሃውስ ክላስተር ከ ሊቻል የሚችል-playbook ጫን ዴኒስ ፕሮስኩሪን.

በ Clickhouse ውስጥ የውሂብ ጎታ እና ጠረጴዛዎችን መፍጠር

በዚህ ውስጥ ፋይል በ Clickhouse ውስጥ ለ nginx-log-collector የውሂብ ጎታዎችን እና ሰንጠረዦችን ለመፍጠር የ SQL ጥያቄዎች ተገልጸዋል።

በእያንዳንዱ የ Clickhouse ክላስተር አገልጋይ ላይ እያንዳንዱን ጥያቄ እናቀርባለን።

ጠቃሚ ማስታወሻ. በዚህ መስመር ሎግስ_ክላስተር በክላስተር ስምህ በ "remote_servers" እና "shard" መካከል ካለው የ clickhouse_remote_servers.xml ፋይል መተካት አለበት።

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

nginx-log-collector-rpm መጫን እና ማዋቀር

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 አገልጋይ ኢምፔር እንጠቀማለን። nodejs-stub-አገልጋይ от Maxim Ignatenko

nodejs-stub-አገልጋይ rpm የለውም። እዚህ https://github.com/patsevanton/nodejs-stub-server ለእሱ rpm ይፍጠሩ. rpm በመጠቀም ይገነባል። 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 benchmark በመጠቀም ነው።

ይጫኑት፡-

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ን በማዘጋጀት ላይ

በይፋዊው የግራፋና ድህረ ገጽ ላይ ዳሽቦርድ አያገኙም።

ስለዚህ, በእጃችን እናደርጋለን.

የእኔን የተቀመጠ ዳሽቦርድ ማግኘት ትችላለህ እዚህ.

እንዲሁም ከይዘቱ ጋር የሠንጠረዥ ተለዋዋጭ መፍጠር ያስፈልግዎታል nginx.access_log.
Nginx-log-collector utility from Avito የ nginx ምዝግብ ማስታወሻዎችን ወደ Clickhouse ለመላክ

የነጠላ ስታት ጠቅላላ ጥያቄዎች፡-

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

Nginx-log-collector utility from 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 utility from Avito የ 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-log-collector utility from Avito የ nginx ምዝግብ ማስታወሻዎችን ወደ Clickhouse ለመላክ

የነጠላ ስታት አማካይ የምላሽ ጊዜ፡-

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

Nginx-log-collector utility from Avito የ nginx ምዝግብ ማስታወሻዎችን ወደ Clickhouse ለመላክ

የነጠላስታት ከፍተኛ የምላሽ ጊዜ፡-

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

Nginx-log-collector utility from Avito የ nginx ምዝግብ ማስታወሻዎችን ወደ Clickhouse ለመላክ

የመቁጠር ሁኔታ፡

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

Nginx-log-collector utility from Avito የ nginx ምዝግብ ማስታወሻዎችን ወደ Clickhouse ለመላክ

እንደ ኬክ ያለ ውሂብ ለማውጣት ፕለጊኑን መጫን እና ግራፋናን እንደገና መጫን ያስፈልግዎታል።

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 utility from Avito የ 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

የሠንጠረዥ ቆጠራ ሁኔታ ለሁሉም vhosts:

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

የዳሽቦርዱ አጠቃላይ እይታ

Nginx-log-collector utility from Avito የ nginx ምዝግብ ማስታወሻዎችን ወደ Clickhouse ለመላክ

Nginx-log-collector utility from Avito የ nginx ምዝግብ ማስታወሻዎችን ወደ Clickhouse ለመላክ

Nginx-log-collector utility from Avito የ nginx ምዝግብ ማስታወሻዎችን ወደ Clickhouse ለመላክ

አማካይ() እና ኳንቲል()ን ማወዳደር

አማካይ ()
Nginx-log-collector utility from Avito የ nginx ምዝግብ ማስታወሻዎችን ወደ Clickhouse ለመላክ
ብዛት()
Nginx-log-collector utility from Avito የ nginx ምዝግብ ማስታወሻዎችን ወደ Clickhouse ለመላክ

ማጠቃለያ:

ማህበረሰቡ በማዳበር/በሙከራ እና nginx-log-collector በመጠቀም ይሳተፋል ብለን ተስፋ እናደርጋለን።
እና አንድ ሰው nginx-log-collector ን ሲተገብር, ምን ያህል ዲስክ, ራም, ሲፒዩ እንዳስቀመጠ ይነግርዎታል.

የቴሌግራም ቻናሎች፡-

ሚሊሰከንዶች

ስለ ሚሊሰከንዶች ማን ያስባል ፣ ይፃፉ ወይም ይምረጡ ፣ እባክዎን በዚህ ውስጥ ርዕሰ ጉዳይ.

ምንጭ: hab.com

አስተያየት ያክሉ