Clickhouse жана Elasticsearch үчүн Vector аркылуу Nginx json журналдарын жөнөтүү

Clickhouse жана Elasticsearch үчүн Vector аркылуу Nginx json журналдарын жөнөтүү

оору, журнал маалыматтарын, көрсөткүчтөрдү жана окуяларды чогултуу, өзгөртүү жана жөнөтүү үчүн иштелип чыккан.

→ Github

Rust тилинде жазылгандыктан, анын аналогдоруна салыштырмалуу жогорку өндүрүмдүүлүгү жана аз RAM керектөөсү менен мүнөздөлөт. Мындан тышкары, тууралыкка байланыштуу функцияларга, атап айтканда, дисктеги буферге жөнөтүлбөгөн окуяларды сактоо жана файлдарды айлантуу мүмкүнчүлүгүнө көп көңүл бурулат.

Архитектуралык жактан Вектор бир же бир нече билдирүүлөрдү кабыл алган окуя роутер булактар, ыктыярдуу түрдө бул билдирүүлөрдүн үстүнөн колдонуу трансформациялар, жана аларды бир же бир нечеге жөнөтүү дренаждар.

Vector - бул filebeat жана logstash үчүн алмаштыруу, ал эки ролдо тең иштей алат (журналдарды кабыл алуу жана жөнөтүү), алар боюнча кененирээк маалымат сайты.

Logstashте чынжыр киргизүү → чыпка → чыгаруу катары курулган болсо, Вектордо бул булактарпротонгожуучу

Мисалдарды документациядан тапса болот.

Бул нускама кайра каралган нускама болуп саналат Вячеслав Рахинский. Баштапкы нускамалар геоипти иштетүүнү камтыйт. Ички тармактан геоипти текшерүүдө вектор ката берди.

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 (Кирүү журналдары) → Вектор (Клиент | Filebeat) → Вектор (Сервер | Logstash) → Clickhouse'да өзүнчө жана Elasticsearch'те өзүнчө конфигурациялайбыз. Биз 4 серверди орнотобуз. Сиз аны 3 сервер менен айланып өтсөңүз болот.

Clickhouse жана Elasticsearch үчүн Vector аркылуу Nginx json журналдарын жөнөтүү

Схема ушуга окшош.

Бардык серверлериңизде Selinuxту өчүрүңүз

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

Биз бардык серверлерге HTTP сервер эмуляторун + утилиталарын орнотобуз

HTTP сервер эмулятору катары биз колдонобуз nodejs-stub-сервер от Максим Игнатенко

Nodejs-stub-серверинде rpm жок. бул ал үчүн rpm түзүү. rpm колдонуу менен түзүлөт Fedora Copr

antonpatsev/nodejs-stub-server репозиторийсин кошуңуз

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

Бардык серверлерде nodejs-stub-server, Apache бенчмарк жана экран терминалынын мультиплексерин орнотуңуз

yum -y install stub_http_server screen mc httpd-tools screen

Мен /var/lib/stub_http_server/stub_http_server.js файлындагы stub_http_server жооп убактысын оңдоп, журналдар көбүрөөк болушу үчүн оңдодум.

var max_sleep = 10;

stub_http_serverди ишке киргизели.

systemctl start stub_http_server
systemctl enable stub_http_server

Clickhouse орнотуу серверде 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-серверге /etc/clickhouse-server/config.xml файлындагы тармак картасын угууга уруксат бериңиз

<listen_host>0.0.0.0</listen_host>

Каттоо деңгээлин издөөдөн мүчүлүштүктөрдү оңдоого өзгөртүү

жөндөөчү

Стандарттык кысуу орнотуулары:

min_compress_block_size  65536
max_compress_block_size  1048576

Zstd кысуусун активдештирүү үчүн конфигурацияга тийбей, тескерисинче DDLди колдонуу сунушталды.

Clickhouse жана Elasticsearch үчүн Vector аркылуу Nginx json журналдарын жөнөтүү

Мен Google'да DDL аркылуу zstd кысуу кантип колдонууну таба алган жокмун. Ошентип, мен аны ошол бойдон калтырдым.

Clickhouse'да zstd компрессиясын колдонгон кесиптештер, нускамаларды бөлүшүңүз.

Серверди демон катары баштоо үчүн:

service clickhouse-server start

Эми Clickhouse орнотууга өтөлү

Clickhouse'га өтүңүз

clickhouse-client -h 172.26.10.109 -m

172.26.10.109 — Clickhouse орнотулган сервердин IP.

Вектордук база түзөлү

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                │
└─────────────────────┘

Clickhouse менен салыштыруу үчүн ошол эле маалыматтарды Elasticsearchке жөнөтүү үчүн 4-серверге elasticsearch орнотуу

Жалпыга ачык rpm ачкычын кошуңуз

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

2 репо түзөлү:

/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'га туташуу үчүн /etc/kibana/kibana.yml файлындагы server.host параметрин өзгөртүңүз

server.host: "0.0.0.0"

Эски жана autostartга 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"}}' 

жөндөө оору Server 2деги Logstash үчүн алмаштыруу катары

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

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

Таблицаларды түзгөндөн кийин, Векторду иштете аласыз

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

Биринчиден, /etc/nginx/nginx.conf файлында Nginx журналынын форматын конфигурациялашыбыз керек.

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 директивасына ээ болууга мүмкүнчүлүк берет

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

Жаңы журналдар үчүн логротациялоо эрежесин кошууну унутпаңыз (эгерде лог файлы .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;
    }
}

/etc/hosts файлына бардык серверлерге виртуалдык хостторду (nginx орнотулган сервердин 172.26.10.106 ip) кошуңуз:

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

Жана /etc/vector/vector.toml конфигурациясында Filebeat алмаштырууну конфигурациялаңыз. IP дареги 172.26.10.108 - журнал серверинин IP дареги (Вектор-Сервер)

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"

Вектордук колдонуучуну керектүү топко кошууну унутпаңыз, ал лог файлдарын окуй алат. Мисалы, centos ичиндеги nginx adm тобунун укуктары менен журналдарды түзөт.

usermod -a -G adm vector

Вектордук кызматты баштайлы

systemctl enable vector
systemctl start vector

Вектордук журналдарды төмөнкүдөй көрүүгө болот:

journalctl -f -u vector

Журналдарда ушундай жазуу болушу керек

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

Стресс тестирлөө

Биз Apache эталонунун жардамы менен тестирлөө жүргүзөбүз.

httpd-tools пакети бардык серверлерде орнотулган

Экрандагы 4 башка серверден Apache эталондорун колдонуп сынап баштайбыз. Биринчиден, биз экран терминалынын мультиплексорун ишке киргизебиз, андан кийин 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'да канча журналдарды ээлегенин билели.

Clickhouse жана Elasticsearch үчүн Vector аркылуу Nginx json журналдарын жөнөтүү

журналдар үстөл өлчөмү 857.19 MB болуп саналат.

Clickhouse жана Elasticsearch үчүн Vector аркылуу Nginx json журналдарын жөнөтүү

Elasticsearch индексиндеги ошол эле маалыматтардын көлөмү 4,5 ГБ.

Эгер параметрлерде вектордо маалыматтарды көрсөтпөсөңүз, Clickhouse Elasticsearchге караганда 4500/857.19 = 5.24 эсе аз алат.

Вектордо кысуу талаасы демейки боюнча колдонулат.

Telegram чат аркылуу Clickhouse
Telegram чат аркылуу ElasticSearch
Telegram чаты "Системаны чогултуу жана талдоо кабарлар"

Source: www.habr.com

Комментарий кошуу