Nagpapadala ng mga log ng Nginx json gamit ang Vector sa Clickhouse at Elasticsearch

Nagpapadala ng mga log ng Nginx json gamit ang Vector sa Clickhouse at Elasticsearch

Vector, na idinisenyo upang mangolekta, magbago at magpadala ng data ng log, mga sukatan at mga kaganapan.

→ Github

Ang pagiging nakasulat sa wikang Rust, ito ay nailalarawan sa pamamagitan ng mataas na pagganap at mababang pagkonsumo ng RAM kumpara sa mga analogue nito. Bilang karagdagan, maraming pansin ang binabayaran sa mga function na may kaugnayan sa kawastuhan, sa partikular, ang kakayahang mag-save ng mga hindi naipadalang kaganapan sa isang buffer sa disk at i-rotate ang mga file.

Sa arkitektura, ang Vector ay isang event router na tumatanggap ng mga mensahe mula sa isa o higit pa mga mapagkukunan, opsyonal na inilalapat sa mga mensaheng ito mga pagbabagong-anyo, at pagpapadala sa kanila sa isa o higit pa drains.

Ang Vector ay isang kapalit para sa filebeat at logstash, maaari itong kumilos sa parehong mga tungkulin (tumanggap at magpadala ng mga log), higit pang mga detalye sa mga ito Online.

Kung sa Logstash ang chain ay binuo bilang input → filter → output pagkatapos ay sa Vector ito pinagkukunannagbabagolababo

Ang mga halimbawa ay matatagpuan sa dokumentasyon.

Ang tagubiling ito ay isang binagong tagubilin mula sa Vyacheslav Rakhinsky. Ang orihinal na mga tagubilin ay naglalaman ng geoip processing. Kapag sinusubukan ang geoip mula sa isang panloob na network, nagbigay ng error ang vector.

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

Kung kailangan ng sinuman na magproseso ng geoip, sumangguni sa orihinal na mga tagubilin mula sa Vyacheslav Rakhinsky.

Iko-configure namin ang kumbinasyon ng Nginx (Access logs) → Vector (Client | Filebeat) → Vector (Server | Logstash) → hiwalay sa Clickhouse at hiwalay sa Elasticsearch. Mag-i-install kami ng 4 na server. Bagama't maaari mong i-bypass ito gamit ang 3 server.

Nagpapadala ng mga log ng Nginx json gamit ang Vector sa Clickhouse at Elasticsearch

Ang scheme ay isang bagay tulad nito.

Huwag paganahin ang Selinux sa lahat ng iyong mga server

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

Nag-i-install kami ng HTTP server emulator + utility sa lahat ng server

Bilang isang HTTP server emulator ang gagamitin namin nodejs-stub-server mula sa Maxim Ignatenko

Walang rpm ang Nodejs-stub-server. Dito lumikha ng rpm para dito. rpm ay bubuuin gamit ang Fedora Copr

Idagdag ang repositoryo ng antonpatsev/nodejs-stub-server

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

I-install ang nodejs-stub-server, Apache benchmark at screen terminal multiplexer sa lahat ng server

yum -y install stub_http_server screen mc httpd-tools screen

Itinama ko ang oras ng pagtugon ng stub_http_server sa file na /var/lib/stub_http_server/stub_http_server.js upang magkaroon ng higit pang mga log.

var max_sleep = 10;

Ilunsad natin ang stub_http_server.

systemctl start stub_http_server
systemctl enable stub_http_server

Pag-install ng Clickhouse sa server 3

Ginagamit ng ClickHouse ang set ng pagtuturo ng SSE 4.2, kaya maliban kung tinukoy, ang suporta para dito sa processor na ginamit ay nagiging karagdagang kinakailangan ng system. Narito ang utos upang suriin kung sinusuportahan ng kasalukuyang processor ang SSE 4.2:

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

Una kailangan mong ikonekta ang opisyal na imbakan:

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

Upang mag-install ng mga pakete kailangan mong patakbuhin ang mga sumusunod na command:

sudo yum install -y clickhouse-server clickhouse-client

Payagan ang clickhouse-server na makinig sa network card sa file /etc/clickhouse-server/config.xml

