Den er skrevet på Rust-sproget og er kendetegnet ved høj ydeevne og lavt RAM-forbrug sammenlignet med dets analoger. Derudover er der meget opmærksomhed på funktioner relateret til korrekthed, især evnen til at gemme usendte hændelser til en buffer på disken og rotere filer.
Arkitektonisk er Vector en hændelsesrouter, der modtager beskeder fra en eller flere kilder, eventuelt anvende over disse meddelelser transformationer, og sende dem til en eller flere afløb.
Vector er en erstatning for filebeat og logstash, den kan fungere i begge roller (modtage og sende logfiler), flere detaljer om dem Online.
Hvis kæden i Logstash er bygget som input → filter → output, så er den det i Vector kilder → transformationer → dræn
Eksempler kan findes i dokumentationen.
Denne vejledning er en revideret vejledning fra Vyacheslav Rakhinsky. De originale instruktioner indeholder geoip-behandling. Ved test af geoip fra et internt netværk gav vektor en fejl.
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 nogen skal behandle geoip, så se den originale vejledning fra Vyacheslav Rakhinsky.
Vi konfigurerer kombinationen af Nginx (Adgangslogfiler) → Vektor (Client | Filebeat) → Vektor (Server | Logstash) → separat i Clickhouse og separat i Elasticsearch. Vi installerer 4 servere. Selvom du kan omgå det med 3 servere.
Ordningen er sådan noget.
Deaktiver Selinux på alle dine servere
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Vi installerer en HTTP-serveremulator + hjælpeprogrammer på alle servere
ClickHouse bruger SSE 4.2-instruktionssættet, så medmindre andet er angivet, bliver understøttelse af det i den anvendte processor et ekstra systemkrav. Her er kommandoen til at kontrollere, om den aktuelle processor understøtter SSE 4.2:
Konfiguration af Elasticsearch til single-node-tilstand 1 shard, 0 replika. Mest sandsynligt vil du have en klynge af et stort antal servere, og du behøver ikke at gøre dette.
For fremtidige indekser skal du opdatere standardskabelonen:
Efter at have oprettet tabellerne, kan du køre Vector
systemctl enable vector
systemctl start vector
Vektorlogfiler kan ses sådan:
journalctl -f -u vector
Der burde være poster som denne i loggene
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
På klienten (webserver) - 1. server
På serveren med nginx skal du deaktivere ipv6, da logtabellen i clickhouse bruger feltet upstream_addr IPv4, da jeg ikke bruger ipv6 inde på netværket. Hvis ipv6 ikke er slået fra, vil der være fejl:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Først skal vi konfigurere logformatet 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 at bryde din nuværende konfiguration giver Nginx dig mulighed for at have flere access_log-direktiver
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Glem ikke at tilføje en regel for at logrotere for nye logfiler (hvis logfilen ikke ender med .log)
Og konfigurer Filebeat-erstatningen i /etc/vector/vector.toml config. IP-adressen 172.26.10.108 er IP-adressen på logserveren (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"
Glem ikke at tilføje vektorbrugeren til den ønskede gruppe, så han kan læse logfiler. For eksempel opretter nginx i centos logfiler med adm-grupperettigheder.
usermod -a -G adm vector
Lad os starte vektortjenesten
systemctl enable vector
systemctl start vector
Vektorlogfiler kan ses sådan:
journalctl -f -u vector
Der burde være en post som denne i loggene
INFO vector::topology::builder: Healthcheck: Passed.
Stresstest
Vi udfører test ved hjælp af Apache benchmark.
httpd-tools-pakken blev installeret på alle servere
Vi begynder at teste med Apache benchmark fra 4 forskellige servere på skærmen. Først starter vi skærmterminalmultiplekseren, og derefter begynder vi at teste ved hjælp af Apache-benchmark. Hvordan man arbejder med skærm kan du finde i artiklen.
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;
Lad os finde ud af, hvor meget træstammer optog i Clickhouse.
Logtabellens størrelse er 857.19 MB.
Størrelsen af de samme data i indekset i Elasticsearch er 4,5 GB.
Hvis du ikke angiver data i vektoren i parametrene, tager Clickhouse 4500/857.19 = 5.24 gange mindre end i Elasticsearch.