Omdat dit in die Rust-taal geskryf is, word dit gekenmerk deur hoë werkverrigting en lae RAM-verbruik in vergelyking met sy eweknieë. Daarbenewens word baie aandag geskenk aan funksies wat verband hou met korrektheid, veral die vermoë om ongestuurde gebeurtenisse op 'n buffer op skyf te stoor en lêerrotasie.
Argitektonies is Vector 'n gebeurtenisroeteerder wat boodskappe van een of meer aanvaar bronne, opsioneel van toepassing oor hierdie boodskappe transformasies, en stuur dit na een of meer dreineer.
Vector is 'n plaasvervanger vir filebeat en logstash, dit kan in beide rolle optree (logs ontvang en stuur), meer besonderhede daaroor Online.
As in Logstash die ketting gebou is as invoer → filter → afvoer, dan is dit in Vector bronne → transforms → wasbakke
Voorbeelde kan in die dokumentasie gevind word.
Hierdie instruksie is 'n hersiene instruksie van Vyacheslav Rakhinsky. Die oorspronklike instruksies bevat geoip-verwerking. Toe geoip vanaf 'n interne netwerk getoets word, het vektor 'n fout gegee.
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
As iemand geoip moet verwerk, verwys dan na die oorspronklike instruksies van Vyacheslav Rakhinsky.
Ons sal die kombinasie van Nginx (Access logs) → Vector (Client | Filebeat) → Vector (Server | Logstash) → apart in Clickhouse en afsonderlik in Elasticsearch konfigureer. Ons sal 4 bedieners installeer. Alhoewel u dit met 3 bedieners kan omseil.
Die skema is so iets.
Deaktiveer Selinux op al jou bedieners
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Ons installeer 'n HTTP-bediener-emulator + nutsprogramme op alle bedieners
ClickHouse gebruik die SSE 4.2-instruksiestel, so tensy anders gespesifiseer, word ondersteuning daarvoor in die verwerker wat gebruik word 'n bykomende stelselvereiste. Hier is die opdrag om te kyk of die huidige verwerker SSE 4.2 ondersteun:
Konfigureer Elasticsearch vir enkelnodusmodus 1 skerf, 0 replika. Heel waarskynlik sal jy 'n groep van 'n groot aantal bedieners hê en jy hoef dit nie te doen nie.
Dateer die verstek sjabloon op vir toekomstige indekse:
Nadat u die tabelle geskep het, kan u Vector laat loop
systemctl enable vector
systemctl start vector
Vektor logs kan soos volg bekyk word:
journalctl -f -u vector
Daar behoort inskrywings soos hierdie in die logs te wees
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Op die kliënt (webbediener) - 1ste bediener
Op die bediener met nginx moet u ipv6 deaktiveer, aangesien die logs-tabel in clickhouse die veld gebruik upstream_addr IPv4, aangesien ek nie ipv6 intern gebruik nie. As ipv6 nie afgeskakel is nie, sal daar foute wees:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Eerstens moet ons die logformaat in Nginx opstel in die lêer /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 nie jou huidige konfigurasie te breek nie, laat Nginx jou toe om verskeie toegangslog-aanwysings te hê
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Moenie vergeet om 'n reël by te voeg om te logrotate vir nuwe logboeke nie (tensy die loglêer met .log eindig)
Verwyder default.conf van /etc/nginx/conf.d/
rm -f /etc/nginx/conf.d/default.conf
Voeg virtuele gasheer /etc/nginx/conf.d/vhost1.conf by
En stel die Filebeat-vervanging in die /etc/vector/vector.toml config. IP-adres 172.26.10.108 is die IP-adres van die log-bediener (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"
Moenie vergeet om die vektorgebruiker by die vereiste groep te voeg sodat hy loglêers kan lees nie. Byvoorbeeld, nginx in centos skep logs met adm-groepregte.
usermod -a -G adm vector
Kom ons begin die vektordiens
systemctl enable vector
systemctl start vector
Vektor logs kan soos volg bekyk word:
journalctl -f -u vector
Daar behoort 'n inskrywing soos hierdie in die logs te wees
INFO vector::topology::builder: Healthcheck: Passed.
Strestoetsing
Toetsing word uitgevoer met behulp van Apache-benchmark.
Die httpd-tools-pakket is op alle bedieners geïnstalleer
Ons begin toets met Apache-benchmark vanaf 4 verskillende bedieners op die skerm. Eerstens begin ons die skermterminale multiplexer, en dan begin ons toets met die Apache-maatstaf. Hoe om met skerm te werk wat jy kan vind in Artikel.
Vanaf 1ste bediener
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Vanaf 2ste bediener
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Vanaf 3ste bediener
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Vanaf 4ste bediener
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;
Kom ons vind uit hoeveel stompe in Clickhouse opgeneem het.
Die grootte van die logboektabel is 857.19 MB.
Die grootte van dieselfde data in die indeks in Elasticsearch is 4,5 GB.
As jy nie data in die vektor in die parameters spesifiseer nie, neem Clickhouse 4500/857.19 = 5.24 keer minder as in Elasticsearch.
In vektor word die kompressieveld by verstek gebruik.