Den är skriven på språket Rust och kännetecknas av hög prestanda och låg RAM-förbrukning jämfört med dess analoger. Dessutom ägnas mycket uppmärksamhet åt funktioner relaterade till korrekthet, i synnerhet möjligheten att spara osända händelser till en buffert på disken och rotera filer.
Arkitektoniskt är Vector en händelserouter som tar emot meddelanden från en eller flera källor, valfritt att tillämpa över dessa meddelanden transformationeroch skicka dem till en eller flera avlopp.
Vector är en ersättning för filebeat och logstash, den kan agera i båda rollerna (ta emot och skicka loggar), mer information om dem Online.
Om kedjan i Logstash är byggd som input → filter → output så är den det i Vector källor → transformer → sänkor
Exempel finns i dokumentationen.
Denna instruktion är en reviderad instruktion från Vyacheslav Rakhinsky. De ursprungliga instruktionerna innehåller geoip-bearbetning. När man testade geoip från ett internt nätverk gav vektor ett fel.
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
Om någon behöver bearbeta geoip, se originalinstruktionerna från Vyacheslav Rakhinsky.
Vi kommer att konfigurera kombinationen av Nginx (Access logs) → Vector (Client | Filebeat) → Vector (Server | Logstash) → separat i Clickhouse och separat i Elasticsearch. Vi kommer att installera 4 servrar. Även om du kan kringgå det med 3 servrar.
Upplägget är ungefär så här.
Inaktivera Selinux på alla dina servrar
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Vi installerar en HTTP-serveremulator + verktyg på alla servrar
ClickHouse använder SSE 4.2-instruktionsuppsättningen, så om inget annat anges blir stöd för det i den processor som används ett ytterligare systemkrav. Här är kommandot för att kontrollera om den aktuella processorn stöder SSE 4.2:
Konfigurera Elasticsearch för läge med en nod 1 shard, 0 replika. Troligtvis kommer du att ha ett kluster med ett stort antal servrar och du behöver inte göra detta.
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
På klienten (webbserver) - 1:a server
På servern med nginx måste du inaktivera ipv6, eftersom loggtabellen i clickhouse använder fältet upstream_addr IPv4, eftersom jag inte använder ipv6 i nätverket. Om ipv6 inte är avstängd kommer det att uppstå fel:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Först måste vi konfigurera loggformatet i Nginx i filen /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;
}
För att inte bryta din nuvarande konfiguration låter Nginx dig ha flera access_log-direktiv
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Glöm inte att lägga till en regel för att logrotera för nya loggar (om loggfilen inte slutar med .log)
Ta bort default.conf från /etc/nginx/conf.d/
rm -f /etc/nginx/conf.d/default.conf
Lägg till virtuell värd /etc/nginx/conf.d/vhost1.conf
Och konfigurera Filebeat-ersättningen i /etc/vector/vector.toml config. IP-adress 172.26.10.108 är IP-adressen för loggservern (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"
Glöm inte att lägga till vektoranvändaren till den önskade gruppen så att han kan läsa loggfiler. Till exempel skapar nginx i centos loggar med adm-grupprättigheter.
usermod -a -G adm vector
Låt oss starta vektortjänsten
systemctl enable vector
systemctl start vector
Vektorloggar kan ses så här:
journalctl -f -u vector
Det borde finnas en sådan post i loggarna
INFO vector::topology::builder: Healthcheck: Passed.
Stresstestning
Vi utför tester med Apache benchmark.
Paketet httpd-tools installerades på alla servrar
Vi börjar testa med Apache benchmark från 4 olika servrar på skärmen. Först startar vi skärmterminalmultiplexern och sedan börjar vi testa med Apache-riktmärket. Hur man arbetar med skärm hittar du i artikeln.
Från 1:a servern
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Från 2:a servern
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Från 3:a servern
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Från 4:a servern
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;
Låt oss ta reda på hur mycket stockar tog upp i Clickhouse.
Loggtabellens storlek är 857.19 MB.
Storleken på samma data i indexet i Elasticsearch är 4,5 GB.
Om du inte anger data i vektorn i parametrarna tar Clickhouse 4500/857.19 = 5.24 gånger mindre än i Elasticsearch.
I vektor används komprimeringsfältet som standard.