Gisulat sa Rust nga pinulongan, kini gihulagway sa taas nga performance ug ubos nga konsumo sa RAM kumpara sa mga analogue niini. Dugang pa, daghang pagtagad ang gihatag sa mga gimbuhaton nga may kalabotan sa pagkatul-id, labi na, ang abilidad sa pagtipig sa wala ipadala nga mga panghitabo sa usa ka buffer sa disk ug pag-rotate sa mga file.
Sa arkitektura, ang Vector usa ka router sa panghitabo nga nakadawat mga mensahe gikan sa usa o daghan pa mga gigikanan, opsyonal nga mag-aplay niini nga mga mensahe mga pagbag-o, ug ipadala sila sa usa o daghan pa kanal.
Ang Vector usa ka puli sa filebeat ug logstash, mahimo kini molihok sa duha nga mga tahas (makadawat ug magpadala mga troso), daghang mga detalye bahin niini site.
Kini nga instruksyon kay giusab nga instruksyon gikan sa Vyacheslav Rakhinsky. Ang orihinal nga mga panudlo naglangkob sa pagproseso sa geoip. Kung gisulayan ang geoip gikan sa usa ka internal nga network, ang vector naghatag usa ka sayup.
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
Kung adunay kinahanglan nga magproseso sa geoip, i-refer ang orihinal nga mga panudlo gikan sa Vyacheslav Rakhinsky.
Atong i-configure ang kombinasyon sa Nginx (Access logs) → Vector (Client | Filebeat) → Vector (Server | Logstash) → gilain sa Clickhouse ug gilain sa Elasticsearch. Mag-instalar kami og 4 ka mga server. Bisan kung mahimo nimo kini laktawan sa 3 nga mga server.
Ang laraw sama niini.
I-disable ang Selinux sa tanan nimong mga server
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
Nag-instalar kami og HTTP server emulator + utilities sa tanang server
Gigamit sa ClickHouse ang set sa panudlo sa SSE 4.2, busa gawas kung gitakda, ang suporta alang niini sa gigamit nga processor mahimong dugang nga kinahanglanon sa sistema. Ania ang sugo sa pagsusi kon ang kasamtangan nga processor nagsuporta sa SSE 4.2:
Pag-configure sa Elasticsearch alang sa single-node mode 1 shard, 0 replica. Lagmit adunay usa ka kumpol sa daghang mga server ug dili nimo kinahanglan buhaton kini.
Para sa umaabot nga mga index, i-update ang default template:
Human sa paghimo sa mga lamesa, mahimo nimong ipadagan ang Vector
systemctl enable vector
systemctl start vector
Ang mga vector log mahimong tan-awon sama niini:
journalctl -f -u vector
Kinahanglan adunay mga entries nga sama niini sa mga log
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
Sa kliyente (Web server) - 1st server
Sa server nga adunay nginx, kinahanglan nimo nga i-disable ang ipv6, tungod kay ang logs table sa clickhouse naggamit sa field upstream_addr IPv4, tungod kay wala ko mogamit ipv6 sulod sa network. Kung ang ipv6 wala gipalong, adunay mga sayup:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
Tingali mga magbabasa, idugang ang suporta sa ipv6.
Paghimo sa file /etc/sysctl.d/98-disable-ipv6.conf
Una, kinahanglan natong i-configure ang log format sa Nginx sa 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;
}
Aron dili mabungkag ang imong kasamtangan nga pag-configure, gitugotan ka sa Nginx nga adunay daghang mga direktiba sa access_log
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
Ayaw kalimti ang pagdugang ug lagda sa pag-logrotate para sa mga bag-ong log (kung ang log file dili matapos sa .log)
Kuhaa ang default.conf gikan sa /etc/nginx/conf.d/
rm -f /etc/nginx/conf.d/default.conf
Idugang ang virtual host /etc/nginx/conf.d/vhost1.conf
Ug i-configure ang puli sa Filebeat sa /etc/vector/vector.toml config. Ang IP address 172.26.10.108 mao ang IP address sa log server (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"
Ayaw kalimti nga idugang ang vector user sa gikinahanglan nga grupo aron makabasa siya og mga log files. Pananglitan, ang nginx sa centos nagmugna og mga log nga adunay mga katungod sa adm group.
usermod -a -G adm vector
Atong sugdan ang serbisyo sa vector
systemctl enable vector
systemctl start vector
Ang mga vector log mahimong tan-awon sama niini:
journalctl -f -u vector
Kinahanglan adunay usa ka entry nga sama niini sa mga troso
INFO vector::topology::builder: Healthcheck: Passed.
Pagsulay sa Stress
Nagpahigayon kami og pagsulay gamit ang Apache benchmark.
Ang httpd-tools package na-install sa tanang server
Nagsugod kami sa pagsulay gamit ang Apache benchmark gikan sa 4 nga lainlaing mga server sa screen. Una, gilansad namo ang screen terminal multiplexer, ug dayon magsugod kami sa pagsulay gamit ang Apache benchmark. Giunsa pagtrabaho ang screen nga imong makit-an sa artikulo.
Gikan sa 1st server
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
Gikan sa 2st server
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
Gikan sa 3st server
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
Gikan sa 4st server
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;
Atong hibal-an kung pila ang nakuha nga mga troso sa Clickhouse.
Ang gidak-on sa lamesa sa mga troso mao ang 857.19 MB.
Ang gidak-on sa parehas nga datos sa indeks sa Elasticsearch mao ang 4,5GB.
Kung dili nimo ipiho ang datos sa vector sa mga parameter, ang Clickhouse nagkuha 4500/857.19 = 5.24 ka beses nga mas ubos kaysa sa Elasticsearch.
Sa vector, ang compression field gigamit nga default.