Envoi de journaux JSON Nginx à l'aide de Vector vers Clickhouse et Elasticsearch

Envoi de journaux JSON Nginx à l'aide de Vector vers Clickhouse et Elasticsearch

vecteur, conçu pour collecter, transformer et envoyer des données de journaux, des métriques et des événements.

→ Github

Écrit en langage Rust, il se caractérise par des performances élevées et une faible consommation de RAM par rapport à ses analogues. De plus, une grande attention est accordée aux fonctions liées à l'exactitude, en particulier à la possibilité de sauvegarder les événements non envoyés dans un tampon sur le disque et de faire pivoter les fichiers.

Sur le plan architectural, Vector est un routeur d'événements qui reçoit des messages d'un ou plusieurs des sources, en s'appliquant éventuellement sur ces messages transformations, et les envoyer à un ou plusieurs drains.

Vector remplace filebeat et logstash, il peut jouer les deux rôles (recevoir et envoyer des journaux), plus de détails à leur sujet En ligne.

Si dans Logstash la chaîne est construite comme entrée → filtre → sortie alors dans Vector elle est sourcesse transforme

Des exemples peuvent être trouvés dans la documentation.

Cette instruction est une instruction révisée de Viatcheslav Rakhinsky. Les instructions originales contiennent le traitement geoip. Lors du test de GeoIP à partir d'un réseau interne, Vector a généré une erreur.

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

Si quelqu'un a besoin de traiter GeoIP, reportez-vous aux instructions originales de Viatcheslav Rakhinsky.

Nous allons configurer la combinaison de Nginx (Journaux d'accès) → Vecteur (Client | Filebeat) → Vecteur (Serveur | Logstash) → séparément dans Clickhouse et séparément dans Elasticsearch. Nous installerons 4 serveurs. Bien que vous puissiez le contourner avec 3 serveurs.

Envoi de journaux JSON Nginx à l'aide de Vector vers Clickhouse et Elasticsearch

Le schéma ressemble à ceci.

Désactivez Selinux sur tous vos serveurs

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

Nous installons un émulateur de serveur HTTP + utilitaires sur tous les serveurs

En tant qu'émulateur de serveur HTTP, nous utiliserons serveur nodejs-stub à partir de Maxime Ignatenko

Nodejs-stub-server n'a pas de RPM. il est créez un RPM pour cela. rpm sera compilé en utilisant Copr Fedora

Ajouter le référentiel antonpatsev/nodejs-stub-server

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

Installez nodejs-stub-server, le benchmark Apache et le multiplexeur de terminal d'écran sur tous les serveurs

yum -y install stub_http_server screen mc httpd-tools screen

J'ai corrigé le temps de réponse stub_http_server dans le fichier /var/lib/stub_http_server/stub_http_server.js afin qu'il y ait plus de journaux.

var max_sleep = 10;

Lançons stub_http_server.

systemctl start stub_http_server
systemctl enable stub_http_server

Installation de Clickhouse sur le serveur 3

ClickHouse utilise le jeu d'instructions SSE 4.2, donc sauf indication contraire, sa prise en charge dans le processeur utilisé devient une exigence système supplémentaire. Voici la commande pour vérifier si le processeur actuel prend en charge SSE 4.2 :

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

Vous devez d'abord vous connecter au référentiel officiel :

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

Pour installer des packages, vous devez exécuter les commandes suivantes :

sudo yum install -y clickhouse-server clickhouse-client

Autoriser clickhouse-server à écouter la carte réseau dans le fichier /etc/clickhouse-server/config.xml

<listen_host>0.0.0.0</listen_host>

Modification du niveau de journalisation de trace à débogage

déboguer

Paramètres de compression standard :

min_compress_block_size  65536
max_compress_block_size  1048576

Pour activer la compression Zstd, il était conseillé de ne pas toucher à la config, mais plutôt d'utiliser DDL.

Envoi de journaux JSON Nginx à l'aide de Vector vers Clickhouse et Elasticsearch

Je n'ai pas trouvé comment utiliser la compression zstd via DDL dans Google. Je l'ai donc laissé tel quel.

Chers collègues qui utilisent la compression zstd dans Clickhouse, veuillez partager les instructions.

Pour démarrer le serveur en tant que démon, exécutez :

service clickhouse-server start

Passons maintenant à la configuration de Clickhouse

Aller sur Clickhouse

clickhouse-client -h 172.26.10.109 -m

172.26.10.109 — IP du serveur sur lequel Clickhouse est installé.

Créons une base de données vectorielles

CREATE DATABASE vector;

Vérifions que la base de données existe.

show databases;

Créez une table 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;

Nous vérifions que les tables ont été créées. Lançons clickhouse-client et faites une demande.

Passons à la base de données vectorielles.

use vector;

Ok.

0 rows in set. Elapsed: 0.001 sec.

Regardons les tableaux.

show tables;

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

Installation d'elasticsearch sur le 4ème serveur pour envoyer les mêmes données à Elasticsearch pour comparaison avec Clickhouse

Ajouter une clé RPM publique

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

Créons 2 dépôts :

/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

Installer ElasticSearch et Kibana

yum install -y kibana elasticsearch

Puisqu'il sera en 1 exemplaire, vous devez ajouter ce qui suit au fichier /etc/elasticsearch/elasticsearch.yml :

discovery.type: single-node

Pour que ce vecteur puisse envoyer des données à elasticsearch depuis un autre serveur, changeons network.host.

network.host: 0.0.0.0

Pour vous connecter à Kibana, modifiez le paramètre server.host dans le fichier /etc/kibana/kibana.yml

server.host: "0.0.0.0"

Ancien et inclut elasticsearch dans le démarrage automatique

systemctl enable elasticsearch
systemctl start elasticsearch

et Kibana

systemctl enable kibana
systemctl start kibana

Configuration d'Elasticsearch pour le mode nœud unique 1 fragment, 0 réplica. Très probablement, vous disposerez d'un cluster composé d'un grand nombre de serveurs et vous n'aurez pas besoin de le faire.

Pour les futurs index, mettez à jour le modèle par défaut :

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

Installation vecteur en remplacement de Logstash sur le serveur 2

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

Configurons Vector en remplacement de Logstash. Modification du fichier /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"

Vous pouvez ajuster la section transforms.nginx_parse_add_defaults.

depuis Viatcheslav Rakhinsky utilise ces configs pour un petit CDN et il peut y avoir plusieurs valeurs en amont_*

Par exemple:

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

Si ce n'est pas votre cas, cette section peut être simplifiée

Créons des paramètres de service pour 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

Après avoir créé les tables, vous pouvez exécuter Vector

systemctl enable vector
systemctl start vector

Les journaux vectoriels peuvent être visualisés comme ceci :

journalctl -f -u vector

Il devrait y avoir des entrées comme celle-ci dans les journaux

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

Sur le client (serveur Web) - 1er serveur

Sur le serveur avec nginx, vous devez désactiver ipv6, car la table des journaux dans Clickhouse utilise le champ upstream_addr IPv4, puisque je n'utilise pas ipv6 à l'intérieur du réseau. Si ipv6 n'est pas désactivé, il y aura des erreurs :

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

Peut-être que les lecteurs ajouteront le support ipv6.

Créez le fichier /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

Application des paramètres

sysctl --system

Installons nginx.

Ajout du fichier de référentiel 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

Installez le paquet nginx

yum install -y nginx

Tout d'abord, nous devons configurer le format du journal dans Nginx dans le fichier /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;
}

