Menghantar log json Nginx menggunakan Vector ke Clickhouse dan Elasticsearch

Menghantar log json Nginx menggunakan Vector ke Clickhouse dan Elasticsearch

Vektor, direka untuk mengumpul, mengubah dan menghantar data log, metrik dan peristiwa.

→ Github

Ditulis dalam bahasa Rust, ia dicirikan oleh prestasi tinggi dan penggunaan RAM yang rendah berbanding dengan analognya. Di samping itu, banyak perhatian diberikan kepada fungsi yang berkaitan dengan ketepatan, khususnya, keupayaan untuk menyimpan peristiwa yang tidak dihantar ke penimbal pada cakera dan memutar fail.

Dari segi seni bina, Vektor ialah penghala acara yang menerima mesej daripada satu atau lebih sumber, secara pilihan menggunakan mesej ini transformasi, dan menghantarnya kepada satu atau lebih longkang.

Vektor ialah pengganti untuk filebeat dan logstash, ia boleh bertindak dalam kedua-dua peranan (menerima dan menghantar log), butiran lanjut mengenainya Online.

Jika dalam Logstash rantai dibina sebagai input → penapis → output maka dalam Vektor ia adalah sumberjelmaantenggelam

Contoh boleh didapati dalam dokumentasi.

Arahan ini adalah arahan semakan daripada Vyacheslav Rakhinsky. Arahan asal mengandungi pemprosesan geoip. Apabila menguji geoip daripada rangkaian dalaman, vektor memberikan ralat.

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

Jika sesiapa perlu memproses geoip, maka rujuk kepada arahan asal daripada Vyacheslav Rakhinsky.

Kami akan mengkonfigurasi gabungan Nginx (Log akses) → Vektor (Pelanggan | Filebeat) → Vektor (Pelayan | Logstash) → secara berasingan dalam Clickhouse dan secara berasingan dalam Elasticsearch. Kami akan memasang 4 pelayan. Walaupun anda boleh memintasnya dengan 3 pelayan.

Menghantar log json Nginx menggunakan Vector ke Clickhouse dan Elasticsearch

Skimnya adalah seperti ini.

Lumpuhkan Selinux pada semua pelayan anda

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

Kami memasang emulator pelayan HTTP + utiliti pada semua pelayan

Sebagai emulator pelayan HTTP kami akan gunakan nodejs-stub-server daripada Maxim Ignatenko

Nodejs-stub-server tidak mempunyai rpm. ia adalah buat rpm untuknya. rpm akan dibina menggunakan Fedora Copr

Tambahkan repositori antonpatsev/nodejs-stub-server

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

Pasang nodejs-stub-server, penanda aras Apache dan pemultipleks terminal skrin pada semua pelayan

yum -y install stub_http_server screen mc httpd-tools screen

Saya membetulkan masa tindak balas stub_http_server dalam fail /var/lib/stub_http_server/stub_http_server.js supaya terdapat lebih banyak log.

var max_sleep = 10;

Mari kita lancarkan stub_http_server.

systemctl start stub_http_server
systemctl enable stub_http_server

Pemasangan Clickhouse pada pelayan 3

ClickHouse menggunakan set arahan SSE 4.2, jadi melainkan dinyatakan sebaliknya, sokongan untuknya dalam pemproses yang digunakan menjadi keperluan sistem tambahan. Berikut ialah arahan untuk menyemak sama ada pemproses semasa menyokong SSE 4.2:

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

Mula-mula anda perlu menyambungkan repositori rasmi:

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

Untuk memasang pakej anda perlu menjalankan arahan berikut:

sudo yum install -y clickhouse-server clickhouse-client

Benarkan clickhouse-server mendengar kad rangkaian dalam fail /etc/clickhouse-server/config.xml

<listen_host>0.0.0.0</listen_host>

Menukar tahap pengelogan daripada jejak kepada nyahpepijat

debug

Tetapan mampatan standard:

min_compress_block_size  65536
max_compress_block_size  1048576

