Clickhouse'га nginx журналдарын жөнөтүү үчүн Avitoдон Nginx-log-collector утилитасы

Бул макалада долбоор талкууланат nginx-лог-коллекторnginx журналдарын окуп, аларды Clickhouse кластерине жөнөтөт. Адатта ElasticSearch журналдар үчүн колдонулат. Clickhouse азыраак ресурстарды талап кылат (диск мейкиндиги, RAM, CPU). Clickhouse маалыматтарды тезирээк жазат. Clickhouse маалыматтарды кысып, дисктеги маалыматтарды ого бетер компакттуу кылат. Clickhouse'тун артыкчылыктары отчеттун 2 слайдында көрүнүп турат ВК кантип ClickHouseга он миңдеген серверлерден маалыматтарды киргизет.

Clickhouse'га nginx журналдарын жөнөтүү үчүн Avitoдон Nginx-log-collector утилитасы

Clickhouse'га nginx журналдарын жөнөтүү үчүн Avitoдон Nginx-log-collector утилитасы

Журналдардын негизинде аналитиканы көрүү үчүн, биз Grafana үчүн башкаруу тактасын түзөбүз.

Кимге кызыкса, кош келиңиз.

Nginx, grafana стандарттуу түрдө орнотуңуз.

From ansible-playbook аркылуу Clickhouse кластерин орнотуу Денис Проскурин.

Clickhouse ичинде маалымат базаларын жана таблицаларды түзүү

бул файл Clickhouse ичинде nginx-log-collector үчүн маалымат базаларын жана таблицаларды түзүү үчүн SQL сурамдары сүрөттөлгөн.

Биз Clickhouse кластериндеги ар бир серверде ар бир суроону бирден жасайбыз.

Маанилүү эскертүү. Бул сапта logs_cluster "remote_servers" жана "shard" ортосундагы clickhouse_remote_servers.xml файлындагы кластердин аталышы менен алмаштырылышы керек.

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

Nginx-log-collector-rpm орнотуу жана конфигурациялоо

Nginx-лог-коллектордо 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

/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-сервер от Максим Игнатенко

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 эталонунун жардамы менен тестирлөө жүргүзөбүз.

Аны орнотуу:

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 утилитасы

Бирдиктүү жалпы сурамдар:

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 утилитасы

Жалгыз статтык ийгиликсиз пайыз:

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 утилитасы

Бирдиктүү орточо жооп берүү убактысы:

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

Жогорку агымдагы жооп убактысы (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 утилитасы

avg() жана quantile() салыштыруу

avg()
Clickhouse'га nginx журналдарын жөнөтүү үчүн Avitoдон Nginx-log-collector утилитасы
quantile()
Clickhouse'га nginx журналдарын жөнөтүү үчүн Avitoдон Nginx-log-collector утилитасы

корутундусу:

Мен коомчулук nginx-log-collector иштеп чыгууга/сыноого жана колдонууга катышат деп үмүттөнөм.
Жана кимдир бирөө nginx-log-collector ишке ашырганда, алар дискте, оперативдүү эсте жана CPUда канча үнөмдөлгөндүгүн айтып беришет.

Telegram каналдары:

Миллисекунд:

Миллисекунддор ким үчүн маанилүү, муну жазыңыз же добуш бериңиз чыгаруу.

Source: www.habr.com

Комментарий кошуу