Rust тилинде жазылгандыктан, анын аналогдоруна салыштырмалуу жогорку өндүрүмдүүлүгү жана аз RAM керектөөсү менен мүнөздөлөт. Мындан тышкары, тууралыкка байланыштуу функцияларга, атап айтканда, дисктеги буферге жөнөтүлбөгөн окуяларды сактоо жана файлдарды айлантуу мүмкүнчүлүгүнө көп көңүл бурулат.
Архитектуралык жактан Вектор бир же бир нече билдирүүлөрдү кабыл алган окуя роутер булактар, ыктыярдуу түрдө бул билдирүүлөрдүн үстүнөн колдонуу трансформациялар, жана аларды бир же бир нечеге жөнөтүү дренаждар.
Vector - бул filebeat жана logstash үчүн алмаштыруу, ал эки ролдо тең иштей алат (журналдарды кабыл алуу жана жөнөтүү), алар боюнча кененирээк маалымат сайты.
Logstashте чынжыр киргизүү → чыпка → чыгаруу катары курулган болсо, Вектордо бул булактар → протонго → жуучу
Мисалдарды документациядан тапса болот.
Бул нускама кайра каралган нускама болуп саналат Вячеслав Рахинский. Баштапкы нускамалар геоипти иштетүүнү камтыйт. Ички тармактан геоипти текшерүүдө вектор ката берди.
Aug 05 06:25:31.889 DEBUG transform{name=nginx_parse_rename_fields type=rename_fields}: vector::transforms::rename_fields: Field did not exist field=«geoip.country_name» rate_limit_secs=30
Эгер кимдир бирөө geoipти иштетүү керек болсо, анда баштапкы нускамаларды караңыз Вячеслав Рахинский.
Биз Nginx (Кирүү журналдары) → Вектор (Клиент | Filebeat) → Вектор (Сервер | Logstash) → Clickhouse'да өзүнчө жана Elasticsearch'те өзүнчө конфигурациялайбыз. Биз 4 серверди орнотобуз. Сиз аны 3 сервер менен айланып өтсөңүз болот.
Схема ушуга окшош.
Бардык серверлериңизде Selinuxту өчүрүңүз
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Биз бардык серверлерге HTTP сервер эмуляторун + утилиталарын орнотобуз
ClickHouse SSE 4.2 нускама топтомун колдонот, андыктан башкасы көрсөтүлбөсө, колдонулган процессордо аны колдоо кошумча тутумдун талабы болуп калат. Бул жерде учурдагы процессор SSE 4.2 колдой тургандыгын текшерүү үчүн буйрук:
Elasticsearch бир түйүн режими үчүн конфигурацияланууда 1 сынык, 0 реплика. Кыязы, сизде көп сандагы серверлердин кластери болот жана муну жасоонун кереги жок.
Келечектеги индекстер үчүн демейки шаблонду жаңыртыңыз:
Таблицаларды түзгөндөн кийин, Векторду иштете аласыз
systemctl enable vector
systemctl start vector
Вектордук журналдарды төмөнкүдөй көрүүгө болот:
journalctl -f -u vector
Журналдарда ушул сыяктуу жазуулар болушу керек
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Кардар боюнча (Веб сервер) - 1-сервер
Nginx менен серверде, сиз IPv6 өчүрүшүңүз керек, анткени Clickhouse'дагы журналдар таблицасы талааны колдонот. upstream_addr IPv4, анткени мен тармак ичинде ipv6 колдонбойм. Эгерде ipv6 өчүрүлбөсө, каталар болот:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Биринчиден, /etc/nginx/nginx.conf файлында Nginx журналынын форматын конфигурациялашыбыз керек.
user nginx;
# you must set worker processes based on your CPU cores, nginx does not benefit from setting more than that
worker_processes auto; #some last versions calculate it automatically
# number of file descriptors used for nginx
# the limit for the maximum FDs on the server is usually set by the OS.
# if you don't set FD's then OS settings will be used which is by default 2000
worker_rlimit_nofile 100000;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# provides the configuration file context in which the directives that affect connection processing are specified.
events {
# determines how much clients will be served per worker
# max clients = worker_connections * worker_processes
# max clients is also limited by the number of socket connections available on the system (~64k)
worker_connections 4000;
# optimized to serve many clients with each thread, essential for linux -- for testing environment
use epoll;
# accept as many connections as possible, may flood worker connections if set too low -- for testing environment
multi_accept on;
}
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 vector escape=json
'{'
'"node_name":"nginx-vector",'
'"timestamp":"$time_iso8601",'
'"server_name":"$server_name",'
'"request_full": "$request",'
'"request_user_agent":"$http_user_agent",'
'"request_http_host":"$http_host",'
'"request_uri":"$request_uri",'
'"request_scheme": "$scheme",'
'"request_method":"$request_method",'
'"request_length":"$request_length",'
'"request_time": "$request_time",'
'"request_referrer":"$http_referer",'
'"response_status": "$status",'
'"response_body_bytes_sent":"$body_bytes_sent",'
'"response_content_type":"$sent_http_content_type",'
'"remote_addr": "$remote_addr",'
'"remote_port": "$remote_port",'
'"remote_user": "$remote_user",'
'"upstream_addr": "$upstream_addr",'
'"upstream_bytes_received": "$upstream_bytes_received",'
'"upstream_bytes_sent": "$upstream_bytes_sent",'
'"upstream_cache_status":"$upstream_cache_status",'
'"upstream_connect_time":"$upstream_connect_time",'
'"upstream_header_time":"$upstream_header_time",'
'"upstream_response_length":"$upstream_response_length",'
'"upstream_response_time":"$upstream_response_time",'
'"upstream_status": "$upstream_status",'
'"upstream_content_type":"$upstream_http_content_type"'
'}';
access_log /var/log/nginx/access.log main;
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
Учурдагы конфигурацияңызды бузбоо үчүн, Nginx сизге бир нече access_log директивасына ээ болууга мүмкүнчүлүк берет
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Жаңы журналдар үчүн логротациялоо эрежесин кошууну унутпаңыз (эгерде лог файлы .log менен аяктабаса)
default.conf файлын /etc/nginx/conf.d/ ичинен алып салыңыз
Жана /etc/vector/vector.toml конфигурациясында Filebeat алмаштырууну конфигурациялаңыз. IP дареги 172.26.10.108 - журнал серверинин IP дареги (Вектор-Сервер)
data_dir = "/var/lib/vector"
[sources.nginx_file]
type = "file"
include = [ "/var/log/nginx/access.json.log" ]
start_at_beginning = false
fingerprinting.strategy = "device_and_inode"
[sinks.nginx_output_vector]
type = "vector"
inputs = [ "nginx_file" ]
address = "172.26.10.108:9876"
Вектордук колдонуучуну керектүү топко кошууну унутпаңыз, ал лог файлдарын окуй алат. Мисалы, centos ичиндеги nginx adm тобунун укуктары менен журналдарды түзөт.
usermod -a -G adm vector
Вектордук кызматты баштайлы
systemctl enable vector
systemctl start vector
Вектордук журналдарды төмөнкүдөй көрүүгө болот:
journalctl -f -u vector
Журналдарда ушундай жазуу болушу керек
INFO vector::topology::builder: Healthcheck: Passed.
Стресс тестирлөө
Биз Apache эталонунун жардамы менен тестирлөө жүргүзөбүз.
httpd-tools пакети бардык серверлерде орнотулган
Экрандагы 4 башка серверден Apache эталондорун колдонуп сынап баштайбыз. Биринчиден, биз экран терминалынын мультиплексорун ишке киргизебиз, андан кийин Apache эталондорун колдонуу менен тестирлөөнү баштайбыз. Экран менен кантип иштөөнү таба аласыз макала.
1-серверден
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
2-серверден
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
3-серверден
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
4-серверден
while true; do ab -H "User-Agent: 4server" -c 100 -n 10 -t 10 http://vhost4/; sleep 1; done
Келгиле, Clickhouse ичиндеги маалыматтарды текшерип көрөлү
select concat(database, '.', table) as table,
formatReadableSize(sum(bytes)) as size,
sum(rows) as rows,
max(modification_time) as latest_modification,
sum(bytes) as bytes_size,
any(engine) as engine,
formatReadableSize(sum(primary_key_bytes_in_memory)) as primary_keys_size
from system.parts
where active
group by database, table
order by bytes_size desc;
Келгиле, Clickhouse'да канча журналдарды ээлегенин билели.
журналдар үстөл өлчөмү 857.19 MB болуп саналат.
Elasticsearch индексиндеги ошол эле маалыматтардын көлөмү 4,5 ГБ.
Эгер параметрлерде вектордо маалыматтарды көрсөтпөсөңүз, Clickhouse Elasticsearchге караганда 4500/857.19 = 5.24 эсе аз алат.