
, σχεδιασμένο για τη συλλογή, μετατροπή και αποστολή δεδομένων καταγραφής, μετρήσεων και συμβάντων.
→
Όντας γραμμένο στη γλώσσα Rust, χαρακτηρίζεται από υψηλή απόδοση και χαμηλή κατανάλωση RAM σε σύγκριση με τα ανάλογα του. Επιπλέον, δίνεται μεγάλη προσοχή σε λειτουργίες που σχετίζονται με την ορθότητα, ειδικότερα, στη δυνατότητα αποθήκευσης μη απεσταλμένων συμβάντων σε μια προσωρινή μνήμη στο δίσκο και περιστροφής αρχείων.
Αρχιτεκτονικά, το Vector είναι ένας δρομολογητής συμβάντων που λαμβάνει μηνύματα από έναν ή περισσότερους πηγές, προαιρετικά εφαρμόζεται πάνω από αυτά τα μηνύματα μεταμορφώσεις, και αποστολή τους σε ένα ή περισσότερα αποχέτευση.
Το Vector αντικαθιστά το filebeat και το logstash, μπορεί να ενεργήσει και στους δύο ρόλους (λήψη και αποστολή αρχείων καταγραφής), περισσότερες λεπτομέρειες για αυτούς .
Αν στο Logstash η αλυσίδα είναι χτισμένη ως είσοδος → φίλτρο → έξοδος τότε στο Vector είναι → →
Παραδείγματα μπορείτε να βρείτε στην τεκμηρίωση.
Αυτή η οδηγία είναι μια αναθεωρημένη οδηγία από . Οι πρωτότυπες οδηγίες περιέχουν επεξεργασία geoip. Κατά τη δοκιμή του geoip από ένα εσωτερικό δίκτυο, το vector έδωσε ένα σφάλμα.
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Εάν κάποιος χρειάζεται να επεξεργαστεί το geoip, τότε ανατρέξτε στις αρχικές οδηγίες από .
Θα διαμορφώσουμε τον συνδυασμό Nginx (Αρχεία καταγραφής πρόσβασης) → Vector (Πελάτης | Filebeat) → Vector (Διακομιστής | Logstash) → ξεχωριστά στο Clickhouse και ξεχωριστά στο Elasticsearch. Θα εγκαταστήσουμε 4 διακομιστές. Αν και μπορείτε να το παρακάμψετε με 3 διακομιστές.

Το σχέδιο είναι κάπως έτσι.
Απενεργοποιήστε το Selinux σε όλους τους διακομιστές σας
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
rebootΕγκαθιστούμε έναν εξομοιωτή διακομιστή HTTP + βοηθητικά προγράμματα σε όλους τους διακομιστές
Ως εξομοιωτή διακομιστή HTTP θα χρησιμοποιήσουμε από
Ο Nodejs-stub-server δεν έχει rpm. δημιουργήστε στροφές ανά λεπτό για αυτό. rpm θα μεταγλωττιστεί χρησιμοποιώντας
Προσθέστε το αποθετήριο antonpatsev/nodejs-stub-server
yum -y install yum-plugin-copr epel-release
yes | yum copr enable antonpatsev/nodejs-stub-serverΕγκαταστήστε το nodejs-stub-server, το Apache benchmark και τον πολυπλέκτη τερματικού οθόνης σε όλους τους διακομιστές
yum -y install stub_http_server screen mc httpd-tools screenΔιόρθωσα τον χρόνο απόκρισης stub_http_server στο αρχείο /var/lib/stub_http_server/stub_http_server.js έτσι ώστε να υπάρχουν περισσότερα αρχεία καταγραφής.
var max_sleep = 10;Ας ξεκινήσουμε το stub_http_server.
systemctl start stub_http_server
systemctl enable stub_http_serverστον διακομιστή 3
Το ClickHouse χρησιμοποιεί το σύνολο εντολών SSE 4.2, επομένως, εκτός εάν ορίζεται διαφορετικά, η υποστήριξή του στον επεξεργαστή που χρησιμοποιείται γίνεται μια πρόσθετη απαίτηση συστήματος. Ακολουθεί η εντολή για να ελέγξετε εάν ο τρέχων επεξεργαστής υποστηρίζει το SSE 4.2:
grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"Πρώτα πρέπει να συνδέσετε το επίσημο αποθετήριο:
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_64Για να εγκαταστήσετε πακέτα πρέπει να εκτελέσετε τις παρακάτω εντολές:
sudo yum install -y clickhouse-server clickhouse-clientΝα επιτρέπεται στον clickhouse-server να ακούει την κάρτα δικτύου στο αρχείο /etc/clickhouse-server/config.xml
<listen_host>0.0.0.0</listen_host>Αλλαγή του επιπέδου καταγραφής από ίχνος σε εντοπισμό σφαλμάτων
debug
Τυπικές ρυθμίσεις συμπίεσης:
min_compress_block_size 65536
max_compress_block_size 1048576Για να ενεργοποιήσετε τη συμπίεση Zstd, συνιστάται να μην αγγίξετε τη διαμόρφωση, αλλά να χρησιμοποιήσετε το DDL.