Afin de ne pas casser votre configuration actuelle, Nginx vous permet d'avoir plusieurs directives access_log

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

N'oubliez pas d'ajouter une règle pour logrotate pour les nouveaux logs (si le fichier log ne se termine pas par .log)

Supprimez default.conf de /etc/nginx/conf.d/

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

Ajouter un hôte virtuel /etc/nginx/conf.d/vhost1.conf

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

Ajouter un hôte virtuel /etc/nginx/conf.d/vhost2.conf

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

Ajouter un hôte virtuel /etc/nginx/conf.d/vhost3.conf

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

Ajouter un hôte virtuel /etc/nginx/conf.d/vhost4.conf

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

Ajoutez des hôtes virtuels (IP 172.26.10.106 du serveur sur lequel nginx est installé) à tous les serveurs dans le fichier /etc/hosts :

172.26.10.106 vhost1
172.26.10.106 vhost2
172.26.10.106 vhost3
172.26.10.106 vhost4

Et si tout est prêt alors

nginx -t 
systemctl restart nginx

Maintenant, installons-le nous-mêmes vecteur

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

Créons un fichier de paramètres pour 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

Et configurez le remplacement Filebeat dans la configuration /etc/vector/vector.toml. L'adresse IP 172.26.10.108 est l'adresse IP du serveur de journaux (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"

N'oubliez pas d'ajouter l'utilisateur vectoriel au groupe requis afin qu'il puisse lire les fichiers journaux. Par exemple, nginx dans centos crée des journaux avec les droits du groupe adm.

usermod -a -G adm vector

Commençons le service vectoriel

systemctl enable vector
systemctl start vector

Les journaux vectoriels peuvent être visualisés comme ceci :

journalctl -f -u vector

Il devrait y avoir une entrée comme celle-ci dans les journaux

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

Tests de résistance

Nous effectuons des tests à l'aide du benchmark Apache.

Le package httpd-tools a été installé sur tous les serveurs

Nous commençons les tests en utilisant le benchmark Apache à partir de 4 serveurs différents à l'écran. Tout d'abord, nous lançons le multiplexeur de terminal d'écran, puis nous commençons les tests à l'aide du benchmark Apache. Comment travailler avec l'écran que vous pouvez trouver dans article.

Depuis le 1er serveur

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

Depuis le 2er serveur

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

Depuis le 3er serveur

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

Depuis le 4er serveur

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

Vérifions les données dans Clickhouse

Aller sur Clickhouse

clickhouse-client -h 172.26.10.109 -m

Faire une requête 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 │                       │
└──────────────┴─────────────────────┴─────────────┴─────────┴────────────────┴────────────────────┴───────────────────┴─────────────┴────────────────┴────────────────┴────────────────┴──────────────┴──────────────────┴─────────────────┴──────────────────────────┴───────────────────────┴───────────────┴─────────────┴─────────────┴───────────────┴───────────────┴─────────────────────────┴─────────────────────┴───────────────────────┴───────────────────────┴──────────────────────┴──────────────────────────┴────────────────────────┴─────────────────┴───────────────────────

Découvrez la taille des tables dans 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;

Voyons combien de journaux ont été utilisés dans Clickhouse.

Envoi de journaux JSON Nginx à l'aide de Vector vers Clickhouse et Elasticsearch

La taille de la table des journaux est de 857.19 Mo.

Envoi de journaux JSON Nginx à l'aide de Vector vers Clickhouse et Elasticsearch

La taille des mêmes données dans l'index dans Elasticsearch est de 4,5 Go.

Si vous ne spécifiez pas de données dans le vecteur dans les paramètres, Clickhouse prend 4500/857.19 = 5.24 fois moins que dans Elasticsearch.

En vecteur, le champ compression est utilisé par défaut.

Chat télégramme par maison de clic
Chat télégramme par ElasticSearch
Chat télégramme par "Collecte et analyse du système messages"

Source: habr.com

Ajouter un commentaire