Clickhouse болон Elasticsearch руу Vector ашиглан Nginx json бүртгэлийг илгээж байна

Clickhouse болон Elasticsearch руу Vector ашиглан Nginx json бүртгэлийг илгээж байна

Вектор, лог өгөгдөл, хэмжүүр, үйл явдлыг цуглуулах, хувиргах, илгээх зориулалттай.

→ Github

Rust хэл дээр бичигдсэн тул аналогитай харьцуулахад өндөр гүйцэтгэлтэй, RAM бага зарцуулдаг гэдгээрээ онцлог юм. Нэмж дурдахад үнэн зөв, тухайлбал илгээгээгүй үйл явдлыг диск дээрх буферт хадгалах, файлуудыг эргүүлэх чадвартай холбоотой функцүүдэд ихээхэн анхаарал хандуулдаг.

Архитектурын хувьд Vector бол нэг буюу түүнээс дээш мессеж хүлээн авдаг үйл явдал чиглүүлэгч юм эх сурвалжууд, сонголтоор эдгээр зурвасууд дээр хэрэглэнэ өөрчлөлтүүд, мөн тэдгээрийг нэг буюу хэд хэдэн рүү илгээх ус зайлуулах хоолой.

Вектор нь 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 (Server | Logstash) → хослолыг Clickhouse дээр тусад нь, Elasticsearch дээр тусад нь тохируулах болно. Бид 4 сервер суулгана. Хэдийгээр та үүнийг 3 серверээр тойрч гарах боломжтой.

Clickhouse болон Elasticsearch руу Vector ашиглан Nginx json бүртгэлийг илгээж байна

Схем нь иймэрхүү зүйл юм.

Бүх сервер дээрээ Selinux-г идэвхгүй болго

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

Бид бүх сервер дээр HTTP сервер эмулятор + хэрэгслүүдийг суулгадаг

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

Nodejs-stub-серверт эргэлт байхгүй байна. энд үүний тулд rpm үүсгэнэ үү. ашиглан rpm-ийг эмхэтгэнэ Fedora Copr

antonpatsev/nodejs-stub-server репозиторыг нэмнэ үү

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

Бүх сервер дээр nodejs-stub-server, Apache бенчмарк болон дэлгэцийн терминалын мультиплексерийг суулгана уу.

yum -y install stub_http_server screen mc httpd-tools screen

Би /var/lib/stub_http_server/stub_http_server.js файл дахь stub_http_server-ийн хариу өгөх хугацааг зассан бөгөөд ингэснээр илүү олон бүртгэл байна.

var max_sleep = 10;

stub_http_server-г ажиллуулцгаая.

systemctl start stub_http_server
systemctl enable stub_http_server

Clickhouse суурилуулах сервер 3 дээр

ClickHouse нь SSE 4.2 зааврын багцыг ашигладаг тул өөрөөр заагаагүй бол ашигласан процессорын дэмжлэг нь системийн нэмэлт шаардлага болно. Одоогийн процессор SSE 4.2-г дэмждэг эсэхийг шалгах тушаал энд байна:

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

Эхлээд та албан ёсны репозиторыг холбох хэрэгтэй:

sudo yum install -y yum-utils
sudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG
sudo yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/stable/x86_64

Багцуудыг суулгахын тулд та дараах тушаалуудыг ажиллуулах хэрэгтэй.

sudo yum install -y clickhouse-server clickhouse-client

Clickhouse-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 ашиглахыг зөвлөж байна.

Clickhouse болон Elasticsearch руу Vector ашиглан Nginx json бүртгэлийг илгээж байна

Би Google дээр DDL-ээр дамжуулан zstd шахалтыг хэрхэн ашиглахыг олж чадсангүй. Тиймээс би үүнийг байгаагаар нь үлдээсэн.

Clickhouse-д zstd шахалтыг ашигладаг хамт олон зааврыг хуваалцана уу.

Серверийг демоноор эхлүүлэхийн тулд дараахыг ажиллуулна уу:

service clickhouse-server start

Одоо Clickhouse-ийн тохиргоо руу шилжье

Clickhouse руу оч

clickhouse-client -h 172.26.10.109 -m

172.26.10.109 — Clickhouse суулгасан серверийн IP.

Вектор мэдээллийн сан үүсгэцгээе

CREATE DATABASE vector;

Мэдээллийн сан байгаа эсэхийг шалгацгаая.

show databases;

vector.logs хүснэгт үүсгэ.

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

