إرسال سجلات Nginx json مع Vector إلى Clickhouse و Elasticsearch

إرسال سجلات Nginx json مع Vector إلى Clickhouse و Elasticsearch

ناقلات، مصممة لجمع وتحويل وإرسال بيانات السجل والمقاييس والأحداث.

→ جيثب

نظرًا لكونها مكتوبة بلغة Rust ، فهي تتميز بأداء عالٍ واستهلاك منخفض لذاكرة الوصول العشوائي مقارنةً بنظيراتها. بالإضافة إلى ذلك ، يتم إيلاء الكثير من الاهتمام للوظائف المتعلقة بالصحة ، على وجه الخصوص ، القدرة على حفظ الأحداث غير المرسلة في مخزن مؤقت على القرص وتناوب الملفات.

من الناحية المعمارية ، يعد Vector جهاز توجيه أحداث يقبل الرسائل من واحد أو أكثر مصادر، يتم تطبيقه اختياريًا على هذه الرسائل التحولات، وإرسالها إلى واحد أو أكثر المصارف.

Vector هو بديل لـ filebeat و logstash ، يمكنه العمل في كلا الدورين (استلام السجلات وإرسالها) ، مزيد من التفاصيل عنها على الانترنت.

إذا تم بناء السلسلة في Logstash كمدخلات ← مرشح ← إخراج ، فعندئذ تكون في Vector تقارير عن مصادر العطور بدون العلبةالتحويلاتالمصارف

يمكن العثور على أمثلة في الوثائق.

هذه التعليمات هي تعليمات منقحة من فياتشيسلاف راخينسكي. التعليمات الأصلية لها معالجة geoip. عند اختبار geoip من الشبكة الداخلية ، أعطاني المتجه خطأ.

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 (سجلات الوصول) → Vector (Client | Filebeat) → Vector (Server | Logstash) → بشكل منفصل في Clickhouse وبشكل منفصل في Elasticsearch. قم بإعداد 4 خوادم. على الرغم من أنه من الممكن تجاوز 3 خوادم.

إرسال سجلات Nginx json مع Vector إلى Clickhouse و Elasticsearch

المخطط شيء من هذا القبيل.

قم بإيقاف تشغيل Selinux على جميع الخوادم الخاصة بك

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

قم بتثبيت محاكي خادم HTTP + الأدوات المساعدة على جميع الخوادم

سنستخدم كمحاكي خادم HTTP خادم Nodejs-Stub من مكسيم اجناتنكو

nodejs-stub-server ليس لديه rpm. ومن إنشاء دورة في الدقيقة لذلك. rpm سيتم بناؤها باستخدام فيدورا كوبر

أضف مستودع خادم antonpatsev / nodejs-stub

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

تم تصحيح وقت استجابة stub_http_server في ملف /var/lib/stub_http_server/stub_http_server.js للحصول على المزيد من السجلات.

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.

إرسال سجلات Nginx json مع Vector إلى Clickhouse و Elasticsearch

لم أجد كيفية تطبيق ضغط zstd عبر DDL في Google. لذلك تركتها كما هي.

الزملاء الذين يستخدمون ضغط zstd في Clickhouse - يرجى مشاركة التعليمات.

لبدء الخادم كبرنامج خفي ، قم بتشغيل:

service clickhouse-server start

الآن دعنا ننتقل إلى إعداد Clickhouse

اذهب إلى Clickhouse

clickhouse-client -h 172.26.10.109 -m

172.26.10.109 - IP للخادم حيث تم تثبيت Clickhouse.

قم بإنشاء قاعدة بيانات متجه

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

تثبيت elasticsearch على الخادم الرابع لإرسال نفس البيانات إلى Elasticsearch للمقارنة مع Clickhouse

أضف مفتاح 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

نظرًا لأنه سيكون في حالة واحدة ، فأنت بحاجة إلى إضافة ملف /etc/elasticsearch/elasticsearch.yml:

discovery.type: single-node

لكي يقوم المتجه بإرسال البيانات إلى elasticsearch من خادم آخر ، سنقوم بتغيير network.host.

network.host: 0.0.0.0

للاتصال بـ kibana ، قم بتغيير معلمة server.host في ملف /etc/kibana/kibana.yml

server.host: "0.0.0.0"

قديم وتشمل البحث المطاطي في التشغيل التلقائي

systemctl enable elasticsearch
systemctl start elasticsearch

و kibana

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

تركيب ناقلات كبديل لخادم Logstash على 2

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

لنقم بإعداد Vector كبديل لـ 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

بعد إنشاء الجداول ، يمكنك تشغيل Vector

systemctl enable vector
systemctl start vector

يمكن عرض سجلات المتجهات على هذا النحو

journalctl -f -u vector

يجب أن تحتوي السجلات على إدخالات مثل هذه

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

على العميل (خادم الويب) - الخادم الأول

على الخادم مع 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

نحتاج أولاً إلى تكوين تنسيق سجل Nginx في ملف /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;
}

من أجل عدم كسر إعداداتك الحالية ، يسمح لك 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;
    }
}

أضف مضيفين افتراضيين (172.26.10.106 ip للخادم حيث تم تثبيت nginx) إلى جميع الخوادم في ملف / etc / hosts:

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

وقم بتكوين استبدال Filebeat في /etc/vector/vector.toml config. عنوان IP 172.26.10.108 هو عنوان IP لخادم السجل (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"

لا تنس إضافة متجه المستخدم إلى المجموعة الصحيحة حتى يتمكن من قراءة ملفات السجل. على سبيل المثال ، يقوم nginx على السنتوس بإنشاء سجلات مع حقوق مجموعة adm.

usermod -a -G adm vector

لنبدأ خدمة المتجهات

systemctl enable vector
systemctl start vector

يمكن عرض سجلات المتجهات على هذا النحو

journalctl -f -u vector

يجب أن تحتوي السجلات على شيء من هذا القبيل

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

اختبار الإجهاد

يتم إجراء الاختبار باستخدام معيار أباتشي.

تم تثبيت حزمة أدوات httpd على كافة الخوادم

نبدأ الاختبار باستخدام معيار Apache من 4 خوادم مختلفة في الشاشة. أولاً ، نطلق معدد الإرسال الطرفي للشاشة ، ثم نبدأ في الاختبار باستخدام معيار Apache. كيفية العمل مع الشاشة التي يمكنك العثور عليها مقالة.

من الخادم الأول

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

من الخادم الأول

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

من الخادم الأول

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

من الخادم الأول

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.

إرسال سجلات Nginx json مع Vector إلى Clickhouse و Elasticsearch

حجم جدول السجلات 857.19 ميجابايت.

إرسال سجلات Nginx json مع Vector إلى Clickhouse و Elasticsearch

حجم نفس البيانات في الفهرس في Elasticsearch هو 4,5 جيجابايت.

إذا لم يتم تحديد معلمات المتجه في Clickhouse ، فإن البيانات تأخذ 4500 / 857.19 = 5.24 مرة أقل من Elasticsearch.

في المتجه ، يتم استخدام حقل الضغط افتراضيًا.

دردشة برقية عن طريق بيت النقر
دردشة برقية عن طريق Elasticsearch
محادثة Telegram بواسطة "جمع وتحليل النظام رسائل"

المصدر: www.habr.com

إضافة تعليق