Estante skribita en la Rust-lingvo, ĝi estas karakterizita per alta rendimento kaj malalta RAM-konsumo kompare kun siaj analogoj. Krome, multe da atento estas donita al funkcioj rilataj al ĝusteco, precipe la kapablo konservi nesenditajn eventojn al bufro sur disko kaj turni dosierojn.
Arkitekture, Vector estas evento-enkursigilo, kiu ricevas mesaĝojn de unu aŭ pli fontoj, laŭvole aplikante super ĉi tiuj mesaĝoj transformoj, kaj sendante ilin al unu aŭ pli dreniloj.
Vektoro estas anstataŭaĵo por filebeat kaj logstash, ĝi povas agi en ambaŭ roloj (ricevi kaj sendi protokolojn), pli da detaloj pri ili ejo.
Se en Logstash la ĉeno estas konstruita kiel enigo → filtrilo → eligo tiam en Vector ĝi estas fontoj → transformas → enprofundigas
Ekzemploj troviĝas en la dokumentado.
Ĉi tiu instrukcio estas reviziita instrukcio de Vjaĉeslav Rakhinsky. La originalaj instrukcioj enhavas geoip-pretigon. Dum testado de geoip de interna reto, vektoro donis eraron.
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
Se iu bezonas prilabori geoip, tiam raportu al la originalaj instrukcioj de Vjaĉeslav Rakhinsky.
Ni agordos la kombinaĵon de Nginx (Alirprotokoloj) → Vektora (Kliento | Filebeat) → Vektora (Servilo | Logstash) → aparte en Clickhouse kaj aparte en Elasticsearch. Ni instalos 4 servilojn. Kvankam vi povas preteriri ĝin per 3 serviloj.
La skemo estas io tia.
Malebligu Selinux sur ĉiuj viaj serviloj
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Ni instalas HTTP-servilan emulilon + ilojn sur ĉiuj serviloj
ClickHouse uzas la SSE 4.2 instrukciaĵon, do krom se alie specifita, subteno por ĝi en la procesoro uzita iĝas plia sistema postulo. Jen la komando por kontroli ĉu la nuna procesoro subtenas SSE 4.2:
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Sur la kliento (TTT-servilo) - 1-a servilo
Sur la servilo kun nginx, vi devas malŝalti ipv6, ĉar la protokolo-tabelo en clickhouse uzas la kampon upstream_addr IPv4, ĉar mi ne uzas ipv6 ene de la reto. Se ipv6 ne estas malŝaltita, estos eraroj:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Eble legantoj, aldonu ipv6-subtenon.
Kreu la dosieron /etc/sysctl.d/98-disable-ipv6.conf
Unue, ni devas agordi la protokolformaton en Nginx en la dosiero /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;
}
Por ne rompi vian nunan agordon, Nginx permesas al vi havi plurajn direktivojn access_log
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Ne forgesu aldoni regulon al logrotate por novaj protokoloj (se la protokolo-dosiero ne finiĝas per .log)
Kaj agordu la anstataŭaĵon de Filebeat en la agordo /etc/vector/vector.toml. IP-adreso 172.26.10.108 estas la IP-adreso de la protokolo-servilo (Vektoro-Servilo)
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 forgesu aldoni la vektoran uzanton al la bezonata grupo, por ke li povu legi protokolojn. Ekzemple, nginx en centos kreas protokolojn kun adm-grupo-rajtoj.
usermod -a -G adm vector
Ni komencu la vektoran servon
systemctl enable vector
systemctl start vector
Vektoraj protokoloj povas esti rigardataj jene:
journalctl -f -u vector
Devus esti enskribo tia en la protokoloj
INFO vector::topology::builder: Healthcheck: Passed.
Streĉa Testado
Testado estas farita per Apache-komparnormo.
La pako httpd-tools estis instalita sur ĉiuj serviloj
Ni komencas testi uzante Apache-komparnormon de 4 malsamaj serviloj en ekrano. Unue, ni lanĉas la ekranan terminalan multipleksilon, kaj poste ni komencas testi uzante la Apache-komparnormon. Kiel labori kun ekrano vi povas trovi en artikolo.
De la unua servilo
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
De la unua servilo
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
De la unua servilo
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
De la unua servilo
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;
Ni eksciu, kiom da ŝtipoj uzis en Clickhouse.
La tabelo de protokoloj estas 857.19 MB.
La grandeco de la samaj datumoj en la indekso en Elasticsearch estas 4,5GB.
Se vi ne specifas datumojn en la vektoro en la parametroj, Clickhouse prenas 4500/857.19 = 5.24 fojojn malpli ol en Elasticsearch.
En vektora, la kunprema kampo estas uzata defaŭlte.