En estar escrit en llenguatge Rust, es caracteritza per un alt rendiment i un baix consum de memòria RAM en comparació amb els seus anàlegs. A més, es presta molta atenció a les funcions relacionades amb la correcció, en particular, la capacitat de desar els esdeveniments no enviats en una memòria intermèdia del disc i girar fitxers.
Arquitectònicament, Vector és un encaminador d'esdeveniments que rep missatges d'un o més fonts, aplicant opcionalment sobre aquests missatges transformacions, i enviant-los a un o més desguassos.
Vector és un substitut de filebeat i logstash, pot actuar en ambdues funcions (rebre i enviar registres), més detalls sobre ells Online.
Si a Logstash la cadena es construeix com a entrada → filtre → sortida, a Vector ho és fonts → transformacions → s’enfonsa
Es poden trobar exemples a la documentació.
Aquesta instrucció és una instrucció revisada de Viatxeslav Rakhinsky. Les instruccions originals contenen el processament de geoip. Quan es va provar geoip des d'una xarxa interna, el vector va donar un error.
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
Si algú necessita processar geoip, consulteu les instruccions originals de Viatxeslav Rakhinsky.
Configurarem la combinació de Nginx (Registres d'accés) → Vector (Client | Filebeat) → Vector (Servidor | Logstash) → per separat a Clickhouse i per separat a Elasticsearch. Instal·larem 4 servidors. Encara que es pot evitar amb 3 servidors.
L'esquema és una cosa així.
Desactiveu Selinux a tots els vostres servidors
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Instal·lem un emulador de servidor HTTP + utilitats a tots els servidors
ClickHouse utilitza el conjunt d'instruccions SSE 4.2, de manera que tret que s'especifiqui el contrari, el suport al processador utilitzat es converteix en un requisit addicional del sistema. Aquí teniu l'ordre per comprovar si el processador actual admet SSE 4.2:
Configuració d'Elasticsearch per al mode d'un sol node 1 fragment, 0 rèplica. El més probable és que tingueu un clúster d'un gran nombre de servidors i no cal que ho feu.
Per a índexs futurs, actualitzeu la plantilla predeterminada:
Després de crear les taules, podeu executar Vector
systemctl enable vector
systemctl start vector
Els registres vectorials es poden veure així:
journalctl -f -u vector
Hi hauria d'haver entrades com aquesta als registres
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Al client (servidor web) - 1r servidor
Al servidor amb nginx, heu de desactivar ipv6, ja que la taula de registres de clickhouse utilitza el camp upstream_addr IPv4, ja que no faig servir ipv6 dins de la xarxa. Si ipv6 no està desactivat, hi haurà errors:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Potser lectors, afegiu suport ipv6.
Creeu el fitxer /etc/sysctl.d/98-disable-ipv6.conf
Primer, hem de configurar el format de registre a Nginx al fitxer /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;
}
Per no trencar la vostra configuració actual, Nginx us permet tenir diverses directives access_log
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
No oblideu afegir una regla a logrotate per als registres nous (si el fitxer de registre no acaba amb .log)
I configureu el reemplaçament de Filebeat a la configuració /etc/vector/vector.toml. L'adreça IP 172.26.10.108 és l'adreça IP del servidor de registre (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"
No us oblideu d'afegir l'usuari del vector al grup necessari perquè pugui llegir els fitxers de registre. Per exemple, nginx a centos crea registres amb drets de grup adm.
usermod -a -G adm vector
Comencem el servei vectorial
systemctl enable vector
systemctl start vector
Els registres vectorials es poden veure així:
journalctl -f -u vector
Hi hauria d'haver una entrada com aquesta als registres
INFO vector::topology::builder: Healthcheck: Passed.
Proves d'estrès
Realitzem proves amb Apache benchmark.
El paquet httpd-tools es va instal·lar a tots els servidors
Comencem a provar amb Apache benchmark de 4 servidors diferents a la pantalla. Primer, iniciem el multiplexor del terminal de pantalla i, a continuació, comencem a provar amb el punt de referència d'Apache. Com treballar amb la pantalla es pot trobar a article.
Del 1r servidor
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Del 2r servidor
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Del 3r servidor
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Del 4r servidor
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;
Descobrim quants registres van ocupar Clickhouse.
La mida de la taula de registres és de 857.19 MB.
La mida de les mateixes dades a l'índex a Elasticsearch és de 4,5 GB.
Si no especifiqueu dades al vector als paràmetres, Clickhouse triga 4500/857.19 = 5.24 vegades menys que a Elasticsearch.
En vector, el camp de compressió s'utilitza per defecte.