Parašytas Rust kalba, jis pasižymi dideliu našumu ir mažu RAM suvartojimu, palyginti su analogais. Be to, daug dėmesio skiriama funkcijoms, susijusioms su teisingumu, ypač galimybe išsaugoti neišsiųstus įvykius į disko buferį ir pasukti failus.
Architektūriniu požiūriu Vector yra įvykių maršrutizatorius, kuris gauna pranešimus iš vieno ar kelių šaltiniai, pasirinktinai taikomas šiems pranešimams transformacijosir išsiųsti juos vienam ar keliems kanalizacijos.
„Vector“ yra „filebeat“ ir „logstash“ pakaitalas, jis gali atlikti abu vaidmenis (gauti ir siųsti žurnalus), daugiau informacijos apie juos Dabar naršo.
Ši instrukcija yra pataisyta instrukcija iš Viačeslavas Rachinskis. Originaliose instrukcijose yra geoip apdorojimas. Bandant geoip iš vidinio tinklo, vektorius davė klaidą.
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
Jei kam reikia apdoroti geoip, vadovaukitės originaliomis instrukcijomis iš Viačeslavas Rachinskis.
Nginx (prieigos žurnalai) → Vector (klientas | Filebeat) → Vector (serveris | Logstash) → derinį sukonfigūruosime atskirai „Clickhouse“ ir atskirai „Elasticsearch“. Įdiegsime 4 serverius. Nors jūs galite jį apeiti su 3 serveriais.
Schema yra maždaug tokia.
Išjunkite „Selinux“ visuose savo serveriuose
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Visuose serveriuose įdiegiame HTTP serverio emuliatorių + komunalines paslaugas
ClickHouse naudoja SSE 4.2 instrukcijų rinkinį, todėl jei nenurodyta kitaip, jo palaikymas naudojamame procesoriuje tampa papildomu sistemos reikalavimu. Čia yra komanda, skirta patikrinti, ar dabartinis procesorius palaiko SSE 4.2:
Serveryje su nginx turite išjungti ipv6, nes žurnalų lentelėje Clickhouse naudojamas laukas upstream_addr IPv4, nes aš nenaudoju ipv6 tinkle. Jei ipv6 nėra išjungtas, bus klaidų:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Pirmiausia turime sukonfigūruoti žurnalo formatą Nginx faile /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;
}
Kad nepažeistumėte dabartinės konfigūracijos, „Nginx“ leidžia turėti kelias access_log direktyvas
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Ir sukonfigūruokite Filebeat pakeitimą /etc/vector/vector.toml konfigūracijose. IP adresas 172.26.10.108 yra žurnalo serverio (vektoriaus serverio) IP adresas.
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"
Nepamirškite įtraukti vektorinio vartotojo į reikiamą grupę, kad jis galėtų skaityti žurnalo failus. Pavyzdžiui, nginx in centos sukuria žurnalus su adm grupės teisėmis.
usermod -a -G adm vector
Pradėkime vektorinę paslaugą
systemctl enable vector
systemctl start vector
Vektorinius žurnalus galima peržiūrėti taip:
journalctl -f -u vector
Žurnaluose turėtų būti toks įrašas
INFO vector::topology::builder: Healthcheck: Passed.
Testavimas nepalankiausiomis sąlygomis
Testavimas atliekamas naudojant Apache etaloną.
httpd-tools paketas buvo įdiegtas visuose serveriuose
Pradedame testavimą naudodami Apache etaloną iš 4 skirtingų serverių ekrane. Pirmiausia paleidžiame ekrano terminalo multiplekserį, o tada pradedame testavimą naudodami „Apache“ etaloną. Kaip dirbti su ekranu galite rasti straipsnis.
Iš 1 serverio
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Iš 2 serverio
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Iš 3 serverio
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Iš 4 serverio
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;
Sužinokime, kiek rąstų užėmė Clickhouse.
Žurnalų lentelės dydis yra 857.19 MB.
Tų pačių duomenų dydis Elasticsearch indekse yra 4,5 GB.
Jei parametruose nenurodysite duomenų vektoriuje, Clickhouse užima 4500/857.19 = 5.24 karto mažiau nei Elasticsearch.
Vektoryje glaudinimo laukas naudojamas pagal numatytuosius nustatymus.