Écrit en langage Rust, il se caractérise par des performances élevées et une faible consommation de RAM par rapport à ses analogues. De plus, une grande attention est accordée aux fonctions liées à l'exactitude, en particulier à la possibilité de sauvegarder les événements non envoyés dans un tampon sur le disque et de faire pivoter les fichiers.
Sur le plan architectural, Vector est un routeur d'événements qui reçoit des messages d'un ou plusieurs des sources, en s'appliquant éventuellement sur ces messages transformations, et les envoyer à un ou plusieurs drains.
Vector remplace filebeat et logstash, il peut jouer les deux rôles (recevoir et envoyer des journaux), plus de détails à leur sujet En ligne.
Si dans Logstash la chaîne est construite comme entrée → filtre → sortie alors dans Vector elle est sources → se transforme →
Des exemples peuvent être trouvés dans la documentation.
Cette instruction est une instruction révisée de Viatcheslav Rakhinsky. Les instructions originales contiennent le traitement geoip. Lors du test de GeoIP à partir d'un réseau interne, Vector a généré une erreur.
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 quelqu'un a besoin de traiter GeoIP, reportez-vous aux instructions originales de Viatcheslav Rakhinsky.
Nous allons configurer la combinaison de Nginx (Journaux d'accès) → Vecteur (Client | Filebeat) → Vecteur (Serveur | Logstash) → séparément dans Clickhouse et séparément dans Elasticsearch. Nous installerons 4 serveurs. Bien que vous puissiez le contourner avec 3 serveurs.
Le schéma ressemble à ceci.
Désactivez Selinux sur tous vos serveurs
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Nous installons un émulateur de serveur HTTP + utilitaires sur tous les serveurs
ClickHouse utilise le jeu d'instructions SSE 4.2, donc sauf indication contraire, sa prise en charge dans le processeur utilisé devient une exigence système supplémentaire. Voici la commande pour vérifier si le processeur actuel prend en charge SSE 4.2 :
Configuration d'Elasticsearch pour le mode nœud unique 1 fragment, 0 réplica. Très probablement, vous disposerez d'un cluster composé d'un grand nombre de serveurs et vous n'aurez pas besoin de le faire.
Pour les futurs index, mettez à jour le modèle par défaut :
Après avoir créé les tables, vous pouvez exécuter Vector
systemctl enable vector
systemctl start vector
Les journaux vectoriels peuvent être visualisés comme ceci :
journalctl -f -u vector
Il devrait y avoir des entrées comme celle-ci dans les journaux
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Sur le client (serveur Web) - 1er serveur
Sur le serveur avec nginx, vous devez désactiver ipv6, car la table des journaux dans Clickhouse utilise le champ upstream_addr IPv4, puisque je n'utilise pas ipv6 à l'intérieur du réseau. Si ipv6 n'est pas désactivé, il y aura des erreurs :
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Peut-être que les lecteurs ajouteront le support ipv6.
Créez le fichier /etc/sysctl.d/98-disable-ipv6.conf
Tout d'abord, nous devons configurer le format du journal dans Nginx dans le fichier /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;
}
Afin de ne pas casser votre configuration actuelle, Nginx vous permet d'avoir plusieurs directives access_log
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
N'oubliez pas d'ajouter une règle pour logrotate pour les nouveaux logs (si le fichier log ne se termine pas par .log)
Supprimez default.conf de /etc/nginx/conf.d/
rm -f /etc/nginx/conf.d/default.conf
Ajouter un hôte virtuel /etc/nginx/conf.d/vhost1.conf
Et configurez le remplacement Filebeat dans la configuration /etc/vector/vector.toml. L'adresse IP 172.26.10.108 est l'adresse IP du serveur de journaux (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"
N'oubliez pas d'ajouter l'utilisateur vectoriel au groupe requis afin qu'il puisse lire les fichiers journaux. Par exemple, nginx dans centos crée des journaux avec les droits du groupe adm.
usermod -a -G adm vector
Commençons le service vectoriel
systemctl enable vector
systemctl start vector
Les journaux vectoriels peuvent être visualisés comme ceci :
journalctl -f -u vector
Il devrait y avoir une entrée comme celle-ci dans les journaux
INFO vector::topology::builder: Healthcheck: Passed.
Tests de résistance
Nous effectuons des tests à l'aide du benchmark Apache.
Le package httpd-tools a été installé sur tous les serveurs
Nous commençons les tests en utilisant le benchmark Apache à partir de 4 serveurs différents à l'écran. Tout d'abord, nous lançons le multiplexeur de terminal d'écran, puis nous commençons les tests à l'aide du benchmark Apache. Comment travailler avec l'écran que vous pouvez trouver dans article.
Depuis le 1er serveur
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Depuis le 2er serveur
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Depuis le 3er serveur
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Depuis le 4er serveur
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;
Voyons combien de journaux ont été utilisés dans Clickhouse.
La taille de la table des journaux est de 857.19 Mo.
La taille des mêmes données dans l'index dans Elasticsearch est de 4,5 Go.
Si vous ne spécifiez pas de données dans le vecteur dans les paramètres, Clickhouse prend 4500/857.19 = 5.24 fois moins que dans Elasticsearch.
En vecteur, le champ compression est utilisé par défaut.