
, designet til at indsamle, transformere og sende logdata, metrics og hændelser.
→
Den er skrevet på Rust-sproget og er kendetegnet ved høj ydeevne og lavt RAM-forbrug sammenlignet med dets analoger. Derudover er der meget opmærksomhed på funktioner relateret til korrekthed, især evnen til at gemme usendte hændelser til en buffer på disken og rotere filer.
Arkitektonisk er Vector en hændelsesrouter, der modtager beskeder fra en eller flere kilder, eventuelt anvende over disse meddelelser transformationer, og sende dem til en eller flere afløb.
Vector er en erstatning for filebeat og logstash, den kan fungere i begge roller (modtage og sende logfiler), flere detaljer om dem .
Hvis kæden i Logstash er bygget som input → filter → output, så er den det i Vector → →
Eksempler kan findes i dokumentationen.
Denne vejledning er en revideret vejledning fra . De originale instruktioner indeholder geoip-behandling. Ved test af geoip fra et internt netværk gav vektor en fejl.
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=30Hvis nogen skal behandle geoip, så se den originale vejledning fra .
Vi konfigurerer kombinationen af Nginx (Adgangslogfiler) → Vektor (Client | Filebeat) → Vektor (Server | Logstash) → separat i Clickhouse og separat i Elasticsearch. Vi installerer 4 servere. Selvom du kan omgå det med 3 servere.

Ordningen er sådan noget.
Deaktiver Selinux på alle dine servere
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
rebootVi installerer en HTTP-serveremulator + hjælpeprogrammer på alle servere
Som en HTTP-serveremulator vil vi bruge fra
Nodejs-stub-server har ikke en rpm. lav rpm til det. rpm vil blive kompileret vha
Tilføj antonpatsev/nodejs-stub-server-depotet
yum -y install yum-plugin-copr epel-release
yes | yum copr enable antonpatsev/nodejs-stub-serverInstaller nodejs-stub-server, Apache benchmark og screen terminal multiplexer på alle servere
yum -y install stub_http_server screen mc httpd-tools screenJeg rettede stub_http_server-svartiden i filen /var/lib/stub_http_server/stub_http_server.js, så der var flere logfiler.
var max_sleep = 10;Lad os starte stub_http_server.
systemctl start stub_http_server
systemctl enable stub_http_serverpå server 3
ClickHouse bruger SSE 4.2-instruktionssættet, så medmindre andet er angivet, bliver understøttelse af det i den anvendte processor et ekstra systemkrav. Her er kommandoen til at kontrollere, om den aktuelle processor understøtter SSE 4.2:
grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"Først skal du forbinde det officielle lager:
sudo yum install -y yum-utils
sudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG
sudo yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/stable/x86_64For at installere pakker skal du køre følgende kommandoer:
sudo yum install -y clickhouse-server clickhouse-clientTillad clickhouse-server at lytte til netværkskortet i filen /etc/clickhouse-server/config.xml
<listen_host>0.0.0.0</listen_host>Ændring af logningsniveauet fra sporing til debug
debug
Standard komprimeringsindstillinger:
min_compress_block_size 65536
max_compress_block_size 1048576For at aktivere Zstd-komprimering blev det anbefalet ikke at røre ved konfigurationen, men snarere at bruge DDL.