<listen_host>0.0.0.0</listen_host>

Pagbabago sa antas ng pag-log mula sa bakas patungo sa pag-debug

mag-alis ng mga insekto

Mga karaniwang setting ng compression:

min_compress_block_size  65536
max_compress_block_size  1048576

Upang i-activate ang Zstd compression, pinayuhan na huwag hawakan ang config, ngunit sa halip ay gumamit ng DDL.

Nagpapadala ng mga log ng Nginx json gamit ang Vector sa Clickhouse at Elasticsearch

Hindi ko mahanap kung paano gamitin ang zstd compression sa pamamagitan ng DDL sa Google. Kaya hinayaan ko nalang.

Mga kasamahan na gumagamit ng zstd compression sa Clickhouse, mangyaring ibahagi ang mga tagubilin.

Upang simulan ang server bilang isang daemon, patakbuhin ang:

service clickhouse-server start

Ngayon ay magpatuloy tayo sa pag-set up ng Clickhouse

Pumunta sa Clickhouse

clickhouse-client -h 172.26.10.109 -m

172.26.10.109 — IP ng server kung saan naka-install ang Clickhouse.

Gumawa tayo ng vector database

CREATE DATABASE vector;

Suriin natin na ang database ay umiiral.

show databases;

Gumawa ng vector.logs table.

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

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;

Sinusuri namin na ang mga talahanayan ay nalikha na. Ilunsad natin clickhouse-client at gumawa ng isang kahilingan.

Pumunta tayo sa database ng vector.

use vector;

Ok.

0 rows in set. Elapsed: 0.001 sec.

Tingnan natin ang mga talahanayan.

show tables;

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

Pag-install ng elasticsearch sa ika-4 na server upang ipadala ang parehong data sa Elasticsearch para sa paghahambing sa Clickhouse

Magdagdag ng pampublikong rpm key

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

Gumawa tayo ng 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

I-install ang elasticsearch at kibana

yum install -y kibana elasticsearch

Dahil ito ay nasa 1 kopya, kailangan mong idagdag ang sumusunod sa /etc/elasticsearch/elasticsearch.yml file:

discovery.type: single-node

Para makapagpadala ang vector ng data sa elasticsearch mula sa ibang server, baguhin natin ang network.host.

network.host: 0.0.0.0

Para kumonekta sa kibana, baguhin ang server.host parameter sa file /etc/kibana/kibana.yml

server.host: "0.0.0.0"

Luma at isama ang elasticsearch sa autostart

systemctl enable elasticsearch
systemctl start elasticsearch

at kibana

systemctl enable kibana
systemctl start kibana

Pag-configure ng Elasticsearch para sa single-node mode 1 shard, 0 replica. Malamang na magkakaroon ka ng isang kumpol ng isang malaking bilang ng mga server at hindi mo kailangang gawin ito.

Para sa mga index sa hinaharap, i-update ang default na template:

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

Instalasyon Vector bilang kapalit ng Logstash sa server 2

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

I-set up natin ang Vector bilang kapalit ng Logstash. Pag-edit ng file /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"

Maaari mong isaayos ang seksyong transforms.nginx_parse_add_defaults.

Bilang Vyacheslav Rakhinsky ginagamit ang mga config na ito para sa isang maliit na CDN at maaaring mayroong ilang mga halaga sa upstream_*

Halimbawa:

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

Kung hindi ito ang iyong sitwasyon, maaaring gawing simple ang seksyong ito

Gumawa tayo ng mga setting ng serbisyo para sa 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

Pagkatapos gawin ang mga talahanayan, maaari mong patakbuhin ang Vector

systemctl enable vector
systemctl start vector

Ang mga vector log ay maaaring matingnan nang ganito:

journalctl -f -u vector

Dapat may mga entry na ganito sa logs

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

Sa client (Web server) - 1st server

Sa server na may nginx, kailangan mong i-disable ang ipv6, dahil ang logs table sa clickhouse ay gumagamit ng field upstream_addr IPv4, dahil hindi ako gumagamit ng ipv6 sa loob ng network. Kung hindi naka-off ang ipv6, magkakaroon ng mga error:

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

