Je napsán v jazyce Rust a vyznačuje se vysokým výkonem a nízkou spotřebou RAM ve srovnání s jeho analogy. Velká pozornost je navíc věnována funkcím souvisejícím se správností, zejména pak možnosti ukládat neodeslané události do vyrovnávací paměti na disku a rotovat soubory.
Architektonicky je Vector směrovač událostí, který přijímá zprávy od jednoho nebo více Zdroje, volitelně se vztahuje na tyto zprávy transformacea jejich odeslání jednomu nebo více odtoky.
Vector je náhradou za filebeat a logstash, může vystupovat v obou rolích (přijímat a odesílat logy), další podrobnosti o nich webové stránky.
Pokud je v Logstash řetězec postaven jako vstup → filtr → výstup, pak ve Vectoru je zdroje → transformace → klesá
Příklady naleznete v dokumentaci.
Tento pokyn je revidovaný pokyn od Vjačeslav Rakhinský. Původní návod obsahuje zpracování geoip. Při testování geoip z interní sítě 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
Pokud by někdo potřeboval zpracovat geoip, tak se řiďte originálním návodem z Vjačeslav Rakhinský.
Nakonfigurujeme kombinaci Nginx (Access logs) → Vector (Client | Filebeat) → Vector (Server | Logstash) → zvlášť v Clickhouse a zvlášť v Elasticsearch. Nainstalujeme 4 servery. I když to můžete obejít se 3 servery.
Schéma je něco takového.
Zakažte Selinux na všech svých serverech
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Na všechny servery nainstalujeme emulátor HTTP serveru + utility
ClickHouse používá instrukční sadu SSE 4.2, takže pokud není uvedeno jinak, její podpora v použitém procesoru se stává dalším požadavkem na systém. Zde je příkaz ke kontrole, zda aktuální procesor podporuje SSE 4.2:
Konfigurace Elasticsearch pro režim s jedním uzlem 1 fragment, 0 replika. S největší pravděpodobností budete mít cluster velkého počtu serverů a nemusíte to dělat.
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Na klientovi (webovém serveru) - 1. server
Na serveru s nginx musíte zakázat ipv6, protože tabulka protokolů v clickhouse používá pole upstream_addr IPv4, protože nepoužívám ipv6 uvnitř sítě. Pokud není ipv6 vypnuto, dojde k chybám:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Možná čtenáři, přidejte podporu ipv6.
Vytvořte soubor /etc/sysctl.d/98-disable-ipv6.conf
Nejprve musíme nakonfigurovat formát protokolu v Nginx v souboru /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 porušení vaší aktuální konfigurace, Nginx vám umožňuje mít několik direktiv access_log
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Nezapomeňte přidat pravidlo pro logrotate pro nové protokoly (pokud soubor protokolu nekončí příponou .log)
A nakonfigurujte náhradu Filebeat v konfiguraci /etc/vector/vector.toml. IP adresa 172.26.10.108 je IP adresa logovacího serveru (Vector-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"
Nezapomeňte přidat uživatele vektoru do požadované skupiny, aby mohl číst soubory protokolu. Například nginx v centos vytváří protokoly s právy skupiny adm.
usermod -a -G adm vector
Spustíme vektorovou službu
systemctl enable vector
systemctl start vector
Vektorové protokoly lze zobrazit takto:
journalctl -f -u vector
V protokolech by měl být takový záznam
INFO vector::topology::builder: Healthcheck: Passed.
Zátěžové testování
Testování provádíme pomocí benchmarku Apache.
Balíček httpd-tools byl nainstalován na všechny servery
Začínáme testovat pomocí benchmarku Apache ze 4 různých serverů na obrazovce. Nejprve spustíme multiplexer obrazovky terminálu a poté začneme testovat pomocí benchmarku Apache. Jak pracovat s obrazovkou najdete v článek.
Z 1. serveru
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Z 2. serveru
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Z 3. serveru
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Z 4. serveru
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;
Pojďme zjistit, kolik kulatiny zabralo v Clickhouse.
Velikost tabulky protokolů je 857.19 MB.
Velikost stejných dat v indexu v Elasticsearch je 4,5 GB.
Pokud v parametrech neuvedete data ve vektoru, Clickhouse vezme 4500/857.19 = 5.24krát méně než v Elasticsearch.
Ve vektoru se ve výchozím nastavení používá pole komprese.