Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

මෙම ලිපිය ව්‍යාපෘතිය ගැන සාකච්ඡා කරනු ඇත nginx-log-collector, එය nginx ලඝු-සටහන් කියවා ක්ලික්හවුස් පොකුරු වෙත යවනු ඇත. සාමාන්යයෙන් ElasticSearch ලඝු-සටහන් සඳහා භාවිතා වේ. Clickhouse සඳහා අඩු සම්පත් අවශ්‍ය වේ (තැටි ඉඩ, RAM, CPU). Clickhouse දත්ත වේගයෙන් වාර්තා කරයි. Clickhouse දත්ත සම්පීඩනය කරයි, තැටියේ දත්ත වඩාත් සංයුක්ත කරයි. Clickhouse හි ඇති වාසි වාර්තාවේ විනිවිදක 2කින් දිස්වේ VK දස දහස් ගනනක් සේවාදායකයන්ගෙන් ClickHouse වෙත දත්ත ඇතුල් කරන ආකාරය.

Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

ලඝු-සටහන් මත පදනම් වූ විශ්ලේෂණ බැලීම සඳහා, අපි Grafana සඳහා උපකරණ පුවරුවක් සාදන්නෙමු.

කැමති ඕනෑම කෙනෙක්, cat වෙත සාදරයෙන් පිළිගනිමු.

nginx, grafana සම්මත ආකාරයෙන් ස්ථාපනය කරන්න.

සිට ansible-playbook භාවිතයෙන් clickhouse පොකුරක් ස්ථාපනය කිරීම ඩෙනිස් ප්‍රොස්කුරින්.

Clickhouse හි දත්ත සමුදායන් සහ වගු නිර්මාණය කිරීම

මෙහි ගොනුව 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

ආතතිය පරීක්ෂා කිරීම

අපි Apache මිණුම් ලකුණ භාවිතයෙන් පරීක්ෂණ සිදු කරන්නෙමු.

එය ස්ථාපනය කරන්න:

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 පිහිටුවීම

ඔබට නිල Grafana වෙබ් අඩවියේ උපකරණ පුවරුවක් සොයාගත නොහැක.

එමනිසා, අපි එය අතින් කරන්නෙමු.

ඔබට මගේ සුරැකි උපකරණ පුවරුව සොයා ගත හැක මෙහි.

ඔබ අන්තර්ගතය සමඟ වගු විචල්‍යයක් සෑදිය යුතුය nginx.access_log.
Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

Singlestat මුළු ඉල්ලීම්:

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

Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

Singlestat අසාර්ථක ඉල්ලීම්:

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

Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

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

Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

Singlestat සාමාන්‍ය ප්‍රතිචාර කාලය:

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

Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

Singlestat උපරිම ප්‍රතිචාර කාලය:

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

Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

ගණන් කිරීමේ තත්ත්වය:

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

Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

පයි එකක් වැනි දත්ත ප්‍රතිදානය කිරීමට, ඔබ ප්ලගිනය ස්ථාපනය කර ග්‍රැෆානා නැවත ආරම්භ කළ යුතුය.

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

Pie 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

Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

තවදුරටත් මම තිරපිටපත් නොමැතිව ඉල්ලීම් දෙන්නෙමි:

ගණන් 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

Upstream ප්‍රතිචාර කාලය (1 වන උඩු ප්‍රතිචාර කාලය):

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

සියලුම vhost සඳහා වගු ගණන් කිරීමේ තත්ත්වය:

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

උපකරණ පුවරුවේ සාමාන්ය දසුන

Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

සාමාන්‍ය () සහ ප්‍රමාණාත්මක () සංසන්දනය

සාමාන්ය ()
Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව
ප්රමාණාත්මක ()
Clickhouse වෙත nginx ලඝු-සටහන් යැවීම සඳහා Avito වෙතින් Nginx-log-collector උපයෝගීතාව

නිගමනය:

nginx-log-collector සංවර්ධනය කිරීමට/පරීක්‍ෂා කිරීමට සහ භාවිතා කිරීමට ප්‍රජාව සම්බන්ධ වනු ඇතැයි මම බලාපොරොත්තු වෙමි.
යමෙකු nginx-log-collector ක්‍රියාත්මක කරන විට, ඔවුන් තැටියේ, RAM සහ CPU මත කොපමණ ප්‍රමාණයක් ඉතිරි කර ඇත්දැයි ඔවුන් ඔබට කියනු ඇත.

ටෙලිග්‍රාම් නාලිකා:

මිලි තත්පර:

මිලි තත්පර වැදගත් කාටද, කරුණාකර මෙහි ලියන්න හෝ ඡන්දය දෙන්න නිකුත් කිරීම.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න