Da es in der Rust-Sprache geschrieben ist, zeichnet es sich im Vergleich zu seinen Gegenstücken durch hohe Leistung und geringen RAM-Verbrauch aus. Darüber hinaus wird großen Wert auf Funktionen im Zusammenhang mit der Korrektheit gelegt, insbesondere auf die Möglichkeit, nicht gesendete Ereignisse in einem Puffer auf der Festplatte zu speichern und Dateien zu rotieren.
Architektonisch ist Vector ein Event-Router, der Nachrichten von einem oder mehreren empfängt von Quellen, optional auf diese Nachrichten anwendend Transformationen, und senden Sie sie an einen oder mehrere Abflüsse.
Vector ist ein Ersatz für Filebeat und Logstash, es kann in beiden Rollen agieren (Protokolle empfangen und senden), weitere Details dazu Webseite.
Wenn in Logstash die Kette als Eingabe → Filter → Ausgabe aufgebaut ist, dann ist dies in Vector der Fall Quellen → Transformationen → Senken
Beispiele finden Sie in der Dokumentation.
Bei dieser Anleitung handelt es sich um eine überarbeitete Anleitung von Wjatscheslaw Rachinski. Die Originalanleitung enthält GeoIP-Verarbeitung. Beim Testen von GeoIP aus einem internen Netzwerk gab Vector einen Fehler aus.
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
Wenn jemand GeoIP verarbeiten muss, lesen Sie die Originalanweisungen von Wjatscheslaw Rachinski.
Wir werden die Kombination von Nginx (Zugriffsprotokolle) → Vector (Client | Filebeat) → Vector (Server | Logstash) → separat in Clickhouse und separat in Elasticsearch konfigurieren. Wir werden 4 Server installieren. Obwohl Sie es mit 3 Servern umgehen können.
Das Schema ist ungefähr so.
Deaktivieren Sie Selinux auf allen Ihren Servern
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Wir installieren auf allen Servern einen HTTP-Server-Emulator + Dienstprogramme
Installieren Sie nodejs-stub-server, Apache Benchmark und Screen Terminal Multiplexer auf allen Servern
yum -y install stub_http_server screen mc httpd-tools screen
Ich habe die Antwortzeit von stub_http_server in der Datei /var/lib/stub_http_server/stub_http_server.js korrigiert, sodass mehr Protokolle vorhanden waren.
ClickHouse verwendet den SSE 4.2-Befehlssatz. Sofern nicht anders angegeben, ist die Unterstützung dafür im verwendeten Prozessor eine zusätzliche Systemanforderung. Hier ist der Befehl, um zu überprüfen, ob der aktuelle Prozessor SSE 4.2 unterstützt:
Konfigurieren von Elasticsearch für den Einzelknotenmodus 1 Shard, 0 Replikat. Höchstwahrscheinlich verfügen Sie über einen Cluster mit einer großen Anzahl von Servern und müssen dies nicht tun.
Aktualisieren Sie für zukünftige Indizes die Standardvorlage:
Nachdem Sie die Tabellen erstellt haben, können Sie Vector ausführen
systemctl enable vector
systemctl start vector
Vektorprotokolle können wie folgt angezeigt werden:
journalctl -f -u vector
Solche Einträge sollten in den Protokollen vorhanden sein
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Auf dem Client (Webserver) - 1. Server
Auf dem Server mit Nginx müssen Sie IPv6 deaktivieren, da die Protokolltabelle in Clickhouse das Feld verwendet upstream_addr IPv4, da ich im Netzwerk kein IPv6 verwende. Wenn IPv6 nicht deaktiviert ist, treten folgende Fehler auf:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Vielleicht, liebe Leser, fügen Sie IPv6-Unterstützung hinzu.
Erstellen Sie die Datei /etc/sysctl.d/98-disable-ipv6.conf
Zuerst müssen wir das Protokollformat in Nginx in der Datei /etc/nginx/nginx.conf konfigurieren
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;
}
Um Ihre aktuelle Konfiguration nicht zu beschädigen, ermöglicht Ihnen Nginx die Verwendung mehrerer access_log-Anweisungen
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Vergessen Sie nicht, eine Regel zu logrotate für neue Protokolle hinzuzufügen (wenn die Protokolldatei nicht mit .log endet).
Entfernen Sie default.conf aus /etc/nginx/conf.d/
rm -f /etc/nginx/conf.d/default.conf
Fügen Sie den virtuellen Host /etc/nginx/conf.d/vhost1.conf hinzu
Und konfigurieren Sie den Filebeat-Ersatz in der Konfiguration /etc/vector/vector.toml. IP-Adresse 172.26.10.108 ist die IP-Adresse des Log-Servers (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"
Vergessen Sie nicht, den Vektorbenutzer zur erforderlichen Gruppe hinzuzufügen, damit er Protokolldateien lesen kann. Beispielsweise erstellt Nginx in Centos Protokolle mit Adm-Gruppenrechten.
usermod -a -G adm vector
Starten wir den Vektordienst
systemctl enable vector
systemctl start vector
Vektorprotokolle können wie folgt angezeigt werden:
journalctl -f -u vector
Es sollte einen solchen Eintrag in den Protokollen geben
INFO vector::topology::builder: Healthcheck: Passed.
Belastbarkeitstest
Die Tests werden mit dem Apache-Benchmark durchgeführt.
Das httpd-tools-Paket wurde auf allen Servern installiert
Wir beginnen mit dem Testen mithilfe des Apache-Benchmarks von 4 verschiedenen Servern im Bildschirm. Zuerst starten wir den Screen-Terminal-Multiplexer und beginnen dann mit dem Testen mithilfe des Apache-Benchmarks. Wie Sie mit dem Bildschirm arbeiten, erfahren Sie in Artikel.
Vom 1. Server
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Vom 2. Server
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Vom 3. Server
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Vom 4. Server
while true; do ab -H "User-Agent: 4server" -c 100 -n 10 -t 10 http://vhost4/; sleep 1; done
Finden Sie die Größe der Tische in Clickhouse heraus
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;
Lassen Sie uns herausfinden, wie viele Protokolle in Clickhouse beansprucht wurden.
Die Größe der Protokolltabelle beträgt 857.19 MB.
Die Größe derselben Daten im Index in Elasticsearch beträgt 4,5 GB.
Wenn Sie in den Parametern keine Daten im Vektor angeben, benötigt Clickhouse 4500/857.19 = 5.24-mal weniger als in Elasticsearch.
Im Vektor wird standardmäßig das Komprimierungsfeld verwendet.