Vector kullanarak Nginx json günlüklerini Clickhouse ve Elasticsearch'e gönderme

Vector kullanarak Nginx json günlüklerini Clickhouse ve Elasticsearch'e gönderme

vektör, günlük verilerini, ölçümleri ve olayları toplamak, dönüştürmek ve göndermek için tasarlanmıştır.

→ Github

Rust dilinde yazılmış olması nedeniyle benzerlerine kıyasla yüksek performans ve düşük RAM tüketimi ile öne çıkıyor. Ek olarak, doğrulukla ilgili işlevlere, özellikle de gönderilmemiş olayları diskteki bir arabelleğe kaydetme ve dosyaları döndürme becerisine çok dikkat edilir.

Mimari olarak Vector, bir veya daha fazla cihazdan mesaj alan bir olay yönlendiricisidir. kaynakların, isteğe bağlı olarak bu mesajların üzerine uygulanarak transformasyonve bunları bir veya daha fazla kişiye göndermek kanalizasyonlar.

Vector, filebeat ve logstash'ın yerine geçer; her iki rolü de üstlenebilir (günlükleri alma ve gönderme), bunlar hakkında daha fazla ayrıntı web sitesi.

Logstash'ta zincir giriş → filtre → çıkış olarak oluşturulmuşsa, Vector'da şöyledir: kaynaklardönüşümlerlavabolar

Örnekler belgelerde bulunabilir.

Bu talimat, revize edilmiş bir talimattır. Vyacheslav Rakhinsky. Orijinal talimatlar coğrafi ip işlemeyi içerir. Geoip'i dahili bir ağdan test ederken vektör bir hata 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

Birisinin geoip'i işlemesi gerekiyorsa, orijinal talimatlara bakın. Vyacheslav Rakhinsky.

Nginx (Erişim logları) → Vector (Client | Filebeat) → Vector (Server | Logstash) → kombinasyonunu Clickhouse'da ayrı ayrı ve Elasticsearch'te ayrı ayrı yapılandıracağız. 4 adet sunucu kuracağız. Yine de 3 sunucuyla bunu atlayabilirsiniz.

Vector kullanarak Nginx json günlüklerini Clickhouse ve Elasticsearch'e gönderme

Şema bunun gibi bir şey.

Tüm sunucularınızda Selinux'u devre dışı bırakın

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

Tüm sunuculara bir HTTP sunucusu emülatörü + yardımcı programlar yüklüyoruz

HTTP sunucusu emülatörü olarak kullanacağız nodejs-taslak-sunucu itibaren Maxim Ignatenko

Nodejs-saplama-sunucusunun rpm'si yok. öyle bunun için rpm oluşturun. rpm kullanılarak oluşturulacak fötr şapka

antonpatsev/nodejs-stub-server deposunu ekleyin

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

Tüm sunuculara nodejs-stub-server, Apache kıyaslama ve ekran terminal çoklayıcıyı yükleyin

yum -y install stub_http_server screen mc httpd-tools screen

Daha fazla günlük olması için /var/lib/stub_http_server/stub_http_server.js dosyasındaki stub_http_server yanıt süresini düzelttim.

var max_sleep = 10;

Stub_http_server'ı başlatalım.

systemctl start stub_http_server
systemctl enable stub_http_server

Clickhouse kurulumu sunucu 3'te

ClickHouse, SSE 4.2 talimat setini kullanır, dolayısıyla aksi belirtilmedikçe, kullanılan işlemcide bunun desteklenmesi ek bir sistem gereksinimi haline gelir. Mevcut işlemcinin SSE 4.2'yi destekleyip desteklemediğini kontrol etmek için komut:

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

Öncelikle resmi depoyu bağlamanız gerekir:

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

Paketleri yüklemek için aşağıdaki komutları çalıştırmanız gerekir:

sudo yum install -y clickhouse-server clickhouse-client

Clickhouse-server'ın /etc/clickhouse-server/config.xml dosyasındaki ağ kartını dinlemesine izin ver

<listen_host>0.0.0.0</listen_host>

Günlük düzeyini izlemeden hata ayıklamaya değiştirme