Untuk mengaktifkan pemampatan Zstd, dinasihatkan supaya tidak menyentuh konfigurasi, sebaliknya menggunakan DDL.

Menghantar log json Nginx menggunakan Vector ke Clickhouse dan Elasticsearch

Saya tidak dapat mencari cara menggunakan pemampatan zstd melalui DDL dalam Google. Jadi saya biarkan sahaja.

Rakan sekerja yang menggunakan pemampatan zstd dalam Clickhouse, sila kongsi arahan.

Untuk memulakan pelayan sebagai daemon, jalankan:

service clickhouse-server start

Sekarang mari kita teruskan untuk menyediakan Clickhouse

Pergi ke Clickhouse

clickhouse-client -h 172.26.10.109 -m

172.26.10.109 — IP pelayan tempat Clickhouse dipasang.

Mari buat pangkalan data vektor

CREATE DATABASE vector;

Mari kita semak bahawa pangkalan data itu wujud.

show databases;

Cipta jadual 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;

Kami menyemak bahawa jadual telah dibuat. Jom lancarkan clickhouse-client dan membuat permintaan.

Mari pergi ke pangkalan data vektor.

use vector;

Ok.

0 rows in set. Elapsed: 0.001 sec.

Mari lihat jadual.

show tables;

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

Memasang elasticsearch pada pelayan ke-4 untuk menghantar data yang sama kepada Elasticsearch untuk perbandingan dengan Clickhouse

Tambah kunci rpm awam

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

Mari buat 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

Pasang elasticsearch dan kibana

yum install -y kibana elasticsearch

Memandangkan ia akan berada dalam 1 salinan, anda perlu menambah yang berikut pada fail /etc/elasticsearch/elasticsearch.yml:

discovery.type: single-node

Supaya vektor boleh menghantar data ke elasticsearch dari pelayan lain, mari tukar network.host.

network.host: 0.0.0.0

Untuk menyambung ke kibana, tukar parameter server.host dalam fail /etc/kibana/kibana.yml

server.host: "0.0.0.0"

Lama dan sertakan elasticsearch dalam autostart

systemctl enable elasticsearch
systemctl start elasticsearch

dan kibana

systemctl enable kibana
systemctl start kibana

Mengkonfigurasi Elasticsearch untuk mod satu nod 1 shard, 0 replika. Kemungkinan besar anda akan mempunyai sekumpulan sejumlah besar pelayan dan anda tidak perlu melakukan ini.

Untuk indeks masa hadapan, kemas kini templat lalai:

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

Pemasangan Vektor sebagai pengganti Logstash pada pelayan 2

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

Mari sediakan Vektor sebagai pengganti Logstash. Mengedit fail /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"

Anda boleh melaraskan bahagian transforms.nginx_parse_add_defaults.

Sebagai Vyacheslav Rakhinsky menggunakan konfigurasi ini untuk CDN kecil dan mungkin terdapat beberapa nilai di hulu_*

Sebagai contoh:

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

Jika ini bukan situasi anda, maka bahagian ini boleh dipermudahkan

Mari buat tetapan perkhidmatan untuk 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

Selepas mencipta jadual, anda boleh menjalankan Vector

systemctl enable vector
systemctl start vector

Log vektor boleh dilihat seperti ini:

journalctl -f -u vector

Perlu ada entri seperti ini dalam log

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

Pada klien (Pelayan web) - pelayan pertama

Pada pelayan dengan nginx, anda perlu melumpuhkan ipv6, kerana jadual log dalam clickhouse menggunakan medan upstream_addr IPv4, kerana saya tidak menggunakan ipv6 di dalam rangkaian. Jika ipv6 tidak dimatikan, akan terdapat ralat:

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

Mungkin pembaca, tambah sokongan ipv6.

Cipta fail /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

Menggunakan tetapan

sysctl --system

Mari pasang nginx.

Menambahkan fail repositori 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

Pasang pakej nginx

yum install -y nginx

Pertama, kita perlu mengkonfigurasi format log dalam Nginx dalam fail /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;
}

