nginx பதிவுகளை Clickhouse க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

இந்த கட்டுரை திட்டம் பற்றி விவாதிக்கும் nginx-log-சேகரி, இது nginx பதிவுகளைப் படித்து அவற்றை Clickhouse கிளஸ்டருக்கு அனுப்பும். பதிவுகளுக்கு பொதுவாக ElasticSearch பயன்படுத்தப்படுகிறது. Clickhouse க்கு குறைந்த ஆதாரங்கள் தேவை (வட்டு இடம், RAM, CPU). கிளிக்ஹவுஸ் தரவை வேகமாகப் பதிவு செய்கிறது. கிளிக்ஹவுஸ் தரவை சுருக்கி, வட்டில் உள்ள தரவை இன்னும் கச்சிதமாக்குகிறது. Clickhouse இன் நன்மைகள் அறிக்கையிலிருந்து 2 ஸ்லைடுகளில் தெரியும் VK பல்லாயிரக்கணக்கான சேவையகங்களிலிருந்து கிளிக்ஹவுஸில் தரவை எவ்வாறு செருகுகிறது.

nginx பதிவுகளை Clickhouse க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

nginx பதிவுகளை Clickhouse க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

பதிவுகளின் அடிப்படையில் பகுப்பாய்வுகளைப் பார்க்க, கிராஃபனாவுக்கான டாஷ்போர்டை உருவாக்குவோம்.

ஆர்வமுள்ள எவரும், பூனைக்கு வரவேற்கிறோம்.

நிலையான வழியில் nginx, grafana ஐ நிறுவவும்.

இருந்து ansible-playbook ஐப் பயன்படுத்தி கிளிக்ஹவுஸ் கிளஸ்டரை நிறுவுதல் டெனிஸ் ப்ரோஸ்குரின்.

கிளிக்ஹவுஸில் தரவுத்தளங்கள் மற்றும் அட்டவணைகளை உருவாக்குதல்

இதில் கோப்பு Clickhouse இல் nginx-log-collector க்கான தரவுத்தளங்கள் மற்றும் அட்டவணைகளை உருவாக்குவதற்கான SQL வினவல்கள் விவரிக்கப்பட்டுள்ளன.

கிளிக்ஹவுஸ் கிளஸ்டரில் உள்ள ஒவ்வொரு சர்வரிலும் ஒவ்வொரு கோரிக்கையை ஒவ்வொன்றாகச் செய்கிறோம்.

முக்கியமான குறிப்பு. இந்த வரிசையில், "remote_servers" மற்றும் "shard" ஆகியவற்றுக்கு இடையே உள்ள clickhouse_remote_servers.xml கோப்பிலிருந்து logs_cluster ஐ உங்கள் கிளஸ்டர் பெயரால் மாற்ற வேண்டும்.

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

nginx-log-collector-rpm என்ற 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 இருந்து மாக்சிம் இக்னாடென்கோ

Nodejs-stub-server இல் rpm இல்லை. இங்கே https://github.com/patsevanton/nodejs-stub-server அதற்கான rpm ஐ உருவாக்கவும். rpm ஐப் பயன்படுத்தி தொகுக்கப்படும் Fedora Copr

upstream nginx rpm இல் nodejs-stub-server தொகுப்பை நிறுவவும்

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 வெவ்வேறு சர்வர்களில் இருந்து அப்பாச்சி பெஞ்ச்மார்க்கைப் பயன்படுத்தி சோதிக்கத் தொடங்குகிறோம்:

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 க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

சிங்கிள்ஸ்டாட் மொத்த கோரிக்கைகள்:

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

nginx பதிவுகளை Clickhouse க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

சிங்கிள்ஸ்டாட் தோல்வியுற்ற கோரிக்கைகள்:

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

nginx பதிவுகளை Clickhouse க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

சிங்கிள்ஸ்டாட் தோல்வி சதவீதம்:

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 க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

சிங்கிள்ஸ்டாட் சராசரி பதில் நேரம்:

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

nginx பதிவுகளை Clickhouse க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

சிங்கிள்ஸ்டாட் அதிகபட்ச மறுமொழி நேரம்:

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

nginx பதிவுகளை Clickhouse க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

எண்ணிக்கை நிலை:

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

nginx பதிவுகளை Clickhouse க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

பை போன்ற தரவை வெளியிட, நீங்கள் செருகுநிரலை நிறுவி கிராஃபானாவை மறுதொடக்கம் செய்ய வேண்டும்.

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 க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

மேலும் நான் ஸ்கிரீன்ஷாட்கள் இல்லாமல் கோரிக்கைகளை வழங்குவேன்:

எண்ணிக்கை 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

அப்ஸ்ட்ரீம் மறுமொழி நேரம் (1வது அப்ஸ்ட்ரீம் மறுமொழி நேரம்):

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

அனைத்து vhost க்கான அட்டவணை எண்ணிக்கை நிலை:

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

டாஷ்போர்டின் பொதுவான பார்வை

nginx பதிவுகளை Clickhouse க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

nginx பதிவுகளை Clickhouse க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

nginx பதிவுகளை Clickhouse க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

சராசரி() மற்றும் அளவு() ஆகியவற்றின் ஒப்பீடு

சராசரி ()
nginx பதிவுகளை Clickhouse க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு
அளவு()
nginx பதிவுகளை Clickhouse க்கு அனுப்ப Avito இலிருந்து Nginx-log-collector பயன்பாடு

முடிவுக்கு:

nginx-log-collector ஐ உருவாக்குதல்/சோதனை செய்தல் மற்றும் பயன்படுத்துவதில் சமூகம் ஈடுபடும் என நம்புகிறேன்.
யாராவது nginx-log-collector ஐ செயல்படுத்தும்போது, ​​அவர்கள் வட்டு, RAM மற்றும் CPU ஆகியவற்றில் எவ்வளவு சேமித்தார்கள் என்பதை அவர்கள் உங்களுக்குக் கூறுவார்கள்.

டெலிகிராம் சேனல்கள்:

மில்லி விநாடிகள்:

மில்லி விநாடிகள் யாருக்கு முக்கியம், இதில் எழுதவும் அல்லது வாக்களிக்கவும் பிரச்சினை.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்