
, mis on mõeldud logi, mõõdikute ja sündmuste andmete kogumiseks, töötlemiseks ja saatmiseks.
→
Write on Rust keeles, see pakub kõrget jõudlust ja madalat mälutarbimist võrreldes sarnaste lahendustega. Samuti on suurt tähelepanu pööratud korrektsete funktsioonide, sealhulgas võimaluste osas, et salvestada saatmata sündmusi kettale puhvri ja failide rullimise teel.
Arhitektuuriliselt on Vector sündmuste marsruuter, mis võtab sõnumeid vastu ühest või mitmest allikatest, rakendades nendele sõnumitele valikuliselt muundamisi, ja saadab need ühte või mitmesse sihtkohta.
Vector on filebeati ja logstashi asendaja, ta võib toimida mõlemas rollis (logide vastuvõtmine ja saatmine), rohkem teavet nende kohta .
Kui Logstashis on voog kujundatud kujul input → filter → output, siis Vectoris on see → →
Näiteid saab vaadata dokumentatsioonis.
See juhend on ümber töötatud juhend . Originaalses juhendis on geoinfo töötlemine. Testides geoinfot sisevõrgus, andis vector tõrke.
Aug 05 06:25:31.889 DEBUG transform{name=nginx_parse_rename_fields type=rename_fields}: vector::transforms::rename_fields: Väli ei eksisteerinud field=«geoip.country_name» rate_limit_secs=30Kui kellelgi on vaja geoinfot töödelda, siis pöörduge originaalse juhendi poole .
Seame üles ühenduse Nginx (Access logs) → Vector (Client | Filebeat) → Vector (Server | Logstash) → eraldi Clickhouse'is ja eraldi Elasticsearch'is. Paigaldame 4 serverit. Kuigi 3 serveriga saab ka hakkama.

Skeem on umbes selline.
Küljest lülitame Selinuxi välja kõikidel teie serveritel
sed -i 's/SELINUX=.* /SELINUX=disabled/g' /etc/selinux/config
rebootPaigaldame kõigile serveritele HTTP serveri emulaatori + utiliidid
Emulaatorina kasutame HTTP teenust alates
Nodejs-stub-server ei oma rpm. loome sellele rpm-i. RPM koostatakse
Lisame reposi antonpatsev/nodejs-stub-server
yum -y install yum-plugin-copr epel-release
yes | yum copr enable antonpatsev/nodejs-stub-serverPaigaldame nodejs-stub-serveri, Apache benchmark'i ja terminali multiplexer'i screen kõigile serveritele
yum -y install stub_http_server screen mc httpd-tools screenParandasin failis /var/lib/stub_http_server/stub_http_server.js stub_http_server'i vastuse aega, et logisid oleks rohkem.
var max_sleep = 10;Käivitame stub_http_server'i.
systemctl start stub_http_server
systemctl enable stub_http_serverkolmandale serverile
ClickHouse kasutab SSE 4.2 käskude komplekti, seega muutub selle toega seotud protsessori tugi süsteemi täiendavaks nõudmiseks, kui ei ole märgitud teisiti. Siin on käsk, et kontrollida, kas praegune protsessor toetab SSE 4.2:
grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 toetatakse" || echo "SSE 4.2 ei ole toetatud"Esiteks tuleb lisada ametlik register:
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_64Pakettide installimiseks tuleb käitada järgmised käsud:
sudo yum install -y clickhouse-server clickhouse-clientLubame clickhouse-serveril kuulata võrkaart failis /etc/clickhouse-server/config.xml
0.0.0.0Muudame logimise taseme trace'ist debug'i
debug
Tehnilised seadistused on standardsed:
min_compress_block_size 65536
max_compress_block_size 1048576Zstd kompressiooni aktiveerimiseks soovitati konfiguratsiooni mitte muuta, vaid rakendada DDL.

