Ker je napisan v jeziku Rust, ga odlikuje visoka zmogljivost in nizka poraba RAM-a v primerjavi s svojimi analogi. Poleg tega je veliko pozornosti namenjene funkcijam, povezanim s pravilnostjo, zlasti zmožnosti shranjevanja neposlanih dogodkov v medpomnilnik na disku in rotacije datotek.
Arhitekturno je Vector usmerjevalnik dogodkov, ki sprejema sporočila od enega ali več virov, ki po želji velja za ta sporočila transformacijein jih pošlje enemu ali več odtoki.
Vector je zamenjava za filebeat in logstash, lahko nastopa v obeh vlogah (prejemanje in pošiljanje dnevnikov), več podrobnosti o njih Online.
Če je v Logstashu veriga zgrajena kot vhod → filter → izhod, potem je v Vectoru Viri → transformacije → ponorov
Primere najdete v dokumentaciji.
To navodilo je spremenjeno navodilo iz Vjačeslav Rakhinski. Izvirna navodila vsebujejo obdelavo geoip. Pri testiranju geoip iz notranjega omrežja je vektor dal napako.
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
Če mora kdo obdelati geoip, si oglejte izvirna navodila od Vjačeslav Rakhinski.
Konfigurirali bomo kombinacijo Nginx (Access logs) → Vector (Client | Filebeat) → Vector (Server | Logstash) → ločeno v Clickhouse in ločeno v Elasticsearch. Namestili bomo 4 strežnike. Čeprav ga lahko zaobidete s 3 strežniki.
Shema je nekaj takega.
Onemogočite Selinux na vseh svojih strežnikih
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Na vse strežnike namestimo emulator HTTP strežnika + pripomočke
ClickHouse uporablja nabor navodil SSE 4.2, tako da podpora zanj v uporabljenem procesorju postane dodatna sistemska zahteva, če ni določeno drugače. Tukaj je ukaz za preverjanje, ali trenutni procesor podpira SSE 4.2:
Konfiguriranje Elasticsearch za način z enim vozliščem 1 delček, 0 replik. Najverjetneje boste imeli gručo velikega števila strežnikov in vam tega ni treba storiti.
Za prihodnje indekse posodobite privzeto predlogo:
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Na odjemalcu (spletnem strežniku) - 1. strežnik
Na strežniku z nginxom morate onemogočiti ipv6, saj tabela dnevnikov v clickhouse uporablja polje upstream_addr IPv4, ker ipv6 ne uporabljam znotraj omrežja. Če ipv6 ni izklopljen, bodo napake:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Najprej moramo konfigurirati obliko dnevnika v Nginxu v datoteki /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;
}
Da ne bi pokvaril vaše trenutne konfiguracije, vam Nginx omogoča več direktiv access_log
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Ne pozabite dodati pravila za logrotate za nove dnevnike (če se datoteka dnevnika ne konča z .log)
In konfigurirajte zamenjavo Filebeat v konfiguraciji /etc/vector/vector.toml. Naslov IP 172.26.10.108 je naslov IP strežnika dnevnika (vektorski strežnik)
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"
Ne pozabite dodati vektorskega uporabnika v zahtevano skupino, da bo lahko bral dnevniške datoteke. Na primer, nginx v centos ustvari dnevnike s pravicami skupine adm.
usermod -a -G adm vector
Zaženimo vektorsko storitev
systemctl enable vector
systemctl start vector
Vektorske dnevnike si lahko ogledate takole:
journalctl -f -u vector
V dnevnikih bi moral biti podoben vnos
INFO vector::topology::builder: Healthcheck: Passed.
Stresno testiranje
Testiranje izvajamo z uporabo Apache benchmarka.
Paket httpd-tools je bil nameščen na vseh strežnikih
Testiranje začnemo z uporabo primerjalnega testa Apache iz 4 različnih strežnikov na zaslonu. Najprej zaženemo multiplekser zaslonskega terminala, nato pa začnemo s testiranjem z uporabo merila uspešnosti Apache. Kako delati z zaslonom najdete v članek.
Od 1. strežnika
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Od 2. strežnika
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Od 3. strežnika
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Od 4. strežnika
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;
Ugotovimo, koliko polen je zavzelo Clickhouse.
Velikost tabele dnevnikov je 857.19 MB.
Velikost istih podatkov v indeksu v Elasticsearch je 4,5 GB.
Če v parametrih ne podate podatkov v vektorju, Clickhouse vzame 4500/857.19 = 5.24-krat manj kot v Elasticsearch.
V vektorju je polje za stiskanje privzeto uporabljeno.