Δεν μπόρεσα να βρω πώς να χρησιμοποιήσω τη συμπίεση zstd μέσω DDL στο Google. Το άφησα λοιπόν ως έχει.
Συνάδελφοι που χρησιμοποιούν συμπίεση zstd στο Clickhouse, μοιραστείτε τις οδηγίες.
Για να ξεκινήσετε τον διακομιστή ως δαίμονας, εκτελέστε:
service clickhouse-server startΤώρα ας προχωρήσουμε στη ρύθμιση του Clickhouse
Μεταβείτε στο Clickhouse
clickhouse-client -h 172.26.10.109 -m172.26.10.109 — IP του διακομιστή όπου είναι εγκατεστημένο το Clickhouse.
Ας δημιουργήσουμε μια διανυσματική βάση δεδομένων
CREATE DATABASE vector;Ας ελέγξουμε ότι η βάση δεδομένων υπάρχει.
show databases;Δημιουργήστε έναν πίνακα 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;Ελέγχουμε ότι οι πίνακες έχουν δημιουργηθεί. Ας ξεκινήσουμε clickhouse-client και κάντε ένα αίτημα.
Ας πάμε στη διανυσματική βάση δεδομένων.
use vector;
Ok.
0 rows in set. Elapsed: 0.001 sec.Ας δούμε τους πίνακες.
show tables;
┌─name────────────────┐
│ logs │
└─────────────────────┘Εγκατάσταση του elasticsearch στον 4ο διακομιστή για αποστολή των ίδιων δεδομένων στο Elasticsearch για σύγκριση με το Clickhouse
Προσθέστε ένα δημόσιο κλειδί rpm
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearchΑς δημιουργήσουμε 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-mdΤοποθετήστε elasticsearch και kibana
yum install -y kibana elasticsearchΔεδομένου ότι θα είναι σε 1 αντίγραφο, πρέπει να προσθέσετε τα ακόλουθα στο αρχείο /etc/elasticsearch/elasticsearch.yml:
discovery.type: single-nodeΓια να μπορεί αυτό το διάνυσμα να στείλει δεδομένα στο elasticsearch από άλλο διακομιστή, ας αλλάξουμε το network.host.
network.host: 0.0.0.0Για να συνδεθείτε στο kibana, αλλάξτε την παράμετρο server.host στο αρχείο /etc/kibana/kibana.yml
server.host: "0.0.0.0"Παλιό και περιλαμβάνει elasticsearch στην αυτόματη εκκίνηση
systemctl enable elasticsearch
systemctl start elasticsearchκαι κιμπάνα
systemctl enable kibana
systemctl start kibanaΔιαμόρφωση Elasticsearch για λειτουργία μονού κόμβου 1 θραύσμα, 0 αντίγραφο. Πιθανότατα θα έχετε ένα σύμπλεγμα μεγάλου αριθμού διακομιστών και δεν χρειάζεται να το κάνετε αυτό.
Για μελλοντικά ευρετήρια, ενημερώστε το προεπιλεγμένο πρότυπο:
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"}}' Εγκατάσταση ως αντικατάσταση του Logstash στον διακομιστή 2
yum install -y https://packages.timber.io/vector/0.9.X/vector-x86_64.rpm mc httpd-tools screenΑς ρυθμίσουμε το Vector ως αντικατάσταση του Logstash. Επεξεργασία του αρχείου /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"Μπορείτε να προσαρμόσετε την ενότητα transforms.nginx_parse_add_defaults.
Ως χρησιμοποιεί αυτές τις ρυθμίσεις παραμέτρων για ένα μικρό CDN και μπορεί να υπάρχουν πολλές τιμές στο upstream_*
Για παράδειγμα:
"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"Εάν αυτή δεν είναι η κατάστασή σας, τότε αυτή η ενότητα μπορεί να απλοποιηθεί
Ας δημιουργήσουμε ρυθμίσεις υπηρεσίας για το 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.targetΑφού δημιουργήσετε τους πίνακες, μπορείτε να εκτελέσετε το Vector
systemctl enable vector
systemctl start vectorΤα διανυσματικά αρχεία καταγραφής μπορούν να προβληθούν ως εξής:
journalctl -f -u vectorΘα πρέπει να υπάρχουν καταχωρήσεις όπως αυτή στα αρχεία καταγραφής
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.Στον πελάτη (διακομιστής Ιστού) - 1ος διακομιστής
Στον διακομιστή με nginx, πρέπει να απενεργοποιήσετε το ipv6, καθώς ο πίνακας αρχείων καταγραφής στο clickhouse χρησιμοποιεί το πεδίο upstream_addr IPv4, αφού δεν χρησιμοποιώ το ipv6 μέσα στο δίκτυο. Εάν το ipv6 δεν είναι απενεργοποιημένο, θα υπάρξουν σφάλματα:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)Ίσως οι αναγνώστες, προσθέστε υποστήριξη ipv6.
Δημιουργήστε το αρχείο /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 = 1Εφαρμογή των ρυθμίσεων
sysctl --systemΑς εγκαταστήσουμε το nginx.
Προστέθηκε αρχείο αποθετηρίου nginx /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=trueΕγκαταστήστε το πακέτο nginx
yum install -y nginxΑρχικά, πρέπει να διαμορφώσουμε τη μορφή αρχείου καταγραφής στο Nginx στο αρχείο /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;
}Για να μην σπάσει η τρέχουσα διαμόρφωση, το Nginx σάς επιτρέπει να έχετε πολλές οδηγίες πρόσβασης_καταγραφής
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате jsonΜην ξεχάσετε να προσθέσετε έναν κανόνα για logrotate για νέα αρχεία καταγραφής (εάν το αρχείο καταγραφής δεν τελειώνει σε .log)
Καταργήστε το default.conf από /etc/nginx/conf.d/
rm -f /etc/nginx/conf.d/default.confΠροσθήκη εικονικού κεντρικού υπολογιστή /etc/nginx/conf.d/vhost1.conf
server {
listen 80;
server_name vhost1;
location / {
proxy_pass http://172.26.10.106:8080;
}
}Προσθήκη εικονικού κεντρικού υπολογιστή /etc/nginx/conf.d/vhost2.conf
server {
listen 80;
server_name vhost2;
location / {
proxy_pass http://172.26.10.108:8080;
}
}Προσθήκη εικονικού κεντρικού υπολογιστή /etc/nginx/conf.d/vhost3.conf
server {
listen 80;
server_name vhost3;
location / {
proxy_pass http://172.26.10.109:8080;
}
}Προσθήκη εικονικού κεντρικού υπολογιστή /etc/nginx/conf.d/vhost4.conf
server {
listen 80;
server_name vhost4;
location / {
proxy_pass http://172.26.10.116:8080;
}
}Προσθέστε εικονικούς κεντρικούς υπολογιστές (172.26.10.106 ip του διακομιστή όπου είναι εγκατεστημένο το nginx) σε όλους τους διακομιστές στο αρχείο /etc/hosts:
172.26.10.106 vhost1
172.26.10.106 vhost2
172.26.10.106 vhost3
172.26.10.106 vhost4Και αν όλα είναι έτοιμα τότε
nginx -t
systemctl restart nginxΤώρα ας το εγκαταστήσουμε μόνοι μας
yum install -y https://packages.timber.io/vector/0.9.X/vector-x86_64.rpmΑς δημιουργήσουμε ένα αρχείο ρυθμίσεων για το 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.targetΚαι ρυθμίστε την αντικατάσταση του Filebeat στη ρύθμιση παραμέτρων /etc/vector/vector.toml. Η διεύθυνση IP 172.26.10.108 είναι η διεύθυνση IP του διακομιστή καταγραφής (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"Μην ξεχάσετε να προσθέσετε το διάνυσμα χρήστη στην κατάλληλη ομάδα, ώστε να μπορεί να διαβάζει αρχεία καταγραφής. Για παράδειγμα, το nginx στο centos δημιουργεί αρχεία καταγραφής με δικαιώματα ομάδας διαχειριστή.
usermod -a -G adm vectorΑς ξεκινήσουμε την υπηρεσία vector
systemctl enable vector
systemctl start vectorΤα διανυσματικά αρχεία καταγραφής μπορούν να προβληθούν ως εξής:
journalctl -f -u vectorΘα πρέπει να υπάρχει μια καταχώρηση σαν αυτή στα αρχεία καταγραφής
INFO vector::topology::builder: Healthcheck: Passed.Stress Testing
Πραγματοποιούμε δοκιμές χρησιμοποιώντας το Apache benchmark.
Το πακέτο httpd-tools εγκαταστάθηκε σε όλους τους διακομιστές
Ξεκινάμε τη δοκιμή χρησιμοποιώντας το Apache benchmark από 4 διαφορετικούς διακομιστές στην οθόνη. Αρχικά, εκκινούμε τον πολυπλέκτη τερματικού οθόνης και, στη συνέχεια, ξεκινάμε τη δοκιμή χρησιμοποιώντας το σημείο αναφοράς Apache. Πώς να εργαστείτε με την οθόνη που μπορείτε να βρείτε .
Από τον 1ο διακομιστή
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; doneΑπό τον 2ο διακομιστή
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; doneΑπό τον 3ο διακομιστή
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; doneΑπό τον 4ο διακομιστή
while true; do ab -H "User-Agent: 4server" -c 100 -n 10 -t 10 http://vhost4/; sleep 1; doneΑς ελέγξουμε τα δεδομένα στο Clickhouse
Μεταβείτε στο Clickhouse
clickhouse-client -h 172.26.10.109 -mΠραγματοποίηση ερωτήματος SQL
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 │ │
└──────────────┴─────────────────────┴─────────────┴─────────┴────────────────┴────────────────────┴───────────────────┴─────────────┴────────────────┴────────────────┴────────────────┴──────────────┴──────────────────┴─────────────────┴──────────────────────────┴───────────────────────┴───────────────┴─────────────┴─────────────┴───────────────┴───────────────┴─────────────────────────┴─────────────────────┴───────────────────────┴───────────────────────┴──────────────────────┴──────────────────────────┴────────────────────────┴─────────────────┴───────────────────────Μάθετε το μέγεθος των τραπεζιών στο 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;Ας μάθουμε πόσα αρχεία καταγραφής καταγράφηκαν στο Clickhouse.

Το μέγεθος του πίνακα καταγραφής είναι 857.19 MB.

Το μέγεθος των ίδιων δεδομένων στο ευρετήριο στο Elasticsearch είναι 4,5 GB.
Εάν δεν καθορίσετε δεδομένα στο διάνυσμα στις παραμέτρους, το Clickhouse παίρνει 4500/857.19 = 5.24 φορές λιγότερο από ό,τι στο Elasticsearch.
Στο vector, το πεδίο συμπίεσης χρησιμοποιείται από προεπιλογή.
Τηλεγραφική συνομιλία από
Τηλεγραφική συνομιλία από
Συνομιλία Telegram από ""
Πηγή: www.habr.com