Kuidas rakendada zstd kompressiooni DDL kaudu, ei leidnud ma Google'ist. Seetõttu jätsin nii nagu on.
Kolleegid, kes kasutavad zstd kompressiooni Clickhouse'is — palun jagage juhiseid.
Serveri käitamiseks demonina, käida:
service clickhouse-server startNüüd liigume Clickhouse'i seadistamise juurde
Siseneme Clickhouse'i
clickhouse-client -h 172.26.10.109 -m172.26.10.109 — IP server, kuhu Clickhouse on installitud.
Loome andmebaasi vector
CREATE DATABASE vector;Kontrollime, et andmebaas on olemas.
show databases;Loome tabeli vector.logs.
/* Это таблица где хранятся логи как есть */
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;Kontrollime, et tabelid on loodud. Käitame clickhouse-client ja teeme päringu.
Liigume andmebaasi vector.
use vector;
Ok.
0 rows in set. Elapsed: 0.001 sec.Vaata tabeleid.
show tables;
┌─name────────────────┐
│ logs │
└─────────────────────┘Elasticsearch'i installimine neljandale serverile, et saata samu andmeid Elasticsearch'i, et võrrelda Clickhouse'iga
Lisame avaliku rpm võtme
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearchLoome 2 registrit:
/etc/yum.repos.d/elasticsearch.repo
[elasticsearch]
name=Elasticsearch'i register 7.x pakettide jaoks
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 register 7.x pakettide jaoks
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-mdInstalleerime elasticsearch'i ja kibana
yum install -y kibana elasticsearchKuna neid on üks, tuleb failis /etc/elasticsearch/elasticsearch.yml lisada:
discovery.type: single-nodeKuna vector peab andmeid teise serverisse elasticsearch'i saatma, muuda network.host.
network.host: 0.0.0.0Kibana'ga ühenduse loomiseks muuda parameetrit server.host failis /etc/kibana/kibana.yml
server.host: "0.0.0.0"Käivitame ja lubame elasticsearch'i automaatse käivitamise
systemctl enable elasticsearch
systemctl start elasticsearchja kibana
systemctl enable kibana
systemctl start kibanaElasticsearch'i seadistamine single-node režiimis 1 shard, 0 repliiki. Tõenäoliselt on teil klaster, mis koosneb suurest arvust serveritest ja teil ei ole seda teha vaja.
Tulevaste indeksite jaoks värskendame vaikimisi mall.
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"}}' Paigaldamine kuidas asendada Logstash teisel serveril
yum install -y https://packages.timber.io/vector/0.9.X/vector-x86_64.rpm mc httpd-tools screenSeadistame Vectori Logstash'i asendamiseks. Redigeerime faili /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"Sa saad kohandada jaotust transforms.nginx_parse_add_defaults.
Kuna kasutab neid konfiguratsioone väikese CDN-i jaoks ja seal upstream_* sektsioonis võib olla mitu väärtust
Näiteks:
"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"Kui see ei ole sinu olukord, siis seda jaotust saab lihtsustada
Loome systemd teenuse seaded /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.targetPärast tabelite loomist võime Vectori käivitada
systemctl enable vector
systemctl start vectorVectori logisid saab vaadata nii
journalctl -f -u vectorLogides peaks olema sellised kirjed
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.Kliendil (Web server) — 1. server
Nginx serveris tuleb välja lülitada ipv6, kuna Clickhouse'is logide tabelis kasutatakse väljad upstream_addr IPv4, kuna ma ei kasuta ipv6 seesvõrgus. Kui ipv6 välja ei lülitata, siis võivad tekkida vead:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)Võib-olla lugejad, lisada ipv6 toe.
Loome faili /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 = 1Rakendame seaded
sysctl --systemInstalleerime nginx.
Lisatud nginx-i repostiivisti fail /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=trueInstalleerime nginx paketi
yum install -y nginxEsiteks peame seadistama Nginx logide formaadi failis /etc/nginx/nginx.conf
user nginx;
# Sa pead seadistama töötajate protsessid vastavalt oma CPU tuumadele, nginx ei saa kasu rohkematest protsessidest kui sul on tuumi.
worker_processes auto; #mõned viimased versioonid arvutavad selle automaatselt
# failide kirjeldajate arvu määramine, mida nginx kasutab
# piirang maksimaalsetele FD-dele serveris määratakse tavaliselt operatsioonisüsteemi poolt.
# kui sa ei määra FD-sid, siis kasutatakse OS seadeid, mis on vaikimisi 2000
worker_rlimit_nofile 100000;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# määrab konfigureerimisfaili konteksti, milles on määratud direktiivid, mis mõjutavad ühenduste töötlemist.
events {
# määrab, kui palju kliente saab iga töötaja teenindada
# maksimaalsed kliendid = worker_connections * worker_processes
# maksimumi piirab ka soklite ühenduste arv süsteemis (~64k)
worker_connections 4000;
# optimeeritud teenindama paljusid kliente iga niidi kohta, hädavajalik Linuxile -- testimis keskkonna jaoks
use epoll;
# aktsepteeri nii palju ühendusi kui võimalik, võib üle koormata töötaja ühendused, kui seatud liiga madalaks -- testimis keskkonna jaoks
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; # Uus logi json formaadis
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}Kuna ei soovita rikkuda teie praegust konfiguratsiooni, võimaldab Nginx omada mitmeid direktiive access_log
access_log /var/log/nginx/access.log main; # Standardne logi
access_log /var/log/nginx/access.json.log vector; # Uus logi json formaadisÄrge unustage lisada reeglit logrotate uutele logidele (kui logifail ei lõpe .log-ga)
Kustutame default.conf failist /etc/nginx/conf.d/
rm -f /etc/nginx/conf.d/default.confLisame virtuaalse hosti failile /etc/nginx/conf.d/vhost1.conf
server {
listen 80;
server_name vhost1;
location / {
proxy_pass http://172.26.10.106:8080;
}
}Lisame virtuaalse hosti /etc/nginx/conf.d/vhost2.conf
server {
listen 80;
server_name vhost2;
location / {
proxy_pass http://172.26.10.108:8080;
}
}Lisame virtuaalse hosti /etc/nginx/conf.d/vhost3.conf
server {
listen 80;
server_name vhost3;
location / {
proxy_pass http://172.26.10.109:8080;
}
}Lisame virtuaalse hosti /etc/nginx/conf.d/vhost4.conf
server {
listen 80;
server_name vhost4;
location / {
proxy_pass http://172.26.10.116:8080;
}
}Lisame faili /etc/hosts virtuaalsed hostid (172.26.10.106, serveri IP, kus nginx on paigaldatud) kõigile serveritele:
172.26.10.106 vhost1
172.26.10.106 vhost2
172.26.10.106 vhost3
172.26.10.106 vhost4Ja kui kõik on valmis, siis
nginx -t
systemctl restart nginxNüüd paigaldame ise
yum install -y https://packages.timber.io/vector/0.9.X/vector-x86_64.rpmLoome seadistuse faili systemd jaoks /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.targetJa seadistame Filebeat kompenseerimise failis /etc/vector/vector.toml. IP-aadress 172.26.10.108 — see on logiserveri (Vector-Server) IP-aadress.
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"Ärge unustage lisada kasutaja vector vajalikku gruppi, et ta saaks lugeda logifaile. Näiteks, nginx genereerib CentOS-is logisid adm grupi õigustega.
usermod -a -G adm vectorKäivitame vectori teenuse
systemctl enable vector
systemctl start vectorVectori logisid saab vaadata nii
journalctl -f -u vectorLogides peaks olema selline sissekanne
INFO vector::topology::builder: Healthcheck: Passed.Koormuse testimine
Testimine toimub Apache benchmark'iga.
Kõigile serveritele on paigaldatud httpd-tools paketid.
Käivitame testimise Apache benchmarkiga 4 erinevast serverist screeni kaudu. Alustame terminali multiplexer screeni käivitamisest ja seejärel teostame testimise Apache benchmarkiga. Kuidas töötada screeniga, võite leida .
Esimese serveri kaudu
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; doneTeise serveri kaudu
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; doneKolmanda serveri kaudu
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; doneNeljas server
while true; do ab -H "User-Agent: 4server" -c 100 -n 10 -t 10 http://vhost4/; sleep 1; doneKontrollime andmeid Clickhouse'is
Siseneme Clickhouse'i
clickhouse-client -h 172.26.10.109 -mTeeme SQL päringu
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 │ │
└──────────────┴─────────────────────┴─────────────┴─────────┴────────────────┴────────────────────┴───────────────────┴─────────────┴────────────────┴────────────────┴────────────────┴──────────────┴──────────────────┴─────────────────┴──────────────────────────┴───────────────────────┴───────────────┴─────────────┴─────────────┴───────────────┴───────────────┴─────────────────────────┴─────────────────────┴───────────────────────┴───────────────────────┴──────────────────────┴──────────────────────────┴────────────────────────┴─────────────────┴───────────────────────Selgitame, kui suured on tabelid Clickhouse'is
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;Selgitame, kui palju ruumi logid Clickhouse'is võtavad.

Tabeli logs suurus on 857.19 MB.

Sama andmete maht indeksis Elasticsearchis on 4,5 GB.
Kui Clickhouse'is vektoris andmeid ei määrata, siis on need 4500/857,19 = 5,24 korda väiksemad kui Elasticsearchis.
Vektorifield compression kasutatakse vaikeväärtusena.
Telegrami jututuba
Telegrami jututuba
Telegrami jututuba ""
Allikas: habr.com
