Den er skrevet på Rust-språket og er preget av høy ytelse og lavt RAM-forbruk sammenlignet med analogene. I tillegg rettes mye oppmerksomhet mot funksjoner knyttet til korrekthet, spesielt muligheten til å lagre usendte hendelser til en buffer på disken og rotere filer.
Arkitektonisk er Vector en hendelsesruter som mottar meldinger fra en eller flere kilder, eventuelt bruke over disse meldingene transformasjoner, og sende dem til en eller flere avløp.
Vector er en erstatning for filebeat og logstash, den kan fungere i begge rollene (motta og sende logger), mer detaljer om dem nettsted.
Hvis i Logstash er kjeden bygget som input → filter → output, så er det i Vector kilder → transforme → synker
Eksempler finnes i dokumentasjonen.
Denne instruksen er en revidert instruks fra Vyacheslav Rakhinsky. De originale instruksjonene inneholder geoip-behandling. Ved testing av geoip fra et internt nettverk ga vektor en feil.
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
Hvis noen trenger å behandle geoip, så referer til de originale instruksjonene fra Vyacheslav Rakhinsky.
Vi vil konfigurere kombinasjonen av Nginx (tilgangslogger) → Vektor (klient | Filebeat) → Vector (Server | Logstash) → separat i Clickhouse og separat i Elasticsearch. Vi skal installere 4 servere. Selv om du kan omgå det med 3 servere.
Opplegget er noe sånt som dette.
Deaktiver Selinux på alle serverne dine
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Vi installerer en HTTP-serveremulator + verktøy på alle servere
ClickHouse bruker SSE 4.2 instruksjonssettet, så med mindre annet er spesifisert, blir støtte for det i prosessoren som brukes et ekstra systemkrav. Her er kommandoen for å sjekke om den nåværende prosessoren støtter SSE 4.2:
Konfigurere Elasticsearch for enkeltnodemodus 1 shard, 0 replika. Mest sannsynlig vil du ha en klynge med et stort antall servere, og du trenger ikke å gjøre dette.
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
På klienten (webserver) - 1. server
På serveren med nginx må du deaktivere ipv6, siden loggtabellen i clickhouse bruker feltet upstream_addr IPv4, siden jeg ikke bruker ipv6 inne i nettverket. Hvis ipv6 ikke er slått av, vil det oppstå feil:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Først må vi konfigurere loggformatet i Nginx i filen /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;
}
For ikke å bryte din nåværende konfigurasjon, lar Nginx deg ha flere access_log-direktiver
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Ikke glem å legge til en regel for å logrotere for nye logger (hvis loggfilen ikke slutter med .log)
Fjern default.conf fra /etc/nginx/conf.d/
rm -f /etc/nginx/conf.d/default.conf
Legg til virtuell vert /etc/nginx/conf.d/vhost1.conf
Og konfigurer Filebeat-erstatningen i /etc/vector/vector.toml-konfigurasjonen. IP-adressen 172.26.10.108 er IP-adressen til loggserveren (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"
Ikke glem å legge vektorbrukeren til den nødvendige gruppen slik at han kan lese loggfiler. For eksempel oppretter nginx i centos logger med adm-grupperettigheter.
usermod -a -G adm vector
La oss starte vektortjenesten
systemctl enable vector
systemctl start vector
Vektorlogger kan sees slik:
journalctl -f -u vector
Det bør være en oppføring som dette i loggene
INFO vector::topology::builder: Healthcheck: Passed.
Stresstesting
Vi utfører testing med Apache benchmark.
httpd-tools-pakken ble installert på alle servere
Vi begynner å teste med Apache-benchmark fra 4 forskjellige servere på skjermen. Først starter vi skjermterminalmultiplekseren, og deretter begynner vi å teste ved å bruke Apache-benchmark. Hvordan jobbe med skjerm finner du i artikkel.
Fra 1. server
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Fra 2. server
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Fra 3. server
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Fra 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;
La oss finne ut hvor mye logger tok opp i Clickhouse.
Størrelsen på loggtabellen er 857.19 MB.
Størrelsen på de samme dataene i indeksen i Elasticsearch er 4,5 GB.
Hvis du ikke spesifiserer data i vektoren i parameterne, tar Clickhouse 4500/857.19 = 5.24 ganger mindre enn i Elasticsearch.