Vector istifadə edərək Clickhouse və Elasticsearch-ə Nginx json qeydlərinin göndərilməsi

Vector istifadə edərək Clickhouse və Elasticsearch-ə Nginx json qeydlərinin göndərilməsi

Vektor, jurnal məlumatlarını, ölçüləri və hadisələri toplamaq, çevirmək və göndərmək üçün nəzərdə tutulmuşdur.

→ Github

Rust dilində yazıldığı üçün analoqları ilə müqayisədə yüksək performans və aşağı RAM sərfiyyatı ilə seçilir. Bundan əlavə, düzgünlüklə əlaqəli funksiyalara, xüsusən də göndərilməmiş hadisələri diskdə buferə saxlamaq və faylları döndərmək imkanına çox diqqət yetirilir.

Memarlıq olaraq, Vector bir və ya daha çox mesaj qəbul edən bir hadisə yönləndiricisidir mənbələr, isteğe bağlı olaraq bu mesajlar üzərində tətbiq edilir çevrilmələr, və onları birinə və ya bir neçəsinə göndərir drenajlar.

Vector filebeat və logstash üçün əvəzdir, o, hər iki rolda çıxış edə bilər (logları qəbul etmək və göndərmək), onlar haqqında ətraflı məlumat Online.

Logstash-da zəncir giriş → filter → çıxış kimi qurulubsa, Vektorda belədir mənbələrdəyişiryuyulur

Nümunələr sənədlərdə tapıla bilər.

Bu təlimat yenidən işlənmiş təlimatdır Vyaçeslav Raxinski. Orijinal təlimatlarda geoip emal var. Daxili şəbəkədən geoip-i sınaqdan keçirərkən vektor xəta verdi.

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

Kiməsə geoip-i emal etmək lazımdırsa, orijinal təlimatlara baxın Vyaçeslav Raxinski.

Nginx (Access logs) → Vector (Client | Filebeat) → Vector (Server | Logstash) → ayrı-ayrılıqda Clickhouse-da və Elasticsearch-də ayrı-ayrılıqda konfiqurasiya edəcəyik. 4 server quraşdıracağıq. Baxmayaraq ki, onu 3 serverlə keçə bilərsiniz.

Vector istifadə edərək Clickhouse və Elasticsearch-ə Nginx json qeydlərinin göndərilməsi

Sxem belə bir şeydir.

Bütün serverlərinizdə Selinux-u deaktiv edin

sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot

Biz bütün serverlərdə HTTP server emulyatoru + utilitlər quraşdırırıq

HTTP server emulyatoru olaraq istifadə edəcəyik nodejs-stub-server etibarən Maksim İqnatenko

Nodejs-stub-serverdə rpm yoxdur. Burada bunun üçün rpm yaradın. rpm istifadə edərək qurulacaq Fedora Kopr

Antonpatsev/nodejs-stub-server repozitorunu əlavə edin

yum -y install yum-plugin-copr epel-release
yes | yum copr enable antonpatsev/nodejs-stub-server

Bütün serverlərdə nodejs-stub-server, Apache benchmark və ekran terminal multipleksorunu quraşdırın

yum -y install stub_http_server screen mc httpd-tools screen

/var/lib/stub_http_server/stub_http_server.js faylında stub_http_server cavab vaxtını düzəltdim ki, daha çox qeyd olsun.

var max_sleep = 10;

stub_http_server-i işə salaq.

systemctl start stub_http_server
systemctl enable stub_http_server

Clickhouse quraşdırılması serverdə 3

ClickHouse SSE 4.2 təlimat dəstindən istifadə edir, ona görə də başqa cür göstərilməyibsə, istifadə olunan prosessorda onun dəstəyi əlavə sistem tələbinə çevrilir. Mövcud prosessorun SSE 4.2-ni dəstəklədiyini yoxlamaq üçün əmr budur:

grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"

Əvvəlcə rəsmi depoya qoşulmalısınız:

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

Paketləri quraşdırmaq üçün aşağıdakı əmrləri yerinə yetirməlisiniz:

sudo yum install -y clickhouse-server clickhouse-client

Clickhouse-serverə /etc/clickhouse-server/config.xml faylında şəbəkə kartını dinləməyə icazə verin

<listen_host>0.0.0.0</listen_host>

Giriş səviyyəsinin izdən sazlamaya dəyişdirilməsi

debug

Standart sıxılma parametrləri:

min_compress_block_size  65536
max_compress_block_size  1048576

Zstd sıxılmasını aktivləşdirmək üçün konfiqurasiyaya toxunmamaq, əksinə DDL-dən istifadə etmək tövsiyə edildi.

