Тази статия ще обсъди проекта
За да видите анализите по регистрационни файлове, нека създадем табло за управление за Grafana.
На кого му пука, добре дошъл под кат.
Инсталирайте nginx, grafana по стандартния начин.
Инсталирайте клъстер clickhouse с ansible-playbook от
Създаване на база данни и таблици в Clickhouse
В този
Правим всяка заявка на свой ред на всеки сървър от клъстера Clickhouse.
Важна забележка. В този ред logs_cluster трябва да се замени с името на вашия клъстер от файла clickhouse_remote_servers.xml между „remote_servers“ и „shard“.
ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())
Инсталиране и конфигуриране на nginx-log-collector-rpm
Nginx-log-collector няма rpm. Тук
Инсталирайте 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
Редактирайте конфигурацията /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-сървърът няма rpm. Тук
Инсталирайте пакета nodejs-stub-server на upstream 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
Започваме да тестваме с помощта на бенчмарк на Apache от 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
Настройка на Графана
Няма да намерите табло на официалния сайт на Grafana.
Затова ще го направим на ръка.
Можете да намерите моето запазено табло
Трябва също да създадете таблична променлива със съдържанието nginx.access_log
.
Общ брой заявки за Singlestat:
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter GROUP BY t
Неуспешни заявки за Singlestat:
SELECT
1 as t,
count(*) as c
FROM $table
WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t
Процент на неуспех на 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
Средно време за реакция на Singlestat:
SELECT
1, avg(request_time) FROM $table
WHERE $timeFilter GROUP BY 1
Максимално време за реакция на Singlestat:
SELECT
1 as t, max(request_time) as c
FROM $table
WHERE $timeFilter GROUP BY t
Състояние на преброяване:
$columns(status, count(*) as c) from $table
За да изведете данни като пай, трябва да инсталирате плъгина и да презаредите grafana.
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
Освен това ще давам заявки без екранни снимки:
Брой 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
Общ изглед на таблото
Сравняване на avg() и quantile()
ср.()
квантил()
Заключение:
Надяваме се общността да се включи в разработването/тестването и използването на nginx-log-collector.
И когато някой имплементира nginx-log-collector, той ще ви каже колко е спестил диск, RAM, CPU.
Телеграм канали:
Милисекунди:
Който се интересува от милисекунди, моля, пишете или гласувайте за това
Източник: www.habr.com