Clickhouse жүйесіне nginx журналдарын жіберуге арналған Avito ұсынған Nginx-log-collector утилитасы

Бұл мақалада жоба талқыланады nginx-лог-коллекторnginx журналдарын оқитын , оларды Clickhouse кластеріне жіберіңіз. Әдетте журналдар үшін ElasticSearch пайдаланылады. Clickhouse азырақ ресурстарды қажет етеді (диск кеңістігі, жедел жад, процессор). Clickhouse деректерді жылдам жазады. Clickhouse деректерді қысады, бұл дискідегі деректерді одан да ықшам етеді. Clickhouse артықшылықтарын есептен 2 слайдтан көруге болады VK он мыңдаған серверлерден деректерді ClickHouse ішіне қалай енгізеді.

Clickhouse жүйесіне nginx журналдарын жіберуге арналған Avito ұсынған Nginx-log-collector утилитасы

Clickhouse жүйесіне nginx журналдарын жіберуге арналған Avito ұсынған Nginx-log-collector утилитасы

Журналдар бойынша талдауларды көру үшін Grafana үшін бақылау тақтасын жасайық.

Кім ойлайды, мысықтың астына қош келдіңіз.

Nginx, grafana стандартты жолмен орнатыңыз.

Clickhouse кластерін ansible-playbook арқылы орнатыңыз Денис Проскурин.

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-лог-коллекторында айн/мин жоқ. Мұнда https://github.com/patsevanton/nginx-log-collector-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 көмегімен құрастырылады 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

Жоғарғы ағынның жауап беру уақыты (бірінші жоғары ағынның жауап беру уақыты):

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

Барлық хосттар үшін кесте санының күйі:

$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() салыстыру

орташа()
Clickhouse жүйесіне nginx журналдарын жіберуге арналған Avito ұсынған Nginx-log-collector утилитасы
квантиль()
Clickhouse жүйесіне nginx журналдарын жіберуге арналған Avito ұсынған Nginx-log-collector утилитасы

Қорытынды:

Қауымдастық nginx-log-collector әзірлеуге/тестілеуге және пайдалануға қатысады деп үміттенеміз.
Ал біреу nginx-log-collector іске асырғанда, ол дискіні, жедел жадты, процессорды қанша үнемдегенін айтып береді.

Telegram арналары:

Миллисекундтар:

Миллисекундтар кімге ұнайды, осында жазыңыз немесе дауыс беріңіз іс.

Ақпарат көзі: www.habr.com

пікір қалдыру