ayıklamak

Standart sıkıştırma ayarları:

min_compress_block_size  65536
max_compress_block_size  1048576

Zstd sıkıştırmasını etkinleştirmek için yapılandırmaya dokunmamanız, bunun yerine DDL kullanmanız önerildi.

Vector kullanarak Nginx json günlüklerini Clickhouse ve Elasticsearch'e gönderme

Google'da zstd sıkıştırmasının DDL aracılığıyla nasıl kullanılacağını bulamadım. Bu yüzden olduğu gibi bıraktım.

Clickhouse'da zstd sıkıştırmasını kullanan meslektaşlarımız lütfen talimatları paylaşın.

Sunucuyu bir daemon olarak başlatmak için şunu çalıştırın:

service clickhouse-server start

Şimdi Clickhouse kurulumuna geçelim

Clickhouse'a git

clickhouse-client -h 172.26.10.109 -m

172.26.10.109 — Clickhouse'un kurulu olduğu sunucunun IP'si.

Bir vektör veritabanı oluşturalım

CREATE DATABASE vector;

Veritabanının var olup olmadığını kontrol edelim.

show databases;

Bir Vector.logs tablosu oluşturun.

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

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;

Tabloların oluşturulduğunu kontrol ediyoruz. Hadi başlatalım clickhouse-client ve bir talepte bulunun.

Vektör veritabanına gidelim.

use vector;

Ok.

0 rows in set. Elapsed: 0.001 sec.

Tablolara bakalım.

show tables;

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

Aynı verileri Clickhouse ile karşılaştırmak üzere Elasticsearch'e göndermek için 4. sunucuya elasticsearch'ü yükleme

Genel bir rpm anahtarı ekleyin

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

2 repo oluşturalım:

/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 ve kibana'yı yükleyin

yum install -y kibana elasticsearch

1 kopya halinde olacağından /etc/elasticsearch/elasticsearch.yml dosyasına aşağıdakileri eklemeniz gerekmektedir:

discovery.type: single-node

Bu vektörün başka bir sunucudan elasticsearch’e veri gönderebilmesi için network.host’u değiştirelim.

network.host: 0.0.0.0

Kibana'ya bağlanmak için /etc/kibana/kibana.yml dosyasındaki server.Host parametresini değiştirin.

server.host: "0.0.0.0"

Eski ve otomatik başlatmaya elasticsearch'ü dahil et

systemctl enable elasticsearch
systemctl start elasticsearch

ve kibana

systemctl enable kibana
systemctl start kibana

Elasticsearch'ü tek düğüm modu 1 parça, 0 kopya için yapılandırma. Büyük ihtimalle çok sayıda sunucudan oluşan bir kümeye sahip olacaksınız ve bunu yapmanıza gerek yok.

Gelecekteki dizinler için varsayılan şablonu güncelleyin:

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

Montaj vektör sunucu 2'deki Logstash'ın yerine

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

Logstash'ın yerine Vector'u ayarlayalım. /etc/vector/vector.toml dosyasını düzenleme

# /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 bölümünü ayarlayabilirsiniz.

beri Vyacheslav Rakhinsky bu yapılandırmaları küçük bir CDN için kullanır ve upstream_*'da birkaç değer olabilir

Örneğin:

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

Durumunuz bu değilse bu bölüm basitleştirilebilir

systemd /etc/systemd/system/vector.service için servis ayarlarını oluşturalım

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

Tabloları oluşturduktan sonra Vector'u çalıştırabilirsiniz.

systemctl enable vector
systemctl start vector

Vektör günlükleri şu şekilde görüntülenebilir:

journalctl -f -u vector

Günlüklerde buna benzer girişler olmalı

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

İstemcide (Web sunucusu) - 1. sunucu

Nginx'li sunucuda ipv6'yı devre dışı bırakmanız gerekir çünkü clickhouse'daki günlükler tablosu bu alanı kullanır upstream_addr IPv4, ağ içinde ipv6 kullanmadığım için. İpv6 kapatılmazsa hatalar olacaktır:

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

Belki okuyucular ipv6 desteğini ekleyin.

