Ditulis dalam bahasa Rust, ini ditandai dengan kinerja tinggi dan konsumsi RAM yang rendah dibandingkan analognya. Selain itu, banyak perhatian diberikan pada fungsi yang terkait dengan kebenaran, khususnya, kemampuan untuk menyimpan peristiwa yang belum terkirim ke buffer pada disk dan memutar file.
Secara arsitektural, Vector adalah router peristiwa yang menerima pesan dari satu atau lebih sumber, secara opsional menerapkan pesan-pesan ini transformasi, dan mengirimkannya ke satu atau lebih saluran air.
Vektor adalah pengganti filebeat dan logstash, ia dapat bertindak dalam kedua peran (menerima dan mengirim log), detail lebih lanjut tentangnya Online.
Jika di Logstash rantai dibuat sebagai input → filter → output, maka di Vector demikian sumber → transformasi → tenggelam
Contohnya dapat ditemukan di dokumentasi.
Instruksi ini merupakan revisi instruksi dari Vyacheslav Rakhinsky. Instruksi asli berisi pemrosesan geoip. Saat menguji geoip dari jaringan internal, vektor memberikan kesalahan.
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 ada yang perlu memproses geoip, lihat instruksi asli dari Vyacheslav Rakhinsky.
Kami akan mengkonfigurasi kombinasi Nginx (Access logs) → Vector (Client | Filebeat) → Vector (Server | Logstash) → secara terpisah di Clickhouse dan secara terpisah di Elasticsearch. Kami akan menginstal 4 server. Meskipun Anda dapat mem-bypassnya dengan 3 server.
Skemanya kira-kira seperti ini.
Nonaktifkan Selinux di semua server Anda
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Kami memasang emulator server HTTP + utilitas di semua server
ClickHouse menggunakan set instruksi SSE 4.2, jadi kecuali ditentukan lain, dukungan untuk itu di prosesor yang digunakan menjadi persyaratan sistem tambahan. Berikut adalah perintah untuk memeriksa apakah prosesor saat ini mendukung SSE 4.2:
Mengonfigurasi Elasticsearch untuk mode simpul tunggal 1 pecahan, 0 replika. Kemungkinan besar Anda akan memiliki sekelompok server dalam jumlah besar dan Anda tidak perlu melakukan ini.
Untuk indeks di masa mendatang, perbarui templat default:
Setelah membuat tabel, Anda dapat menjalankan Vector
systemctl enable vector
systemctl start vector
Log vektor dapat dilihat seperti ini:
journalctl -f -u vector
Seharusnya ada entri seperti ini di log
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Di klien (server Web) - server pertama
Di server dengan nginx, Anda perlu menonaktifkan ipv6, karena tabel log di clickhouse menggunakan bidang tersebut upstream_addr IPv4, karena saya tidak menggunakan ipv6 di dalam jaringan. Jika ipv6 tidak dimatikan maka akan terjadi error:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Pertama, kita perlu mengkonfigurasi format log di Nginx di file /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;
}
Agar tidak merusak konfigurasi Anda saat ini, Nginx mengizinkan Anda memiliki beberapa arahan access_log
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Jangan lupa menambahkan aturan untuk logrotate untuk log baru (jika file log tidak diakhiri dengan .log)
Dan konfigurasikan pengganti Filebeat di konfigurasi /etc/vector/vector.toml. Alamat IP 172.26.10.108 adalah alamat IP server 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 menambahkan pengguna vektor ke grup yang diperlukan agar dia dapat membaca file log. Misalnya, nginx di centos membuat log dengan hak grup adm.
usermod -a -G adm vector
Mari kita mulai layanan vektor
systemctl enable vector
systemctl start vector
Log vektor dapat dilihat seperti ini:
journalctl -f -u vector
Seharusnya ada entri seperti ini di log
INFO vector::topology::builder: Healthcheck: Passed.
Pengujian Stres
Pengujian dilakukan dengan menggunakan benchmark Apache.
Paket httpd-tools telah diinstal di semua server
Kami memulai pengujian menggunakan benchmark Apache dari 4 server berbeda di layar. Pertama, kami meluncurkan multiplexer terminal layar, dan kemudian kami mulai menguji menggunakan benchmark Apache. Cara bekerja dengan layar dapat Anda temukan di Artikel.
Dari server pertama
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Dari server pertama
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Dari server pertama
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Dari server 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 cari tahu berapa banyak log yang digunakan di Clickhouse.
Ukuran tabel log adalah 857.19 MB.
Ukuran data yang sama dalam indeks di Elasticsearch adalah 4,5 GB.
Jika Anda tidak menentukan data dalam vektor di parameter, Clickhouse membutuhkan 4500/857.19 = 5.24 kali lebih sedikit daripada di Elasticsearch.
Dalam vektor, bidang kompresi digunakan secara default.