Untuk tidak memecahkan konfigurasi semasa anda, Nginx membenarkan anda mempunyai beberapa arahan access_log

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

Jangan lupa untuk menambah peraturan untuk logrotate untuk log baharu (jika fail log tidak berakhir dengan .log)

Alih keluar default.conf daripada /etc/nginx/conf.d/

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

Tambahkan hos maya /etc/nginx/conf.d/vhost1.conf

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

Tambahkan hos maya /etc/nginx/conf.d/vhost2.conf

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

Tambahkan hos maya /etc/nginx/conf.d/vhost3.conf

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

Tambahkan hos maya /etc/nginx/conf.d/vhost4.conf

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

Tambah hos maya (172.26.10.106 ip pelayan tempat nginx dipasang) ke semua pelayan ke fail /etc/hosts:

172.26.10.106 vhost1
172.26.10.106 vhost2
172.26.10.106 vhost3
172.26.10.106 vhost4

Dan jika semuanya sudah siap

nginx -t 
systemctl restart nginx

Sekarang mari kita pasang sendiri Vektor

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

Mari buat fail tetapan untuk 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

Dan konfigurasikan penggantian Filebeat dalam konfigurasi /etc/vector/vector.toml. Alamat IP 172.26.10.108 ialah alamat IP pelayan log (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"

Jangan lupa untuk menambah pengguna vektor ke kumpulan yang diperlukan supaya dia boleh membaca fail log. Contohnya, nginx dalam centos mencipta log dengan hak kumpulan adm.

usermod -a -G adm vector

Mari mulakan perkhidmatan vektor

systemctl enable vector
systemctl start vector

Log vektor boleh dilihat seperti ini:

journalctl -f -u vector

Patutnya ada entry macam ni dalam log

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

Ujian Tekanan

Pengujian dijalankan menggunakan penanda aras Apache.

Pakej httpd-tools telah dipasang pada semua pelayan

Kami mula menguji menggunakan penanda aras Apache daripada 4 pelayan berbeza dalam skrin. Mula-mula, kami melancarkan pemultipleks terminal skrin, dan kemudian kami mula menguji menggunakan penanda aras Apache. Cara bekerja dengan skrin yang anda boleh temui di artikel.

Dari pelayan pertama

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

Dari pelayan pertama

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

Dari pelayan pertama

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

Dari pelayan pertama

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

Mari semak data dalam Clickhouse

Pergi ke Clickhouse

clickhouse-client -h 172.26.10.109 -m

Membuat pertanyaan 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 │                       │
└──────────────┴─────────────────────┴─────────────┴─────────┴────────────────┴────────────────────┴───────────────────┴─────────────┴────────────────┴────────────────┴────────────────┴──────────────┴──────────────────┴─────────────────┴──────────────────────────┴───────────────────────┴───────────────┴─────────────┴─────────────┴───────────────┴───────────────┴─────────────────────────┴─────────────────────┴───────────────────────┴───────────────────────┴──────────────────────┴──────────────────────────┴────────────────────────┴─────────────────┴───────────────────────

Ketahui saiz jadual dalam 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;

Mari kita ketahui jumlah log yang digunakan dalam Clickhouse.

Menghantar log json Nginx menggunakan Vector ke Clickhouse dan Elasticsearch

Saiz jadual log ialah 857.19 MB.

Menghantar log json Nginx menggunakan Vector ke Clickhouse dan Elasticsearch

Saiz data yang sama dalam indeks dalam Elasticsearch ialah 4,5GB.

Jika anda tidak menyatakan data dalam vektor dalam parameter, Clickhouse mengambil 4500/857.19 = 5.24 kali kurang daripada dalam Elasticsearch.

Dalam vektor, medan mampatan digunakan secara lalai.

Sembang telegram oleh clickhouse
Sembang telegram oleh Elasticsearch
Sembang telegram oleh "Pengumpulan dan analisis sistem mesej"

Sumber: www.habr.com

Tambah komen