Marahil mga mambabasa, magdagdag ng suporta sa ipv6.

Lumikha ng file /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

Paglalapat ng mga setting

sysctl --system

I-install natin ang nginx.

Idinagdag ang nginx repository file /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

I-install ang nginx package

yum install -y nginx

Una, kailangan nating i-configure ang format ng log sa Nginx sa file /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;
}

Upang hindi masira ang iyong kasalukuyang configuration, pinapayagan ka ng Nginx na magkaroon ng ilang access_log na mga direktiba

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

Huwag kalimutang magdagdag ng panuntunan upang mag-logrotate para sa mga bagong log (kung ang log file ay hindi nagtatapos sa .log)

Alisin ang default.conf mula sa /etc/nginx/conf.d/

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

Magdagdag ng virtual host /etc/nginx/conf.d/vhost1.conf

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

Magdagdag ng virtual host /etc/nginx/conf.d/vhost2.conf

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

Magdagdag ng virtual host /etc/nginx/conf.d/vhost3.conf

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

Magdagdag ng virtual host /etc/nginx/conf.d/vhost4.conf

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

Magdagdag ng mga virtual host (172.26.10.106 ip ng server kung saan naka-install ang nginx) sa lahat ng server sa /etc/hosts file:

172.26.10.106 vhost1
172.26.10.106 vhost2
172.26.10.106 vhost3
172.26.10.106 vhost4

At kung handa na ang lahat

nginx -t 
systemctl restart nginx

Ngayon, i-install natin ito sa ating sarili Vector

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

Gumawa tayo ng file ng mga setting para sa 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

At i-configure ang kapalit na Filebeat sa /etc/vector/vector.toml config. Ang IP address na 172.26.10.108 ay ang IP address ng log server (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"

Huwag kalimutang idagdag ang vector user sa kinakailangang pangkat upang mabasa niya ang mga log file. Halimbawa, ang nginx sa centos ay gumagawa ng mga log na may mga karapatan sa adm group.

usermod -a -G adm vector

Simulan natin ang serbisyo ng vector

systemctl enable vector
systemctl start vector

Ang mga vector log ay maaaring matingnan nang ganito:

journalctl -f -u vector

Dapat may entry na ganito sa logs

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

Pagsusuri ng Stress

Nagsasagawa kami ng pagsubok gamit ang benchmark ng Apache.

Ang pakete ng httpd-tools ay na-install sa lahat ng mga server

Sinimulan namin ang pagsubok gamit ang Apache benchmark mula sa 4 na magkakaibang server sa screen. Una, inilunsad namin ang screen terminal multiplexer, at pagkatapos ay sisimulan namin ang pagsubok gamit ang Apache benchmark. Paano gumana sa screen na makikita mo sa Artikulo.

Mula sa 1st server

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

Mula sa 2st server

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

Mula sa 3st server

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

Mula sa 4st server

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

Suriin natin ang data sa Clickhouse

Pumunta sa Clickhouse

clickhouse-client -h 172.26.10.109 -m

Gumagawa ng SQL query

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

Alamin ang laki ng mga talahanayan sa 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;

Alamin natin kung gaano karaming mga log ang kinuha sa Clickhouse.

Nagpapadala ng mga log ng Nginx json gamit ang Vector sa Clickhouse at Elasticsearch

Ang laki ng talahanayan ng mga log ay 857.19 MB.

Nagpapadala ng mga log ng Nginx json gamit ang Vector sa Clickhouse at Elasticsearch

Ang laki ng parehong data sa index sa Elasticsearch ay 4,5GB.

Kung hindi mo tinukoy ang data sa vector sa mga parameter, ang Clickhouse ay tumatagal ng 4500/857.19 = 5.24 beses na mas mababa kaysa sa Elasticsearch.

Sa vector, ang compression field ay ginagamit bilang default.

Telegram chat ni Clickhouse
Telegram chat ni Elasticsearch
Telegram chat ni "Koleksyon at pagsusuri ng system mga mensahe"

Pinagmulan: www.habr.com

Magdagdag ng komento