CREATE TABLE vector.logs
(
    `node_name` String,
    `timestamp` DateTime,
    `server_name` String,
    `user_id` String,
    `request_full` String,
    `request_user_agent` String,
    `request_http_host` String,
    `request_uri` String,
    `request_scheme` String,
    `request_method` String,
    `request_length` UInt64,
    `request_time` Float32,
    `request_referrer` String,
    `response_status` UInt16,
    `response_body_bytes_sent` UInt64,
    `response_content_type` String,
    `remote_addr` IPv4,
    `remote_port` UInt32,
    `remote_user` String,
    `upstream_addr` IPv4,
    `upstream_port` UInt32,
    `upstream_bytes_received` UInt64,
    `upstream_bytes_sent` UInt64,
    `upstream_cache_status` String,
    `upstream_connect_time` Float32,
    `upstream_header_time` Float32,
    `upstream_response_length` UInt64,
    `upstream_response_time` Float32,
    `upstream_status` UInt16,
    `upstream_content_type` String,
    INDEX idx_http_host request_http_host TYPE set(0) GRANULARITY 1
)
ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(timestamp)
ORDER BY timestamp
TTL timestamp + toIntervalMonth(1)
SETTINGS index_granularity = 8192;

Бид хүснэгтүүд үүссэн эсэхийг шалгана. Эхлүүлье clickhouse-client мөн хүсэлт гаргах.

Вектор мэдээллийн сан руу орцгооё.

use vector;

Ok.

0 rows in set. Elapsed: 0.001 sec.

Хүснэгтүүдийг харцгаая.

show tables;

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

Clickhouse-тай харьцуулахын тулд Elasticsearch руу ижил өгөгдлийг илгээхийн тулд 4-р сервер дээр elasticsearch суулгаж байна.

Нийтийн rpm түлхүүр нэмнэ үү

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

2 репо үүсгэцгээе:

/etc/yum.repos.d/elasticsearch.repo