Jeg kunne ikke finde, hvordan man bruger zstd-komprimering via DDL i Google. Så jeg lod det være som det er.
Kolleger, der bruger zstd-komprimering i Clickhouse, del venligst instruktionerne.
For at starte serveren som en dæmon skal du køre:
service clickhouse-server startLad os nu gå videre til at opsætte Clickhouse
Gå til Clickhouse
clickhouse-client -h 172.26.10.109 -m172.26.10.109 — IP på serveren, hvor Clickhouse er installeret.
Lad os oprette en vektordatabase
CREATE DATABASE vector;Lad os kontrollere, at databasen eksisterer.
show databases;Opret en vector.logs tabel.
/* Это таблица где хранятся логи как есть */
CREATE TABLE vector.logs
(
`node_name` String,
`timestamp` DateTime,
`server_name` String,
`user_id` String,
`request_full` String,
`request_user_agent` String,
`request_http_host` String,
`request_uri` String,
`request_scheme` String,
`request_method` String,
`request_length` UInt64,
`request_time` Float32,
`request_referrer` String,
`response_status` UInt16,
`response_body_bytes_sent` UInt64,
`response_content_type` String,
`remote_addr` IPv4,
`remote_port` UInt32,
`remote_user` String,
`upstream_addr` IPv4,
`upstream_port` UInt32,
`upstream_bytes_received` UInt64,
`upstream_bytes_sent` UInt64,
`upstream_cache_status` String,
`upstream_connect_time` Float32,
`upstream_header_time` Float32,
`upstream_response_length` UInt64,
`upstream_response_time` Float32,
`upstream_status` UInt16,
`upstream_content_type` String,
INDEX idx_http_host request_http_host TYPE set(0) GRANULARITY 1
)
ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(timestamp)
ORDER BY timestamp
TTL timestamp + toIntervalMonth(1)
SETTINGS index_granularity = 8192;Vi tjekker, at tabellerne er oprettet. Lad os starte clickhouse-client og lav en anmodning.
Lad os gå til vektordatabasen.
use vector;
Ok.
0 rows in set. Elapsed: 0.001 sec.Lad os se på tabellerne.
show tables;
┌─name────────────────┐
│ logs │
└─────────────────────┘Installation af elasticsearch på den 4. server for at sende de samme data til Elasticsearch til sammenligning med Clickhouse
Tilføj en offentlig rpm-nøgle
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearchLad os oprette 2 repo:
/etc/yum.repos.d/elasticsearch.repo
[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md/etc/yum.repos.d/kibana.repo
[kibana-7.x]
name=Kibana repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-mdInstaller elasticsearch og kibana
yum install -y kibana elasticsearchDa det vil være i 1 kopi, skal du tilføje følgende til filen /etc/elasticsearch/elasticsearch.yml:
discovery.type: single-nodeSå den vektor kan sende data til elasticsearch fra en anden server, lad os ændre network.host.
network.host: 0.0.0.0For at oprette forbindelse til kibana skal du ændre parameteren server.host i filen /etc/kibana/kibana.yml
server.host: "0.0.0.0"Gammel og inkluderer elastisk søgning i autostart
systemctl enable elasticsearch
systemctl start elasticsearchog kibana
systemctl enable kibana
systemctl start kibanaKonfiguration af Elasticsearch til single-node-tilstand 1 shard, 0 replika. Mest sandsynligt vil du have en klynge af et stort antal servere, og du behøver ikke at gøre dette.
For fremtidige indekser skal du opdatere standardskabelonen:
curl -X PUT http://localhost:9200/_template/default -H 'Content-Type: application/json' -d '{"index_patterns": ["*"],"order": -1,"settings": {"number_of_shards": "1","number_of_replicas": "0"}}' Installation som erstatning for Logstash på server 2
yum install -y https://packages.timber.io/vector/0.9.X/vector-x86_64.rpm mc httpd-tools screenLad os sætte Vector op som en erstatning for Logstash. Redigering af filen /etc/vector/vector.toml
# /etc/vector/vector.toml
data_dir = "/var/lib/vector"
[sources.nginx_input_vector]
# General
type = "vector"
address = "0.0.0.0:9876"
shutdown_timeout_secs = 30
[transforms.nginx_parse_json]
inputs = [ "nginx_input_vector" ]
type = "json_parser"
[transforms.nginx_parse_add_defaults]
inputs = [ "nginx_parse_json" ]
type = "lua"
version = "2"
hooks.process = """
function (event, emit)
function split_first(s, delimiter)
result = {};
for match in (s..delimiter):gmatch("(.-)"..delimiter) do
table.insert(result, match);
end
return result[1];
end
function split_last(s, delimiter)
result = {};
for match in (s..delimiter):gmatch("(.-)"..delimiter) do
table.insert(result, match);
end
return result[#result];
end
event.log.upstream_addr = split_first(split_last(event.log.upstream_addr, ', '), ':')
event.log.upstream_bytes_received = split_last(event.log.upstream_bytes_received, ', ')
event.log.upstream_bytes_sent = split_last(event.log.upstream_bytes_sent, ', ')
event.log.upstream_connect_time = split_last(event.log.upstream_connect_time, ', ')
event.log.upstream_header_time = split_last(event.log.upstream_header_time, ', ')
event.log.upstream_response_length = split_last(event.log.upstream_response_length, ', ')
event.log.upstream_response_time = split_last(event.log.upstream_response_time, ', ')
event.log.upstream_status = split_last(event.log.upstream_status, ', ')
if event.log.upstream_addr == "" then
event.log.upstream_addr = "127.0.0.1"
end
if (event.log.upstream_bytes_received == "-" or event.log.upstream_bytes_received == "") then
event.log.upstream_bytes_received = "0"
end
if (event.log.upstream_bytes_sent == "-" or event.log.upstream_bytes_sent == "") then
event.log.upstream_bytes_sent = "0"
end
if event.log.upstream_cache_status == "" then
event.log.upstream_cache_status = "DISABLED"
end
if (event.log.upstream_connect_time == "-" or event.log.upstream_connect_time == "") then
event.log.upstream_connect_time = "0"
end
if (event.log.upstream_header_time == "-" or event.log.upstream_header_time == "") then
event.log.upstream_header_time = "0"
end
if (event.log.upstream_response_length == "-" or event.log.upstream_response_length == "") then
event.log.upstream_response_length = "0"
end
if (event.log.upstream_response_time == "-" or event.log.upstream_response_time == "") then
event.log.upstream_response_time = "0"
end
if (event.log.upstream_status == "-" or event.log.upstream_status == "") then
event.log.upstream_status = "0"
end
emit(event)
end
"""
[transforms.nginx_parse_remove_fields]
inputs = [ "nginx_parse_add_defaults" ]
type = "remove_fields"
fields = ["data", "file", "host", "source_type"]
[transforms.nginx_parse_coercer]
type = "coercer"
inputs = ["nginx_parse_remove_fields"]
types.request_length = "int"
types.request_time = "float"
types.response_status = "int"
types.response_body_bytes_sent = "int"
types.remote_port = "int"
types.upstream_bytes_received = "int"
types.upstream_bytes_send = "int"
types.upstream_connect_time = "float"
types.upstream_header_time = "float"
types.upstream_response_length = "int"
types.upstream_response_time = "float"
types.upstream_status = "int"
types.timestamp = "timestamp"
[sinks.nginx_output_clickhouse]
inputs = ["nginx_parse_coercer"]
type = "clickhouse"
database = "vector"
healthcheck = true
host = "http://172.26.10.109:8123" # Адрес Clickhouse
table = "logs"
encoding.timestamp_format = "unix"
buffer.type = "disk"
buffer.max_size = 104900000
buffer.when_full = "block"
request.in_flight_limit = 20
[sinks.elasticsearch]
type = "elasticsearch"
inputs = ["nginx_parse_coercer"]
compression = "none"
healthcheck = true
# 172.26.10.116 - сервер где установен elasticsearch
host = "http://172.26.10.116:9200"
index = "vector-%Y-%m-%d"Du kan justere sektionen transforms.nginx_parse_add_defaults.
siden bruger disse konfigurationer til et lille CDN, og der kan være flere værdier i upstream_*
For eksempel:
"upstream_addr": "128.66.0.10:443, 128.66.0.11:443, 128.66.0.12:443"
"upstream_bytes_received": "-, -, 123"
"upstream_status": "502, 502, 200"Hvis dette ikke er din situation, kan dette afsnit forenkles
Lad os oprette serviceindstillinger for systemd /etc/systemd/system/vector.service
# /etc/systemd/system/vector.service
[Unit]
Description=Vector
After=network-online.target
Requires=network-online.target
[Service]
User=vector
Group=vector
ExecStart=/usr/bin/vector
ExecReload=/bin/kill -HUP $MAINPID
Restart=no
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=vector
[Install]
WantedBy=multi-user.targetEfter at have oprettet tabellerne, kan du køre Vector
systemctl enable vector
systemctl start vectorVektorlogfiler kan ses sådan:
journalctl -f -u vectorDer burde være poster som denne i loggene
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.På klienten (webserver) - 1. server
På serveren med nginx skal du deaktivere ipv6, da logtabellen i clickhouse bruger feltet upstream_addr IPv4, da jeg ikke bruger ipv6 inde på netværket. Hvis ipv6 ikke er slået fra, vil der være fejl:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)Måske læsere, tilføje ipv6-understøttelse.
Opret filen /etc/sysctl.d/98-disable-ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1Anvendelse af indstillingerne
sysctl --systemLad os installere nginx.
Tilføjet nginx-depotfil /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=trueInstaller nginx-pakken
yum install -y nginxFørst skal vi konfigurere logformatet 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;
}For ikke at bryde din nuværende konfiguration giver Nginx dig mulighed for at have flere access_log-direktiver
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате jsonGlem ikke at tilføje en regel for at logrotere for nye logfiler (hvis logfilen ikke ender med .log)
Fjern default.conf fra /etc/nginx/conf.d/
rm -f /etc/nginx/conf.d/default.confTilføj virtuel vært /etc/nginx/conf.d/vhost1.conf
server {
listen 80;
server_name vhost1;
location / {
proxy_pass http://172.26.10.106:8080;
}
}Tilføj virtuel vært /etc/nginx/conf.d/vhost2.conf
server {
listen 80;
server_name vhost2;
location / {
proxy_pass http://172.26.10.108:8080;
}
}Tilføj virtuel vært /etc/nginx/conf.d/vhost3.conf
server {
listen 80;
server_name vhost3;
location / {
proxy_pass http://172.26.10.109:8080;
}
}Tilføj virtuel vært /etc/nginx/conf.d/vhost4.conf
server {
listen 80;
server_name vhost4;
location / {
proxy_pass http://172.26.10.116:8080;
}
}Tilføj virtuelle værter til filen /etc/hosts (172.26.10.106 ip på serveren, hvor nginx er installeret) på alle servere:
172.26.10.106 vhost1
172.26.10.106 vhost2
172.26.10.106 vhost3
172.26.10.106 vhost4Og hvis alt er klar så
nginx -t
systemctl restart nginxLad os nu selv installere det
yum install -y https://packages.timber.io/vector/0.9.X/vector-x86_64.rpmLad os oprette en indstillingsfil for systemd /etc/systemd/system/vector.service
[Unit]
Description=Vector
After=network-online.target
Requires=network-online.target
[Service]
User=vector
Group=vector
ExecStart=/usr/bin/vector
ExecReload=/bin/kill -HUP $MAINPID
Restart=no
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=vector
[Install]
WantedBy=multi-user.targetOg konfigurer Filebeat-erstatningen i /etc/vector/vector.toml config. IP-adressen 172.26.10.108 er IP-adressen på logserveren (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"Glem ikke at tilføje brugervektoren til den relevante gruppe, så den kan læse logfiler. For eksempel nginx i centos opretter logfiler med administratorgrupperettigheder.
usermod -a -G adm vectorLad os starte vektortjenesten
systemctl enable vector
systemctl start vectorVektorlogfiler kan ses sådan:
journalctl -f -u vectorDer burde være en post som denne i loggene
INFO vector::topology::builder: Healthcheck: Passed.Stresstest
Vi udfører test ved hjælp af Apache benchmark.
httpd-tools-pakken blev installeret på alle servere
Vi begynder at teste med Apache benchmark fra 4 forskellige servere på skærmen. Først starter vi skærmterminalmultiplekseren, og derefter begynder vi at teste ved hjælp af Apache-benchmark. Hvordan man arbejder med skærm kan du finde i .
Fra 1. server
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; doneFra 2. server
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; doneFra 3. server
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; doneFra 4. server
while true; do ab -H "User-Agent: 4server" -c 100 -n 10 -t 10 http://vhost4/; sleep 1; doneLad os tjekke dataene i Clickhouse
Gå til Clickhouse
clickhouse-client -h 172.26.10.109 -mLav en SQL-forespørgsel
SELECT * FROM vector.logs;
┌─node_name────┬───────────timestamp─┬─server_name─┬─user_id─┬─request_full───┬─request_user_agent─┬─request_http_host─┬─request_uri─┬─request_scheme─┬─request_method─┬─request_length─┬─request_time─┬─request_referrer─┬─response_status─┬─response_body_bytes_sent─┬─response_content_type─┬───remote_addr─┬─remote_port─┬─remote_user─┬─upstream_addr─┬─upstream_port─┬─upstream_bytes_received─┬─upstream_bytes_sent─┬─upstream_cache_status─┬─upstream_connect_time─┬─upstream_header_time─┬─upstream_response_length─┬─upstream_response_time─┬─upstream_status─┬─upstream_content_type─┐
│ nginx-vector │ 2020-08-07 04:32:42 │ vhost1 │ │ GET / HTTP/1.0 │ 1server │ vhost1 │ / │ http │ GET │ 66 │ 0.028 │ │ 404 │ 27 │ │ 172.26.10.106 │ 45886 │ │ 172.26.10.106 │ 0 │ 109 │ 97 │ DISABLED │ 0 │ 0.025 │ 27 │ 0.029 │ 404 │ │
└──────────────┴─────────────────────┴─────────────┴─────────┴────────────────┴────────────────────┴───────────────────┴─────────────┴────────────────┴────────────────┴────────────────┴──────────────┴──────────────────┴─────────────────┴──────────────────────────┴───────────────────────┴───────────────┴─────────────┴─────────────┴───────────────┴───────────────┴─────────────────────────┴─────────────────────┴───────────────────────┴───────────────────────┴──────────────────────┴──────────────────────────┴────────────────────────┴─────────────────┴───────────────────────Find ud af størrelsen på borde i Clickhouse
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;Lad os finde ud af, hvor meget træstammer optog i Clickhouse.

Logtabellens størrelse er 857.19 MB.

Størrelsen af de samme data i indekset i Elasticsearch er 4,5 GB.
Hvis du ikke angiver data i vektoren i parametrene, tager Clickhouse 4500/857.19 = 5.24 gange mindre end i Elasticsearch.
I vektor bruges komprimeringsfeltet som standard.
Telegram chat af
Telegram chat af
Telegramchat af ""
Kilde: www.habr.com
