Όντας γραμμένο στη γλώσσα Rust, χαρακτηρίζεται από υψηλή απόδοση και χαμηλή κατανάλωση RAM σε σύγκριση με τα ανάλογα του. Επιπλέον, δίνεται μεγάλη προσοχή σε λειτουργίες που σχετίζονται με την ορθότητα, ειδικότερα, στη δυνατότητα αποθήκευσης μη απεσταλμένων συμβάντων σε μια προσωρινή μνήμη στο δίσκο και περιστροφής αρχείων.
Αρχιτεκτονικά, το Vector είναι ένας δρομολογητής συμβάντων που λαμβάνει μηνύματα από έναν ή περισσότερους πηγές, προαιρετικά εφαρμόζεται πάνω από αυτά τα μηνύματα μεταμορφώσεις, και αποστολή τους σε ένα ή περισσότερα αποχέτευση.
Το Vector αντικαθιστά το filebeat και το logstash, μπορεί να ενεργήσει και στους δύο ρόλους (λήψη και αποστολή αρχείων καταγραφής), περισσότερες λεπτομέρειες για αυτούς Σε απευθείας σύνδεση.
Αν στο Logstash η αλυσίδα είναι χτισμένη ως είσοδος → φίλτρο → έξοδος τότε στο Vector είναι πηγές → μετασχηματισμών → νεροχύτες
Παραδείγματα μπορείτε να βρείτε στην τεκμηρίωση.
Αυτή η οδηγία είναι μια αναθεωρημένη οδηγία από Βιάτσεσλαβ Ρακίνσκι. Οι πρωτότυπες οδηγίες περιέχουν επεξεργασία geoip. Κατά τη δοκιμή του geoip από ένα εσωτερικό δίκτυο, το vector έδωσε ένα σφάλμα.
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
Εάν κάποιος χρειάζεται να επεξεργαστεί το geoip, τότε ανατρέξτε στις αρχικές οδηγίες από Βιάτσεσλαβ Ρακίνσκι.
Θα διαμορφώσουμε τον συνδυασμό Nginx (Αρχεία καταγραφής πρόσβασης) → Vector (Πελάτης | Filebeat) → Vector (Διακομιστής | Logstash) → ξεχωριστά στο Clickhouse και ξεχωριστά στο Elasticsearch. Θα εγκαταστήσουμε 4 διακομιστές. Αν και μπορείτε να το παρακάμψετε με 3 διακομιστές.
Το σχέδιο είναι κάπως έτσι.
Απενεργοποιήστε το Selinux σε όλους τους διακομιστές σας
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Εγκαθιστούμε έναν εξομοιωτή διακομιστή HTTP + βοηθητικά προγράμματα σε όλους τους διακομιστές
Εγκαταστήστε το nodejs-stub-server, το Apache benchmark και τον πολυπλέκτη τερματικού οθόνης σε όλους τους διακομιστές
yum -y install stub_http_server screen mc httpd-tools screen
Διόρθωσα τον χρόνο απόκρισης stub_http_server στο αρχείο /var/lib/stub_http_server/stub_http_server.js έτσι ώστε να υπάρχουν περισσότερα αρχεία καταγραφής.
Το ClickHouse χρησιμοποιεί το σύνολο εντολών SSE 4.2, επομένως, εκτός εάν ορίζεται διαφορετικά, η υποστήριξή του στον επεξεργαστή που χρησιμοποιείται γίνεται μια πρόσθετη απαίτηση συστήματος. Ακολουθεί η εντολή για να ελέγξετε εάν ο τρέχων επεξεργαστής υποστηρίζει το SSE 4.2:
Διαμόρφωση Elasticsearch για λειτουργία μονού κόμβου 1 θραύσμα, 0 αντίγραφο. Πιθανότατα θα έχετε ένα σύμπλεγμα μεγάλου αριθμού διακομιστών και δεν χρειάζεται να το κάνετε αυτό.
Για μελλοντικά ευρετήρια, ενημερώστε το προεπιλεγμένο πρότυπο:
Αφού δημιουργήσετε τους πίνακες, μπορείτε να εκτελέσετε το Vector
systemctl enable vector
systemctl start vector
Τα διανυσματικά αρχεία καταγραφής μπορούν να προβληθούν ως εξής:
journalctl -f -u vector
Θα πρέπει να υπάρχουν καταχωρήσεις όπως αυτή στα αρχεία καταγραφής
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Στον πελάτη (διακομιστής Ιστού) - 1ος διακομιστής
Στον διακομιστή με nginx, πρέπει να απενεργοποιήσετε το ipv6, καθώς ο πίνακας αρχείων καταγραφής στο clickhouse χρησιμοποιεί το πεδίο upstream_addr IPv4, αφού δεν χρησιμοποιώ το ipv6 μέσα στο δίκτυο. Εάν το ipv6 δεν είναι απενεργοποιημένο, θα υπάρξουν σφάλματα:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Ίσως οι αναγνώστες, προσθέστε υποστήριξη ipv6.
Δημιουργήστε το αρχείο /etc/sysctl.d/98-disable-ipv6.conf
Αρχικά, πρέπει να διαμορφώσουμε τη μορφή αρχείου καταγραφής στο Nginx στο αρχείο /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;
}
Για να μην σπάσει η τρέχουσα διαμόρφωση, το Nginx σάς επιτρέπει να έχετε πολλές οδηγίες πρόσβασης_καταγραφής
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Μην ξεχάσετε να προσθέσετε έναν κανόνα για logrotate για νέα αρχεία καταγραφής (εάν το αρχείο καταγραφής δεν τελειώνει σε .log)
Προσθέστε εικονικούς κεντρικούς υπολογιστές (172.26.10.106 ip του διακομιστή όπου είναι εγκατεστημένο το nginx) σε όλους τους διακομιστές στο αρχείο /etc/hosts:
Και ρυθμίστε την αντικατάσταση του Filebeat στη ρύθμιση παραμέτρων /etc/vector/vector.toml. Η διεύθυνση IP 172.26.10.108 είναι η διεύθυνση IP του διακομιστή καταγραφής (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"
Μην ξεχάσετε να προσθέσετε τον χρήστη διάνυσμα στην απαιτούμενη ομάδα, ώστε να μπορεί να διαβάζει αρχεία καταγραφής. Για παράδειγμα, το nginx στο centos δημιουργεί αρχεία καταγραφής με δικαιώματα ομάδας adm.
usermod -a -G adm vector
Ας ξεκινήσουμε την υπηρεσία vector
systemctl enable vector
systemctl start vector
Τα διανυσματικά αρχεία καταγραφής μπορούν να προβληθούν ως εξής:
journalctl -f -u vector
Θα πρέπει να υπάρχει μια καταχώρηση σαν αυτή στα αρχεία καταγραφής
INFO vector::topology::builder: Healthcheck: Passed.
Stress Testing
Πραγματοποιούμε δοκιμές χρησιμοποιώντας το Apache benchmark.
Το πακέτο httpd-tools εγκαταστάθηκε σε όλους τους διακομιστές
Ξεκινάμε τη δοκιμή χρησιμοποιώντας το Apache benchmark από 4 διαφορετικούς διακομιστές στην οθόνη. Αρχικά, εκκινούμε τον πολυπλέκτη τερματικού οθόνης και, στη συνέχεια, ξεκινάμε τη δοκιμή χρησιμοποιώντας το σημείο αναφοράς Apache. Πώς να εργαστείτε με την οθόνη που μπορείτε να βρείτε άρθρο.
Από τον 1ο διακομιστή
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Από τον 2ο διακομιστή
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Από τον 3ο διακομιστή
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Από τον 4ο διακομιστή
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;
Ας μάθουμε πόσα αρχεία καταγραφής καταγράφηκαν στο Clickhouse.
Το μέγεθος του πίνακα καταγραφής είναι 857.19 MB.
Το μέγεθος των ίδιων δεδομένων στο ευρετήριο στο Elasticsearch είναι 4,5 GB.
Εάν δεν καθορίσετε δεδομένα στο διάνυσμα στις παραμέτρους, το Clickhouse παίρνει 4500/857.19 = 5.24 φορές λιγότερο από ό,τι στο Elasticsearch.
Στο vector, το πεδίο συμπίεσης χρησιμοποιείται από προεπιλογή.