Je napísaný v jazyku Rust a vyznačuje sa vysokým výkonom a nízkou spotrebou RAM v porovnaní s jeho analógmi. Okrem toho sa veľká pozornosť venuje funkciám súvisiacim so správnosťou, najmä možnosti ukladať neodoslané udalosti do vyrovnávacej pamäte na disku a otáčať súbory.
Architektonicky je Vector smerovač udalostí, ktorý prijíma správy od jedného alebo viacerých zdroje, voliteľne sa vzťahuje na tieto správy transformáciía ich odoslanie jednému alebo viacerým odtoky.
Vector je náhradou za filebeat a logstash, môže pôsobiť v oboch rolách (prijímať a odosielať protokoly), viac podrobností o nich Online.
Ak je v Logstash reťazec zostavený ako vstup → filter → výstup, potom vo Vector je zdroje → transformácia → drezy
Príklady nájdete v dokumentácii.
Tento pokyn je revidovaný pokyn z Vjačeslav Rakhinský. Pôvodný návod obsahuje spracovanie geoipov. Pri testovaní geoip z internej siete vektor vykázal chybu.
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
Ak niekto potrebuje spracovať geoip, potom si pozrite pôvodný návod z Vjačeslav Rakhinský.
Nakonfigurujeme kombináciu Nginx (Access logs) → Vector (Client | Filebeat) → Vector (Server | Logstash) → samostatne v Clickhouse a samostatne v Elasticsearch. Nainštalujeme 4 servery. Aj keď to môžete obísť 3 servermi.
Schéma je asi takáto.
Zakážte Selinux na všetkých svojich serveroch
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Na všetky servery inštalujeme emulátor HTTP servera + utility
ClickHouse používa inštrukčnú sadu SSE 4.2, takže pokiaľ nie je uvedené inak, jej podpora v použitom procesore sa stáva ďalšou systémovou požiadavkou. Tu je príkaz na kontrolu, či aktuálny procesor podporuje SSE 4.2:
Konfigurácia Elasticsearch pre režim s jedným uzlom 1 fragment, 0 replika. S najväčšou pravdepodobnosťou budete mať klaster veľkého počtu serverov a nemusíte to robiť.
Pre budúce indexy aktualizujte predvolenú šablónu:
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Na klientovi (Web server) - 1. server
Na serveri s nginx musíte zakázať ipv6, pretože tabuľka protokolov v clickhouse používa pole upstream_addr IPv4, keďže ipv6 vo vnútri siete nepoužívam. Ak ipv6 nie je vypnutý, vyskytnú sa chyby:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Najprv musíme nakonfigurovať formát denníka v Nginx v súbore /etc/nginx/nginx.conf
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;
}
Aby nedošlo k narušeniu vašej aktuálnej konfigurácie, Nginx vám umožňuje mať niekoľko direktív access_log
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Nezabudnite pridať pravidlo na logrotate pre nové protokoly (ak súbor protokolu nekončí príponou .log)
A nakonfigurujte náhradu Filebeat v konfigurácii /etc/vector/vector.toml. IP adresa 172.26.10.108 je IP adresa log servera (Vektorový server)
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"
Nezabudnite pridať používateľa vektora do požadovanej skupiny, aby mohol čítať protokolové súbory. Napríklad nginx v centos vytvára denníky s právami skupiny adm.
usermod -a -G adm vector
Začnime vektorovú službu
systemctl enable vector
systemctl start vector
Vektorové protokoly je možné zobraziť takto:
journalctl -f -u vector
V protokoloch by mal byť takýto záznam
INFO vector::topology::builder: Healthcheck: Passed.
Záťažové testovanie
Testovanie vykonávame pomocou benchmarku Apache.
Balík httpd-tools bol nainštalovaný na všetkých serveroch
Začíname testovať pomocou benchmarku Apache zo 4 rôznych serverov na obrazovke. Najprv spustíme multiplexer obrazovky terminálu a potom začneme testovať pomocou benchmarku Apache. Ako pracovať s obrazovkou nájdete v článok.
Z 1 servera
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Z 2 servera
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Z 3 servera
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Z 4 servera
while true; do ab -H "User-Agent: 4server" -c 100 -n 10 -t 10 http://vhost4/; sleep 1; done
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;
Poďme zistiť, koľko polená zabralo v Clickhouse.
Veľkosť tabuľky protokolov je 857.19 MB.
Veľkosť rovnakých údajov v indexe v Elasticsearch je 4,5 GB.
Ak v parametroch neuvediete údaje vo vektore, Clickhouse zaberie 4500/857.19 = 5.24 krát menej ako v Elasticsearch.