Vector istifadə edərək Clickhouse və Elasticsearch-ə Nginx json qeydlərinin göndərilməsi

Google-da DDL vasitəsilə zstd sıxılmasını necə istifadə edəcəyimi tapa bilmədim. Ona görə də olduğu kimi buraxdım.

Clickhouse-da zstd sıxılma istifadə edən həmkarlar, lütfən, təlimatları paylaşın.

Serveri bir demon kimi işə salmaq üçün aşağıdakıları işlədin:

service clickhouse-server start

İndi Clickhouse-un qurulmasına keçək

Clickhouse-a keçin

clickhouse-client -h 172.26.10.109 -m

172.26.10.109 — Clickhouse-un quraşdırıldığı serverin IP-si.

Gəlin vektor verilənlər bazası yaradaq

CREATE DATABASE vector;

Verilənlər bazasının mövcudluğunu yoxlayaq.

show databases;

vector.logs cədvəli yaradın.

/* Это таблица где хранятся логи как есть */

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;

Cədvəllərin yaradıldığını yoxlayırıq. başlayaq clickhouse-client və müraciət edin.

Gəlin vektor verilənlər bazasına keçək.

use vector;

Ok.

0 rows in set. Elapsed: 0.001 sec.

Gəlin cədvəllərə baxaq.

show tables;

┌─name────────────────┐
│ logs                │
└─────────────────────┘

Clickhouse ilə müqayisə üçün eyni məlumatları Elasticsearch-ə göndərmək üçün 4-cü serverdə elasticsearch quraşdırılması

Ümumi rpm açarı əlavə edin

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

Gəlin 2 repo yaradaq:

/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 və kibana quraşdırın

yum install -y kibana elasticsearch

1 nüsxədə olacağı üçün /etc/elasticsearch/elasticsearch.yml faylına aşağıdakıları əlavə etməlisiniz:

discovery.type: single-node

Həmin vektor başqa serverdən elasticsearch-a məlumat göndərə bilsin, gəlin network.host-u dəyişək.

network.host: 0.0.0.0

Kibana qoşulmaq üçün /etc/kibana/kibana.yml faylında server.host parametrini dəyişdirin.

server.host: "0.0.0.0"

Köhnə və autostart-a elasticsearch daxil edin

systemctl enable elasticsearch
systemctl start elasticsearch

və kibana

systemctl enable kibana
systemctl start kibana

Tək düyünlü rejim üçün Elasticsearch konfiqurasiya edilir 1 parça, 0 replika. Çox güman ki, çox sayda serverdən ibarət bir çoxluq olacaq və bunu etmək lazım deyil.

Gələcək indekslər üçün standart şablonu yeniləyin:

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"}}' 

Quraşdırma Vektor server 2-də Logstash üçün əvəz kimi

yum install -y https://packages.timber.io/vector/0.9.X/vector-x86_64.rpm mc httpd-tools screen

Gəlin Logstash-ın əvəzi kimi Vector-u quraşdıraq. /etc/vector/vector.toml faylının redaktə edilməsi

# /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"

Siz transforms.nginx_parse_add_defaults bölməsini tənzimləyə bilərsiniz.

Kimi Vyaçeslav Raxinski bu konfiqurasiyaları kiçik bir CDN üçün istifadə edir və yuxarı axınında bir neçə dəyər ola bilər_*

Misal üçün:

"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"

Bu sizin vəziyyətiniz deyilsə, bu bölmə sadələşdirilə bilər

systemd /etc/systemd/system/vector.service üçün xidmət parametrlərini yaradaq

# /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

Cədvəllər yaratdıqdan sonra Vector-i işə sala bilərsiniz

systemctl enable vector
systemctl start vector

Vektor qeydlərinə aşağıdakı kimi baxmaq olar:

journalctl -f -u vector

Qeydlərdə belə qeydlər olmalıdır

INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.

Müştəridə (Veb server) - 1-ci server

Nginx ilə serverdə ipv6-nı deaktiv etməlisiniz, çünki clickhouse-dakı logs cədvəli sahədən istifadə edir. upstream_addr IPv4, çünki mən şəbəkə daxilində ipv6 istifadə etmirəm. Əgər ipv6 söndürülməyibsə, xətalar olacaq:

DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)

Bəlkə oxucular, ipv6 dəstəyi əlavə edin.

/etc/sysctl.d/98-disable-ipv6.conf faylını yaradın

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

Parametrlərin tətbiqi

sysctl --system

Nginx quraşdıraq.

Əlavə edilmiş nginx depo faylı /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 paketini quraşdırın

yum install -y nginx

Əvvəlcə /etc/nginx/nginx.conf faylında Nginx-də log formatını konfiqurasiya etməliyik.

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;
}

