Het is geschreven in de Rust-taal en wordt gekenmerkt door hoge prestaties en een laag RAM-verbruik in vergelijking met zijn analogen. Daarnaast wordt veel aandacht besteed aan functies die verband houden met correctheid, in het bijzonder de mogelijkheid om niet-verzonden gebeurtenissen op te slaan in een buffer op schijf en bestanden te roteren.
Architectonisch gezien is Vector een gebeurtenisrouter die berichten ontvangt van een of meer bronnen, optioneel toe te passen op deze berichten transformatiesen stuur ze naar een of meer afvoeren.
Vector is een vervanging voor filebeat en logstash, het kan in beide rollen optreden (logs ontvangen en verzenden), meer details hierover Online.
Als in Logstash de keten is gebouwd als invoer → filter → uitvoer, dan is dat in Vector het geval bronnen → transformaties → wastafels
Voorbeelden vindt u in de documentatie.
Deze instructie is een herziene instructie van Vjatsjeslav Rakinski. De originele instructies bevatten geoip-verwerking. Bij het testen van geoip vanaf een intern netwerk gaf vector een foutmelding.
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
Als iemand geoip moet verwerken, raadpleeg dan de originele instructies van Vjatsjeslav Rakinski.
We zullen de combinatie van Nginx (Access logs) → Vector (Client | Filebeat) → Vector (Server | Logstash) → afzonderlijk configureren in Clickhouse en afzonderlijk in Elasticsearch. Wij installeren 4 servers. Al kun je het omzeilen met 3 servers.
Het schema is ongeveer zo.
Schakel Selinux uit op al uw servers
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
We installeren een HTTP-serveremulator + hulpprogramma's op alle servers
ClickHouse maakt gebruik van de SSE 4.2-instructieset, dus tenzij anders aangegeven, wordt ondersteuning hiervoor in de gebruikte processor een extra systeemvereiste. Hier is de opdracht om te controleren of de huidige processor SSE 4.2 ondersteunt:
Elasticsearch configureren voor modus met één knooppunt 1 scherf, 0 replica. Hoogstwaarschijnlijk heeft u een cluster van een groot aantal servers en hoeft u dit niet te doen.
Voor toekomstige indexen werkt u de standaardsjabloon bij:
Nadat u de tabellen hebt gemaakt, kunt u Vector uitvoeren
systemctl enable vector
systemctl start vector
Vectorlogboeken kunnen als volgt worden bekeken:
journalctl -f -u vector
Dergelijke vermeldingen zouden in de logboeken moeten staan
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Op de client (webserver) - 1e server
Op de server met nginx moet je ipv6 uitschakelen, omdat de logtabel in clickhouse het veld gebruikt upstream_addr IPv4, aangezien ik binnen het netwerk geen ipv6 gebruik. Als ipv6 niet is uitgeschakeld, zullen er fouten optreden:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Misschien lezers, voeg ipv6-ondersteuning toe.
Maak het bestand /etc/sysctl.d/98-disable-ipv6.conf
Eerst moeten we het logformaat in Nginx configureren in het bestand /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;
}
Om uw huidige configuratie niet te verbreken, kunt u met Nginx verschillende access_log-richtlijnen hebben
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Vergeet niet een regel toe te voegen om te logroteren voor nieuwe logs (tenzij het logbestand eindigt met .log)
Verwijder default.conf uit /etc/nginx/conf.d/
rm -f /etc/nginx/conf.d/default.conf
Voeg virtuele host /etc/nginx/conf.d/vhost1.conf toe
En configureer de Filebeat-vervanging in de configuratie /etc/vector/vector.toml. IP-adres 172.26.10.108 is het IP-adres van de logserver (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"
Vergeet niet de vectorgebruiker aan de gewenste groep toe te voegen, zodat hij logbestanden kan lezen. Nginx in centos maakt bijvoorbeeld logboeken met adm-groepsrechten.
usermod -a -G adm vector
Laten we de vectorservice starten
systemctl enable vector
systemctl start vector
Vectorlogboeken kunnen als volgt worden bekeken:
journalctl -f -u vector
Er zou een dergelijke vermelding in de logboeken moeten staan
INFO vector::topology::builder: Healthcheck: Passed.
Stress testen
Het testen wordt uitgevoerd met behulp van Apache benchmark.
Het httpd-tools-pakket is op alle servers geïnstalleerd
We beginnen met testen met behulp van de Apache-benchmark vanaf 4 verschillende servers in het scherm. Eerst lanceren we de screenterminal-multiplexer en daarna beginnen we te testen met behulp van de Apache-benchmark. Hoe u met het scherm kunt werken, vindt u in статье.
Van de 1e server
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Van de 2e server
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Van de 3e server
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Van de 4e 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;
Laten we eens kijken hoeveel logbestanden in Clickhouse in beslag namen.
De logtabelgrootte is 857.19 MB.
De grootte van dezelfde gegevens in de index in Elasticsearch is 4,5 GB.
Als u geen gegevens in de vector opgeeft in de parameters, neemt Clickhouse 4500/857.19 = 5.24 keer minder dan in Elasticsearch.
In vector wordt standaard het compressieveld gebruikt.