Ditulis dalam bahasa Rust, ia dicirikan oleh prestasi tinggi dan penggunaan RAM yang rendah berbanding dengan analognya. Di samping itu, banyak perhatian diberikan kepada fungsi yang berkaitan dengan ketepatan, khususnya, keupayaan untuk menyimpan peristiwa yang tidak dihantar ke penimbal pada cakera dan memutar fail.
Dari segi seni bina, Vektor ialah penghala acara yang menerima mesej daripada satu atau lebih sumber, secara pilihan menggunakan mesej ini transformasi, dan menghantarnya kepada satu atau lebih longkang.
Vektor ialah pengganti untuk filebeat dan logstash, ia boleh bertindak dalam kedua-dua peranan (menerima dan menghantar log), butiran lanjut mengenainya Online.
Jika dalam Logstash rantai dibina sebagai input → penapis → output maka dalam Vektor ia adalah sumber → jelmaan → tenggelam
Contoh boleh didapati dalam dokumentasi.
Arahan ini adalah arahan semakan daripada Vyacheslav Rakhinsky. Arahan asal mengandungi pemprosesan geoip. Apabila menguji geoip daripada rangkaian dalaman, vektor memberikan ralat.
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
Jika sesiapa perlu memproses geoip, maka rujuk kepada arahan asal daripada Vyacheslav Rakhinsky.
Kami akan mengkonfigurasi gabungan Nginx (Log akses) → Vektor (Pelanggan | Filebeat) → Vektor (Pelayan | Logstash) → secara berasingan dalam Clickhouse dan secara berasingan dalam Elasticsearch. Kami akan memasang 4 pelayan. Walaupun anda boleh memintasnya dengan 3 pelayan.
Skimnya adalah seperti ini.
Lumpuhkan Selinux pada semua pelayan anda
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Kami memasang emulator pelayan HTTP + utiliti pada semua pelayan
ClickHouse menggunakan set arahan SSE 4.2, jadi melainkan dinyatakan sebaliknya, sokongan untuknya dalam pemproses yang digunakan menjadi keperluan sistem tambahan. Berikut ialah arahan untuk menyemak sama ada pemproses semasa menyokong SSE 4.2:
Mengkonfigurasi Elasticsearch untuk mod satu nod 1 shard, 0 replika. Kemungkinan besar anda akan mempunyai sekumpulan sejumlah besar pelayan dan anda tidak perlu melakukan ini.
Untuk indeks masa hadapan, kemas kini templat lalai:
Selepas mencipta jadual, anda boleh menjalankan Vector
systemctl enable vector
systemctl start vector
Log vektor boleh dilihat seperti ini:
journalctl -f -u vector
Perlu ada entri seperti ini dalam log
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Pada klien (Pelayan web) - pelayan pertama
Pada pelayan dengan nginx, anda perlu melumpuhkan ipv6, kerana jadual log dalam clickhouse menggunakan medan upstream_addr IPv4, kerana saya tidak menggunakan ipv6 di dalam rangkaian. Jika ipv6 tidak dimatikan, akan terdapat ralat:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Pertama, kita perlu mengkonfigurasi format log dalam Nginx dalam fail /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;
}
Untuk tidak memecahkan konfigurasi semasa anda, Nginx membenarkan anda mempunyai beberapa arahan access_log
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Jangan lupa untuk menambah peraturan untuk logrotate untuk log baharu (jika fail log tidak berakhir dengan .log)
Alih keluar default.conf daripada /etc/nginx/conf.d/
Dan konfigurasikan penggantian Filebeat dalam konfigurasi /etc/vector/vector.toml. Alamat IP 172.26.10.108 ialah alamat IP pelayan log (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"
Jangan lupa untuk menambah pengguna vektor ke kumpulan yang diperlukan supaya dia boleh membaca fail log. Contohnya, nginx dalam centos mencipta log dengan hak kumpulan adm.
usermod -a -G adm vector
Mari mulakan perkhidmatan vektor
systemctl enable vector
systemctl start vector
Log vektor boleh dilihat seperti ini:
journalctl -f -u vector
Patutnya ada entry macam ni dalam log
INFO vector::topology::builder: Healthcheck: Passed.
Ujian Tekanan
Pengujian dijalankan menggunakan penanda aras Apache.
Pakej httpd-tools telah dipasang pada semua pelayan
Kami mula menguji menggunakan penanda aras Apache daripada 4 pelayan berbeza dalam skrin. Mula-mula, kami melancarkan pemultipleks terminal skrin, dan kemudian kami mula menguji menggunakan penanda aras Apache. Cara bekerja dengan skrin yang anda boleh temui di artikel.
Dari pelayan pertama
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Dari pelayan pertama
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Dari pelayan pertama
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Dari pelayan pertama
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;
Mari kita ketahui jumlah log yang digunakan dalam Clickhouse.
Saiz jadual log ialah 857.19 MB.
Saiz data yang sama dalam indeks dalam Elasticsearch ialah 4,5GB.
Jika anda tidak menyatakan data dalam vektor dalam parameter, Clickhouse mengambil 4500/857.19 = 5.24 kali kurang daripada dalam Elasticsearch.
Dalam vektor, medan mampatan digunakan secara lalai.