Cari konfiqurasiyanızı pozmamaq üçün Nginx sizə bir neçə access_log direktivinə malik olmağa imkan verir

access_log  /var/log/nginx/access.log  main;            # Стандартный лог
access_log  /var/log/nginx/access.json.log vector;      # Новый лог в формате json

Yeni qeydlər üçün logrotasiya qaydası əlavə etməyi unutmayın (əgər log faylı .log ilə bitmirsə)

default.conf faylını /etc/nginx/conf.d/ ünvanından silin

rm -f /etc/nginx/conf.d/default.conf

Virtual host /etc/nginx/conf.d/vhost1.conf əlavə edin

server {
    listen 80;
    server_name vhost1;
    location / {
        proxy_pass http://172.26.10.106:8080;
    }
}

Virtual host /etc/nginx/conf.d/vhost2.conf əlavə edin

server {
    listen 80;
    server_name vhost2;
    location / {
        proxy_pass http://172.26.10.108:8080;
    }
}

Virtual host /etc/nginx/conf.d/vhost3.conf əlavə edin

server {
    listen 80;
    server_name vhost3;
    location / {
        proxy_pass http://172.26.10.109:8080;
    }
}

Virtual host /etc/nginx/conf.d/vhost4.conf əlavə edin

server {
    listen 80;
    server_name vhost4;
    location / {
        proxy_pass http://172.26.10.116:8080;
    }
}

/etc/hosts faylına bütün serverlərə virtual hostları (nginx-in quraşdırıldığı serverin 172.26.10.106 ip) əlavə edin:

172.26.10.106 vhost1
172.26.10.106 vhost2
172.26.10.106 vhost3
172.26.10.106 vhost4

Və hər şey hazırdırsa

nginx -t 
systemctl restart nginx

İndi onu özümüz quraşdıraq Vektor

yum install -y https://packages.timber.io/vector/0.9.X/vector-x86_64.rpm

Systemd /etc/systemd/system/vector.service üçün parametrlər faylı yaradaq

[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

Və /etc/vector/vector.toml konfiqurasiyasında Filebeat əvəzini konfiqurasiya edin. IP ünvanı 172.26.10.108 log serverinin IP ünvanıdır (Vektor-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"

Vektor istifadəçisini tələb olunan qrupa əlavə etməyi unutmayın ki, o, log fayllarını oxuya bilsin. Məsələn, centos-da nginx adm qrup hüquqları ilə qeydlər yaradır.

usermod -a -G adm vector

Gəlin vektor xidmətinə başlayaq

systemctl enable vector
systemctl start vector

Vektor qeydlərinə aşağıdakı kimi baxmaq olar:

journalctl -f -u vector

Günlüklərdə belə bir giriş olmalıdır

INFO vector::topology::builder: Healthcheck: Passed.

Stress Testi

Test Apache benchmark istifadə edərək həyata keçirilir.

httpd-tools paketi bütün serverlərdə quraşdırılıb

Ekranda 4 fərqli serverdən Apache etalonundan istifadə edərək test etməyə başlayırıq. Əvvəlcə ekran terminalı multipleksorunu işə salırıq və sonra Apache etalonundan istifadə edərək test etməyə başlayırıq. Ekranla necə işləmək olar, burada tapa bilərsiniz məqalə.

1-ci serverdən

while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done

2-ci serverdən

while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done

3-ci serverdən

while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done

4-ci serverdən

while true; do ab -H "User-Agent: 4server" -c 100 -n 10 -t 10 http://vhost4/; sleep 1; done

Gəlin Clickhouse-da məlumatları yoxlayaq

Clickhouse-a keçin

clickhouse-client -h 172.26.10.109 -m

SQL sorğusunun hazırlanması

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-da cədvəllərin ölçüsünü öyrənin

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;

Gəlin, Clickhouse-da nə qədər log tutduğunu öyrənək.

Vector istifadə edərək Clickhouse və Elasticsearch-ə Nginx json qeydlərinin göndərilməsi

Qeydlər cədvəlinin ölçüsü 857.19 MB-dır.

Vector istifadə edərək Clickhouse və Elasticsearch-ə Nginx json qeydlərinin göndərilməsi

Elasticsearch-də indeksdəki eyni məlumatın ölçüsü 4,5 GB-dır.

Parametrlərdə vektorda məlumatları göstərməsəniz, Clickhouse Elasticsearch-dən 4500/857.19 = 5.24 dəfə az alır.

Vektorda sıxılma sahəsi standart olaraq istifadə olunur.

Telegram çatı klik evi
Telegram çatı Elasticsearch
"Telegram çatı"Sistemin toplanması və təhlili ismarıclar"

Mənbə: www.habr.com

Добавить комментарий