Ирсоли гузоришҳои Nginx json бо истифода аз Vector ба Clickhouse ва Elasticsearch

Ирсоли гузоришҳои Nginx json бо истифода аз Vector ба Clickhouse ва Elasticsearch

Вектор, ки барои ҷамъоварӣ, табдил додан ва фиристодани маълумотҳои гузоришҳо, ченакҳо ва рӯйдодҳо пешбинӣ шудааст.

→ Github

Он бо забони Rust навишта шуда, дар муқоиса бо аналогҳои худ бо иҷрои баланд ва истеъмоли ками RAM тавсиф мешавад. Илова бар ин, ба функсияҳои марбут ба дурустӣ, аз ҷумла қобилияти захира кардани рӯйдодҳои ирсолнашуда дар буфери диск ва гардиши файлҳо диққати зиёд дода мешавад.

Аз ҷиҳати меъморӣ, Вектор роутери рӯйдодҳост, ки аз як ё якчанд паёмҳо қабул мекунад сарчашмаҳо, ихтиёран ба болои ин паёмҳо муроҷиат кунед дигаргуниҳо, ва фиристодани онҳо ба як ё якчанд дренажхо.

Вектор ивазкунандаи filebeat ва logstash аст, он метавонад дар ҳарду нақш амал кунад (қабул ва фиристодани гузоришҳо), тафсилоти бештар дар бораи онҳо сомона.

Агар дар Logstash занҷир ҳамчун вуруд → филтр → баромад сохта шуда бошад, пас дар Вектор ин аст манбаъҳотабдил меёбадғарқ мешавад

Намунаҳоро дар ҳуҷҷатҳо дидан мумкин аст.

Ин дастур дастури аз нав дида баромадашуда мебошад Вячеслав Рахинский. Дастурҳои аслӣ дорои коркарди 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 (Access logs) → Vector (Client | Filebeat) → Vector (Сервер | 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-server аз он Максим Игнатенко

Nodejs-stub-server 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

Ман вақти вокуниши 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-server иҷозат диҳед, ки корти шабакаро дар файли /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 дар сервери 4-ум барои фиристодани ҳамон маълумот ба 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

Азбаски он дар 1 нусха хоҳад буд, шумо бояд ба файли /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"

Кӯҳна ва elasticsearch-ро дар autostart дохил кунед

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

параметр Вектор ҳамчун ивазкунандаи Logstash дар сервер 2

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

Аввалан, мо бояд формати сабтро дар 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;
    }
}

Ба ҳамаи серверҳо ба файли /etc/hosts ҳостҳои виртуалӣ (172.26.10.106 ip сервере, ки дар он nginx насб шудааст) илова кунед:

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 танзим кунед. Суроғаи 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"

Фаромӯш накунед, ки корбари векторро ба гурӯҳи зарурӣ илова кунед, то ки ӯ файлҳои журналро хонад. Масалан, nginx дар centos гузоришҳоро бо ҳуқуқҳои гурӯҳи 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 дар ҳама серверҳо насб карда шуд

Мо озмоишро бо истифода аз меъёри Apache аз 4 серверҳои гуногун дар экран оғоз мекунем. Аввалан, мо мултиплексори терминали экранро ба кор меандозем ва сипас бо истифода аз меъёри 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 чӣ қадар гузоришҳо ҷамъ шудаанд.

Ирсоли гузоришҳои Nginx json бо истифода аз Vector ба Clickhouse ва Elasticsearch

Андозаи ҷадвали гузоришҳо 857.19 МБ аст.

Ирсоли гузоришҳои Nginx json бо истифода аз Vector ба Clickhouse ва Elasticsearch

Андозаи ҳамон маълумот дар индекс дар Elasticsearch 4,5 ГБ аст.

Агар шумо маълумотро дар вектор дар параметрҳо нишон надиҳед, Clickhouse нисбат ба Elasticsearch 4500/857.19 = 5.24 маротиба камтар мегирад.

Дар вектор, майдони фишурда ба таври нобаёнӣ истифода мешавад.

Чати Telegram аз ҷониби Clickhouse
Чати Telegram аз ҷониби Ҷустуҷӯи Elastics
Чати Telegram аз ҷониби "Ҷамъоварӣ ва таҳлили система паёмҳо"

Манбаъ: will.com

Илова Эзоҳ