/etc/sysctl.d/98-disable-ipv6.conf dosyasını oluşturun

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

Ayarları uygulama

sysctl --system

Nginx'i kuralım.

Nginx depo dosyası /etc/yum.repos.d/nginx.repo eklendi

[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 yükleyin

yum install -y nginx

Öncelikle Nginx'teki günlük formatını /etc/nginx/nginx.conf dosyasında yapılandırmamız gerekiyor.

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

Mevcut yapılandırmanızı bozmamak için Nginx, çeşitli erişim_log yönergelerine sahip olmanıza izin verir.

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

Yeni loglar için logrotate kuralı eklemeyi unutmayın (log dosyası .log ile bitmiyorsa)

/etc/nginx/conf.d/ dosyasından default.conf dosyasını kaldırın

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

Sanal ana bilgisayar /etc/nginx/conf.d/vhost1.conf ekleyin

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

Sanal ana bilgisayar /etc/nginx/conf.d/vhost2.conf ekleyin

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

Sanal ana bilgisayar /etc/nginx/conf.d/vhost3.conf ekleyin

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

Sanal ana bilgisayar /etc/nginx/conf.d/vhost4.conf ekleyin

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

/etc/hosts dosyasına tüm sunuculara sanal ana bilgisayarlar (nginx'in kurulu olduğu sunucunun 172.26.10.106 ip'i) ekleyin:

172.26.10.106 vhost1
172.26.10.106 vhost2
172.26.10.106 vhost3
172.26.10.106 vhost4

Ve eğer her şey hazırsa o zaman

nginx -t 
systemctl restart nginx

Şimdi kendimiz kuralım vektör

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

systemd /etc/systemd/system/vector.service için bir ayar dosyası oluşturalım

[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

Ve /etc/vector/vector.toml yapılandırmasında Filebeat değişimini yapılandırın. IP adresi 172.26.10.108, log sunucusunun (Vector-Server) IP adresidir.

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"

Günlük dosyalarını okuyabilmesi için vektör kullanıcısını gerekli gruba eklemeyi unutmayın. Örneğin, centos'taki nginx, yönetici grubu haklarına sahip günlükler oluşturur.

usermod -a -G adm vector

Vektör hizmetini başlatalım

systemctl enable vector
systemctl start vector

Vektör günlükleri şu şekilde görüntülenebilir:

journalctl -f -u vector

Günlüklerde böyle bir giriş olması gerekir

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

Stres testi

Test Apache kıyaslaması kullanılarak gerçekleştirilir.

httpd-tools paketi tüm sunuculara kuruldu

Ekranda 4 farklı sunucudan Apache kıyaslamasını kullanarak teste başlıyoruz. Öncelikle ekran terminal çoklayıcıyı başlatıyoruz ve ardından Apache kıyaslamasını kullanarak test etmeye başlıyoruz. Ekranla nasıl çalışılacağını şurada bulabilirsiniz: Makale.

1. sunucudan

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

2. sunucudan

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

3. sunucudan

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

4. sunucudan

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

Clickhouse'daki verileri kontrol edelim

Clickhouse'a git

clickhouse-client -h 172.26.10.109 -m

SQL sorgusu yapma

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'daki tabloların boyutunu öğrenin

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'da ne kadar günlük tutulduğunu öğrenelim.

Vector kullanarak Nginx json günlüklerini Clickhouse ve Elasticsearch'e gönderme

Günlük tablosu boyutu 857.19 MB'dir.

Vector kullanarak Nginx json günlüklerini Clickhouse ve Elasticsearch'e gönderme

Elasticsearch'teki indekste aynı verinin boyutu 4,5 GB'dir.

Parametrelerde vektördeki verileri belirtmezseniz Clickhouse, Elasticsearch'e göre 4500/857.19 = 5.24 kat daha az alır.

Vektörde sıkıştırma alanı varsayılan olarak kullanılır.

Telegram sohbeti tıklama evi
Telegram sohbeti Elasticsearch
Telegram sohbeti "Sistemin toplanması ve analizi mesajlar"

Kaynak: habr.com

Yorum ekle