[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

/etc/yum.repos.d/kibana.repo

[kibana-7.x]
name=Kibana repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

Elasticsearch болон kibana суулгана уу

yum install -y kibana elasticsearch

Энэ нь 1 хувь байх тул та /etc/elasticsearch/elasticsearch.yml файлд дараах зүйлийг нэмэх шаардлагатай.

discovery.type: single-node

Энэ вектор өөр серверээс elasticsearch руу өгөгдөл илгээх боломжтой тул network.host-ыг өөрчилье.

network.host: 0.0.0.0

Kibana-д холбогдохын тулд /etc/kibana/kibana.yml файл дахь server.host параметрийг өөрчилнө үү.

server.host: "0.0.0.0"

Хуучин бөгөөд autostart-д elasticsearch-г оруулаарай

systemctl enable elasticsearch
systemctl start elasticsearch

ба кибана

systemctl enable kibana
systemctl start kibana

Elasticsearch-г нэг зангилаа горимд тохируулж байна 1 хэлтэрхий, 0 хуулбар. Та олон тооны серверүүдийн кластертай байх магадлалтай бөгөөд үүнийг хийх шаардлагагүй болно.

Ирээдүйн индексүүдийн хувьд өгөгдмөл загварыг шинэчилнэ үү:

curl -X PUT http://localhost:9200/_template/default -H 'Content-Type: application/json' -d '{"index_patterns": ["*"],"order": -1,"settings": {"number_of_shards": "1","number_of_replicas": "0"}}' 

тохиргоо Вектор сервер 2 дээрх Logstash-ийг орлуулах

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

Logstash-ийг орлуулах Векторыг тохируулцгаая. /etc/vector/vector.toml файлыг засварлаж байна

# /etc/vector/vector.toml

data_dir = "/var/lib/vector"

[sources.nginx_input_vector]
  # General
  type                          = "vector"
  address                       = "0.0.0.0:9876"
  shutdown_timeout_secs         = 30

[transforms.nginx_parse_json]
  inputs                        = [ "nginx_input_vector" ]
  type                          = "json_parser"

[transforms.nginx_parse_add_defaults]
  inputs                        = [ "nginx_parse_json" ]
  type                          = "lua"
  version                       = "2"

  hooks.process = """
  function (event, emit)

    function split_first(s, delimiter)
      result = {};
      for match in (s..delimiter):gmatch("(.-)"..delimiter) do
          table.insert(result, match);
      end
      return result[1];
    end

    function split_last(s, delimiter)
      result = {};
      for match in (s..delimiter):gmatch("(.-)"..delimiter) do
          table.insert(result, match);
      end
      return result[#result];
    end

    event.log.upstream_addr             = split_first(split_last(event.log.upstream_addr, ', '), ':')
    event.log.upstream_bytes_received   = split_last(event.log.upstream_bytes_received, ', ')
    event.log.upstream_bytes_sent       = split_last(event.log.upstream_bytes_sent, ', ')
    event.log.upstream_connect_time     = split_last(event.log.upstream_connect_time, ', ')
    event.log.upstream_header_time      = split_last(event.log.upstream_header_time, ', ')
    event.log.upstream_response_length  = split_last(event.log.upstream_response_length, ', ')
    event.log.upstream_response_time    = split_last(event.log.upstream_response_time, ', ')
    event.log.upstream_status           = split_last(event.log.upstream_status, ', ')

    if event.log.upstream_addr == "" then
        event.log.upstream_addr = "127.0.0.1"
    end

    if (event.log.upstream_bytes_received == "-" or event.log.upstream_bytes_received == "") then
        event.log.upstream_bytes_received = "0"
    end

    if (event.log.upstream_bytes_sent == "-" or event.log.upstream_bytes_sent == "") then
        event.log.upstream_bytes_sent = "0"
    end

    if event.log.upstream_cache_status == "" then
        event.log.upstream_cache_status = "DISABLED"
    end

    if (event.log.upstream_connect_time == "-" or event.log.upstream_connect_time == "") then
        event.log.upstream_connect_time = "0"
    end

    if (event.log.upstream_header_time == "-" or event.log.upstream_header_time == "") then
        event.log.upstream_header_time = "0"
    end

    if (event.log.upstream_response_length == "-" or event.log.upstream_response_length == "") then
        event.log.upstream_response_length = "0"
    end

    if (event.log.upstream_response_time == "-" or event.log.upstream_response_time == "") then
        event.log.upstream_response_time = "0"
    end

    if (event.log.upstream_status == "-" or event.log.upstream_status == "") then
        event.log.upstream_status = "0"
    end

    emit(event)

  end
  """

[transforms.nginx_parse_remove_fields]
    inputs                              = [ "nginx_parse_add_defaults" ]
    type                                = "remove_fields"
    fields                              = ["data", "file", "host", "source_type"]

[transforms.nginx_parse_coercer]

    type                                = "coercer"
    inputs                              = ["nginx_parse_remove_fields"]

    types.request_length = "int"
    types.request_time = "float"

    types.response_status = "int"
    types.response_body_bytes_sent = "int"

    types.remote_port = "int"

    types.upstream_bytes_received = "int"
    types.upstream_bytes_send = "int"
    types.upstream_connect_time = "float"
    types.upstream_header_time = "float"
    types.upstream_response_length = "int"
    types.upstream_response_time = "float"
    types.upstream_status = "int"

    types.timestamp = "timestamp"

[sinks.nginx_output_clickhouse]
    inputs   = ["nginx_parse_coercer"]
    type     = "clickhouse"

    database = "vector"
    healthcheck = true
    host = "http://172.26.10.109:8123" #  Адрес Clickhouse
    table = "logs"

    encoding.timestamp_format = "unix"

    buffer.type = "disk"
    buffer.max_size = 104900000
    buffer.when_full = "block"

    request.in_flight_limit = 20

[sinks.elasticsearch]
    type = "elasticsearch"
    inputs   = ["nginx_parse_coercer"]
    compression = "none"
    healthcheck = true
    # 172.26.10.116 - сервер где установен elasticsearch
    host = "http://172.26.10.116:9200" 
    index = "vector-%Y-%m-%d"

Та transforms.nginx_parse_add_defaults хэсгийг тохируулж болно.

Оноос хойш Вячеслав Рахинский Эдгээр тохиргоог жижиг CDN-д ашигладаг бөгөөд дээд урсгалд хэд хэдэн утга байж болно_*

Жишээ нь:

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

Үйлчлүүлэгч дээр (Вэб сервер) - 1-р сервер

Nginx-тэй сервер дээр clickhouse дахь бүртгэлийн хүснэгт нь талбарыг ашигладаг тул та ipv6-г идэвхгүй болгох хэрэгтэй. upstream_addr IPv4, учир нь би сүлжээнд IPv6 ашигладаггүй. Хэрэв ipv6-г унтраагаагүй бол алдаа гарна:

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

Магадгүй уншигчид, ipv6 дэмжлэгийг нэмээрэй.

/etc/sysctl.d/98-disable-ipv6.conf файлыг үүсгэ

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

Тохиргоог ашиглаж байна

sysctl --system

Nginx-ийг суулгацгаая.

Нэмэгдсэн nginx хадгалах файл /etc/yum.repos.d/nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Nginx багцыг суулгана уу

yum install -y nginx

Эхлээд бид /etc/nginx/nginx.conf файл дахь Nginx дахь бүртгэлийн форматыг тохируулах хэрэгтэй.

user  nginx;
# you must set worker processes based on your CPU cores, nginx does not benefit from setting more than that
worker_processes auto; #some last versions calculate it automatically

# number of file descriptors used for nginx
# the limit for the maximum FDs on the server is usually set by the OS.
# if you don't set FD's then OS settings will be used which is by default 2000
worker_rlimit_nofile 100000;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

# provides the configuration file context in which the directives that affect connection processing are specified.
events {
    # determines how much clients will be served per worker
    # max clients = worker_connections * worker_processes
    # max clients is also limited by the number of socket connections available on the system (~64k)
    worker_connections 4000;

    # optimized to serve many clients with each thread, essential for linux -- for testing environment
    use epoll;

    # accept as many connections as possible, may flood worker connections if set too low -- for testing environment
    multi_accept on;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

log_format vector escape=json
    '{'
        '"node_name":"nginx-vector",'
        '"timestamp":"$time_iso8601",'
        '"server_name":"$server_name",'
        '"request_full": "$request",'
        '"request_user_agent":"$http_user_agent",'
        '"request_http_host":"$http_host",'
        '"request_uri":"$request_uri",'
        '"request_scheme": "$scheme",'
        '"request_method":"$request_method",'
        '"request_length":"$request_length",'
        '"request_time": "$request_time",'
        '"request_referrer":"$http_referer",'
        '"response_status": "$status",'
        '"response_body_bytes_sent":"$body_bytes_sent",'
        '"response_content_type":"$sent_http_content_type",'
        '"remote_addr": "$remote_addr",'
        '"remote_port": "$remote_port",'
        '"remote_user": "$remote_user",'
        '"upstream_addr": "$upstream_addr",'
        '"upstream_bytes_received": "$upstream_bytes_received",'
        '"upstream_bytes_sent": "$upstream_bytes_sent",'
        '"upstream_cache_status":"$upstream_cache_status",'
        '"upstream_connect_time":"$upstream_connect_time",'
        '"upstream_header_time":"$upstream_header_time",'
        '"upstream_response_length":"$upstream_response_length",'
        '"upstream_response_time":"$upstream_response_time",'
        '"upstream_status": "$upstream_status",'
        '"upstream_content_type":"$upstream_http_content_type"'
    '}';

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

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

Таны одоогийн тохиргоог зөрчихгүйн тулд Nginx танд хэд хэдэн access_log удирдамжтай байхыг зөвшөөрдөг

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

Шинэ логуудад логрот хийх дүрэм нэмэхээ бүү мартаарай (хэрэв бүртгэлийн файл .log-ээр төгсөөгүй бол)

default.conf-г /etc/nginx/conf.d/-аас устгана уу.

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

Виртуал хост /etc/nginx/conf.d/vhost1.conf нэмнэ үү

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

Виртуал хост /etc/nginx/conf.d/vhost2.conf нэмнэ үү

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

Виртуал хост /etc/nginx/conf.d/vhost3.conf нэмнэ үү

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

Виртуал хост /etc/nginx/conf.d/vhost4.conf нэмнэ үү

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

Виртуал хостуудыг (nginx суулгасан серверийн 172.26.10.106 ip) бүх серверт /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

Мөн /etc/vector/vector.toml тохиргоонд Filebeat орлуулалтыг тохируулна уу. IP хаяг 172.26.10.108 нь бүртгэлийн серверийн (Вектор-Сервер) IP хаяг юм.

data_dir = "/var/lib/vector"

[sources.nginx_file]
  type                          = "file"
  include                       = [ "/var/log/nginx/access.json.log" ]
  start_at_beginning            = false
  fingerprinting.strategy       = "device_and_inode"

[sinks.nginx_output_vector]
  type                          = "vector"
  inputs                        = [ "nginx_file" ]

  address                       = "172.26.10.108:9876"

Бүртгэлийн файлуудыг уншихын тулд вектор хэрэглэгчийг шаардлагатай бүлэгт нэмэхээ бүү мартаарай. Жишээлбэл, centos дахь nginx нь adm группын эрх бүхий бүртгэлүүдийг үүсгэдэг.

usermod -a -G adm vector

Вектор үйлчилгээг эхлүүлье

systemctl enable vector
systemctl start vector

Вектор бүртгэлийг дараах байдлаар харж болно.

journalctl -f -u vector

Бүртгэлд ийм бичлэг байх ёстой

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

Стресс тест

Бид Apache бенчмарк ашиглан туршилт хийдэг.

httpd-tools багцыг бүх сервер дээр суулгасан

Бид дэлгэцэн дээрх 4 өөр серверээс Apache бенчмарк ашиглан туршилт хийж эхэлдэг. Эхлээд бид дэлгэцийн терминалын мультиплексерийг ажиллуулж, дараа нь Apache бенчмарк ашиглан тест хийж эхэлнэ. Дэлгэцтэй хэрхэн ажиллах талаар эндээс олж болно нийтлэл.

1-р серверээс

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

2-р серверээс

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

3-р серверээс

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

4-р серверээс

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

Clickhouse дахь өгөгдлийг шалгацгаая

Clickhouse руу оч

clickhouse-client -h 172.26.10.109 -m

SQL асуулга хийж байна

SELECT * FROM vector.logs;

┌─node_name────┬───────────timestamp─┬─server_name─┬─user_id─┬─request_full───┬─request_user_agent─┬─request_http_host─┬─request_uri─┬─request_scheme─┬─request_method─┬─request_length─┬─request_time─┬─request_referrer─┬─response_status─┬─response_body_bytes_sent─┬─response_content_type─┬───remote_addr─┬─remote_port─┬─remote_user─┬─upstream_addr─┬─upstream_port─┬─upstream_bytes_received─┬─upstream_bytes_sent─┬─upstream_cache_status─┬─upstream_connect_time─┬─upstream_header_time─┬─upstream_response_length─┬─upstream_response_time─┬─upstream_status─┬─upstream_content_type─┐
│ nginx-vector │ 2020-08-07 04:32:42 │ vhost1      │         │ GET / HTTP/1.0 │ 1server            │ vhost1            │ /           │ http           │ GET            │             66 │        0.028 │                  │             404 │                       27 │                       │ 172.26.10.106 │       45886 │             │ 172.26.10.106 │             0 │                     109 │                  97 │ DISABLED              │                     0 │                0.025 │                       27 │                  0.029 │             404 │                       │
└──────────────┴─────────────────────┴─────────────┴─────────┴────────────────┴────────────────────┴───────────────────┴─────────────┴────────────────┴────────────────┴────────────────┴──────────────┴──────────────────┴─────────────────┴──────────────────────────┴───────────────────────┴───────────────┴─────────────┴─────────────┴───────────────┴───────────────┴─────────────────────────┴─────────────────────┴───────────────────────┴───────────────────────┴──────────────────────┴──────────────────────────┴────────────────────────┴─────────────────┴───────────────────────

Clickhouse дахь хүснэгтүүдийн хэмжээг олж мэдээрэй

select concat(database, '.', table)                         as table,
       formatReadableSize(sum(bytes))                       as size,
       sum(rows)                                            as rows,
       max(modification_time)                               as latest_modification,
       sum(bytes)                                           as bytes_size,
       any(engine)                                          as engine,
       formatReadableSize(sum(primary_key_bytes_in_memory)) as primary_keys_size
from system.parts
where active
group by database, table
order by bytes_size desc;

Clickhouse-д хэр их лог эзэлснийг олж мэдье.

Clickhouse болон Elasticsearch руу Vector ашиглан Nginx json бүртгэлийг илгээж байна

Бүртгэлийн хүснэгтийн хэмжээ 857.19 MB байна.

Clickhouse болон Elasticsearch руу Vector ашиглан Nginx json бүртгэлийг илгээж байна

Elasticsearch дахь индекс дэх ижил өгөгдлийн хэмжээ 4,5 ГБ байна.

Хэрэв та параметр дэх вектор дахь өгөгдлийг заагаагүй бол Clickhouse нь Elasticsearch-ээс 4500/857.19 = 5.24 дахин бага авдаг.

Вектор дээр шахалтын талбарыг анхдагчаар ашигладаг.

Telegram чат Clickhouse
Telegram чат Elasticsearch
"Telegram чат"Системийн цуглуулга, дүн шинжилгээ мессеж"

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх