Essendo scritto in linguaggio Rust, è caratterizzato da prestazioni elevate e basso consumo di RAM rispetto ai suoi analoghi. Inoltre, viene prestata molta attenzione alle funzioni legate alla correttezza, in particolare alla possibilità di salvare gli eventi non inviati in un buffer su disco e ruotare i file.
Dal punto di vista architettonico, Vector è un router di eventi che riceve messaggi da uno o più di fonti, applicandolo facoltativamente a questi messaggi trasformazionee inviandoli a uno o più drenaggi.
Vector sostituisce filebeat e logstash, può agire in entrambi i ruoli (ricevere e inviare log), maggiori dettagli su di essi sito web.
Se in Logstash la catena è costruita come input → filtro → output, in Vector lo è fonti → trasforma → lavelli
Gli esempi possono essere trovati nella documentazione.
Questa istruzione è un'istruzione rivista da Viacheslav Rakhinsky. Le istruzioni originali contengono l'elaborazione geoip. Durante il test di GeoIP da una rete interna, Vector ha restituito un errore.
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
Se qualcuno ha bisogno di elaborare geoip, fare riferimento alle istruzioni originali di Viacheslav Rakhinsky.
Configureremo la combinazione di Nginx (Log di accesso) → Vector (Client | Filebeat) → Vector (Server | Logstash) → separatamente in Clickhouse e separatamente in Elasticsearch. Installeremo 4 server. Anche se puoi bypassarlo con 3 server.
Lo schema è qualcosa del genere.
Disabilita Selinux su tutti i tuoi server
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Installiamo un emulatore di server HTTP + utilità su tutti i server
ClickHouse utilizza il set di istruzioni SSE 4.2, quindi, se non diversamente specificato, il supporto nel processore utilizzato diventa un requisito di sistema aggiuntivo. Ecco il comando per verificare se il processore corrente supporta SSE 4.2:
Configurazione di Elasticsearch per la modalità a nodo singolo 1 shard, 0 replica. Molto probabilmente avrai un cluster con un gran numero di server e non avrai bisogno di farlo.
Per gli indici futuri, aggiorna il modello predefinito:
I log vettoriali possono essere visualizzati in questo modo:
journalctl -f -u vector
Dovrebbero esserci voci come questa nei log
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Sul client (server Web) - 1° server
Sul server con nginx, devi disabilitare ipv6, poiché la tabella dei log in clickhouse utilizza il campo upstream_addr IPv4, poiché non utilizzo IPv6 all'interno della rete. Se ipv6 non è disattivato, si verificheranno errori:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Per prima cosa dobbiamo configurare il formato del log in Nginx nel file /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;
}
Per non interrompere la configurazione attuale, Nginx ti consente di avere diverse direttive access_log
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Non dimenticare di aggiungere una regola per registrare i nuovi log (a meno che il file di log non termini con .log)
E configura la sostituzione di Filebeat nella configurazione /etc/vettore/vettore.toml. L'indirizzo IP 172.26.10.108 è l'indirizzo IP del server di registro (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"
Non dimenticare di aggiungere l'utente vettore al gruppo richiesto in modo che possa leggere i file di registro. Ad esempio, nginx in centos crea log con diritti di gruppo adm.
usermod -a -G adm vector
Avviamo il servizio vettoriale
systemctl enable vector
systemctl start vector
I log vettoriali possono essere visualizzati in questo modo:
journalctl -f -u vector
Dovrebbe esserci una voce come questa nei log
INFO vector::topology::builder: Healthcheck: Passed.
Prove di stress
Effettuiamo test utilizzando il benchmark Apache.
Il pacchetto httpd-tools è stato installato su tutti i server
Iniziamo i test utilizzando il benchmark Apache da 4 diversi server sullo schermo. Innanzitutto, lanciamo il multiplexer del terminale su schermo, quindi iniziamo i test utilizzando il benchmark Apache. Come lavorare con lo schermo che puoi trovare in Articolo.
Dal 1° server
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Dal 2° server
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Dal 3° server
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Dal 4° server
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;
Scopriamo quanti log sono stati occupati in Clickhouse.
La dimensione della tabella dei log è 857.19 MB.
La dimensione degli stessi dati nell'indice in Elasticsearch è 4,5 GB.
Se non specifichi i dati del vettore nei parametri, Clickhouse prende 4500/857.19 = 5.24 volte meno che in Elasticsearch.
Nel vettore, il campo di compressione viene utilizzato per impostazione predefinita.