ืฉื™ืงื˜ Nginx json ืœืึธื’ืก ืžื™ื˜ ื•ื•ืขืงื˜ืึธืจ ืฆื• Clickhouse ืื•ืŸ Elasticsearch

ืฉื™ืงื˜ Nginx json ืœืึธื’ืก ืžื™ื˜ ื•ื•ืขืงื˜ืึธืจ ืฆื• Clickhouse ืื•ืŸ Elasticsearch

ื•ื•ืขืงื˜ืึธืจ, ื“ื™ื–ื™ื™ื ื“ ืฆื• ื–ืึทืžืœืขืŸ, ื™ื‘ืขืจืžืึทื›ืŸ ืื•ืŸ ืฉื™ืงืŸ ืงืœืึธืฅ ื“ืึทื˜ืŸ, ืžืขื˜ืจื™ืงืก ืื•ืŸ ื’ืขืฉืขืขื ื™ืฉืŸ.

โ†’ ื’ื™ื˜ื”ื•ื‘

ืขืก ืื™ื– ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ ื“ื™ ืจื•ืกื˜ ืฉืคึผืจืึทืš, ืขืก ืื™ื– ืงืขืจืึทืงื˜ืขืจื™ื™ื–ื“ ื“ื•ืจืš ื”ื•ื™ืš ืคืึธืจืฉื˜ืขืœื•ื ื’ ืื•ืŸ ื ื™ื“ืขืจื™ืง ื‘ืึทืจืึทืŸ ืงืึทื ืกืึทืžืฉืึทืŸ ืงืึทืžืคึผืขืจื“ ืžื™ื˜ ื–ื™ื™ึทืŸ ืึทื ืึทืœืึธื’ื•ืขืก. ืื™ืŸ ืึทื“ื™ืฉืึทืŸ, ืคื™ืœ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ื˜ ืื™ื– ื‘ืึทืฆืึธืœื˜ ืฆื• ืคืึทื ื’ืงืฉืึทื ื– ืฉื™ื™ึทื›ื•ืช ืฆื• ืงืขืจืขืงื˜ื ืึทืก, ืกืคึผืขืฆื™ืขืœ ื“ื™ ืคื™ื™ื™ืงื™ื™ื˜ ืฆื• ืจืึทื˜ืขื•ื•ืขืŸ ืึทื ืกืขื ื˜ ื’ืขืฉืขืขื ื™ืฉืŸ ืฆื• ืึท ื‘ืึทืคืขืจ ืื•ื™ืฃ ื“ื™ืกืง ืื•ืŸ ื“ืจื™ื™ืขืŸ ื˜ืขืงืขืก.

ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจืึทืœื™, ื•ื•ืขืงื˜ืึธืจ ืื™ื– ืึท ื’ืขืฉืขืขื ื™ืฉ ืจืึทื•ื˜ืขืจ ื•ื•ืึธืก ื ืขืžื˜ ืึทืจื˜ื™ืงืœืขืŸ ืคื•ืŸ ืื™ื™ื ืขืจ ืึธื“ืขืจ ืžืขืจ ืงื•ื•ืขืœืขืจ, ืึทืคึผืฉืึทื ืึทืœ ืึทืคึผืœื™ื™ื™ื ื’ ืื™ื‘ืขืจ ื“ื™ ืึทืจื˜ื™ืงืœืขืŸ ื˜ืจืึทื ืกืคืึธืจืžืึทืฆื™ืขืก, ืื•ืŸ ืฉื™ืงืŸ ื–ื™ื™ ืฆื• ืื™ื™ื ืขืจ ืึธื“ืขืจ ืžืขืจ ื“ืจื™ื™ื ื–.

ื•ื•ืขืงื˜ืึธืจ ืื™ื– ืึท ืคืึทืจื‘ื™ื™ึทื˜ ืคึฟืึทืจ Filebeat ืื•ืŸ Logstash, ืขืก ืงืขื ืขืŸ ืฉืคึผื™ืœืŸ ืื™ืŸ ื‘ื™ื™ื“ืข ืจืึธืœืขืก (ื‘ืึทืงื•ืžืขืŸ ืื•ืŸ ืฉื™ืงืŸ ืœืึธื’ืก), ืžืขืจ ื“ืขื˜ืึทื™ืœืก ืื•ื™ืฃ ื–ื™ื™ ืึธื ืœื™ื™ืŸ.

ืื•ื™ื‘ ืื™ืŸ Logstash ื“ื™ ืงื™ื™ื˜ ืื™ื– ื’ืขื‘ื•ื™ื˜ ื•ื•ื™ ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ โ†’ ืคื™ืœื˜ืขืจ โ†’ ืจืขื–ื•ืœื˜ืึทื˜, ืื™ืŸ ื•ื•ืขืงื˜ืึธืจ ืขืก ืื™ื– ืงื•ื•ืืœืŸ โ†’ ื˜ืจืึทื ืกืคืึธืจืžื– โ†’ ืกื™ื ืงืก

ื‘ื™ื™ืฉืคื™ืœืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ืื™ืŸ ื“ื™ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ.

ื“ื™ ืœื™ืžืขื“ ืื™ื– ืึท ืจื™ื•ื•ื™ื™ื–ื“ ืœื™ืžืขื“ ืคื•ืŸ ื•ื•ื™ืึทื˜ืฉืขืกืœืึทื•ื• ืจืึทื›ื™ื ืกืงื™. ื“ืขืจ ืึธืจื™ื’ื™ื ืขืœ ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ืึทื ื˜ื”ืึทืœื˜ืŸ ื’ืขืึธื™ืคึผ ืคึผืจืึทืกืขืกื™ื ื’. ื•ื•ืขืŸ ื˜ืขืกื˜ื™ื ื’ ื’ืขืึธื™ืคึผ ืคึฟื•ืŸ ืึทืŸ ื™ื ืขืจืœืขืš ื ืขืฅ, ื•ื•ืขืงื˜ืึธืจ ื”ืื˜ ืึท ื˜ืขื•ืช.

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

ืื•ื™ื‘ ื•ื•ืขืจ ืขืก ื™ื– ื“ืึทืจืฃ ืฆื• ืคึผืจืึธืฆืขืก ื’ืขืึธื™ืคึผ, ืึธืคึผืฉื™ืงืŸ ืฆื• ื“ื™ ืึธืจื™ื’ื™ื ืขืœ ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ืคื•ืŸ ื•ื•ื™ืึทื˜ืฉืขืกืœืึทื•ื• ืจืึทื›ื™ื ืกืงื™.

ืžื™ืจ ื•ื•ืขืœืŸ ืงืึทื ืคื™ื’ื™ืขืจ ื“ื™ ืงืึธืžื‘ื™ื ืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื ื’ื™ื ืงืก (ืึทืงืกืขืก ืœืึธื’ืก) โ†’ ื•ื•ืขืงื˜ืึธืจ (ืงืœื™ืขื ื˜ | ืคื™ืœืขื‘ืขืึทื˜) โ†’ ื•ื•ืขืงื˜ืึธืจ (ืกืขืจื•ื•ื™ืจืขืจ | ืœืึธื’ืกื˜ืึทืฉ) โ†’ ืกืขืคึผืขืจืึทื˜ืœื™ ืื™ืŸ ืงืœื™ืงืงื”ืึธื•ืกืข ืื•ืŸ ืกืขืคึผืขืจืึทื˜ืœื™ ืื™ืŸ Elasticsearch. ืžื™ืจ ื•ื•ืขืœืŸ ื™ื ืกื˜ืึทืœื™ืจืŸ 4 ืกืขืจื•ื•ืขืจืก. ื›ืึธื˜ืฉ ืื™ืจ ืงืขื ืขืŸ ื‘ื™ื™ืคึผืึทืก ืขืก ืžื™ื˜ 3 ืกืขืจื•ื•ืขืจืก.

ืฉื™ืงื˜ Nginx json ืœืึธื’ืก ืžื™ื˜ ื•ื•ืขืงื˜ืึธืจ ืฆื• Clickhouse ืื•ืŸ Elasticsearch

ื“ืขืจ ืกื›ืขืžืข ืื™ื– ืขืคึผืขืก ื•ื•ื™ ื“ืึธืก.

ื“ื™ืกื™ื™ื‘ืึทืœ ืกืขืœื™ื ื•ืงืก ืื•ื™ืฃ ืึทืœืข ื“ื™ื™ืŸ ืกืขืจื•ื•ืขืจืก

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

ืžื™ืจ ื™ื ืกื˜ืึทืœื™ืจืŸ ืึท ื”ื˜ื˜ืคึผ ืกืขืจื•ื•ืขืจ ืขืžื•ืœืึทื˜ืึธืจ + ื™ื•ื˜ื™ืœืึทื˜ื™ื– ืื•ื™ืฃ ืึทืœืข ืกืขืจื•ื•ืขืจืก

ื•ื•ื™ ืึท ื”ื˜ื˜ืคึผ ืกืขืจื•ื•ืขืจ ืขืžื•ืœืึทื˜ืึธืจ ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ ื ืึธื“ืขื“ื–ืฉืก-ืฉื˜ื•ื‘-ืกืขืจื•ื•ืขืจ ืคื•ืŸ ืžืึทืงืกื™ื ืื™ื’ื ืึทื˜ืขื ืงืึธ

Nodejs-stub-server ื”ืื˜ ื ื™ืฉื˜ ืึท ืจืคึผื. ื“ืึธ ืฉืึทืคึฟืŸ ืจืคึผื ืคึฟืึทืจ ืขืก. rpm ื•ื•ืขื˜ ื–ื™ื™ืŸ ืงืึทืžืคึผื™ื™ืœื“ ืžื™ื˜ ืคืขื“ืึธืจืึท ืงืึธืคึผืจ

ืœื™ื™ื’ ื“ื™ 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

ืงืœื™ืงื›ืึธื•ืกืข ื™ื ืกื˜ืึทืœื™ืจื•ื ื’ ืื•ื™ืฃ ืกืขืจื•ื•ืขืจ 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

ืœืึธื–ืŸ ืงืœื™ืงื›ืึธื•ืกืข-ืกืขืจื•ื•ืขืจ ืฆื• ื”ืขืจืŸ ืฆื• ื“ื™ ื ืขืฅ ืงืึธืจื˜ ืื™ืŸ ื“ืขืจ ื˜ืขืงืข /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 ืœืึธื’ืก ืžื™ื˜ ื•ื•ืขืงื˜ืึธืจ ืฆื• 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 ืคื•ืŸ ื“ื™ ืกืขืจื•ื•ืขืจ ื•ื•ื• ืงืœื™ืงื›ืึธื•ืกืข ืื™ื– ืื™ื ืกื˜ืึทืœื™ืจืŸ.

ื–ืืœ ืก ืฉืึทืคึฟืŸ ืึท ื•ื•ืขืงื˜ืึธืจ ื“ืึทื˜ืึทื‘ื™ื™ืก

CREATE DATABASE vector;

ื–ืืœ ืก ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืึทื– ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ื™ื’ื–ื™ืกืฅ.

show databases;

ืฉืึทืคึฟืŸ ืึท ื•ื•ืขืงื˜ืึธืจ.ืœืึธื’ืก ื˜ื™ืฉ.

/* ะญั‚ะพ ั‚ะฐะฑะปะธั†ะฐ ะณะดะต ั…ั€ะฐะฝัั‚ัั ะปะพะณะธ ะบะฐะบ ะตัั‚ัŒ */

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

ืึทืœื˜ ืื•ืŸ ืึทืจื™ื™ึทื ื ืขืžืขืŸ 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"}}' 

ื™ื ืกื˜ืึทืœื™ืจื•ื ื’ ื•ื•ืขืงื˜ืึธืจ ื•ื•ื™ ืึท ืคืึทืจื‘ื™ื™ึทื˜ ืคึฟืึทืจ 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, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื“ื™ืกื™ื™ื‘ืึทืœ ื™ืคึผื•ื•6, ื•ื•ื™ื™ึทืœ ื“ื™ ืœืึธื’ืก ื˜ื™ืฉ ืื™ืŸ ืงืœื™ืงื›ืึทื•ืก ื ื™ืฆื˜ ื“ืขื ืคืขืœื“ upstream_addr IPv4, ื•ื•ื™ื™ึทืœ ืื™ืš ื˜ืึธืŸ ื ื™ื˜ ื ื•ืฆืŸ ื™ืคึผื•ื•6 ืื™ืŸ ื“ื™ ื ืขืฅ. ืื•ื™ื‘ ipv6 ืื™ื– ื ื™ืฉื˜ ืื•ื™ืกื’ืขื“ืจื™ื™ื˜ ืึทื•ื•ืขืง, ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืขืจืจืึธืจืก:

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

ื˜ืึธืžืขืจ ืœื™ื™ืขื ืขืจ, ืœื™ื™ื’ืŸ ื™ืคึผื•ื•6 ืฉื˜ื™ืฆืŸ.

ืฉืึทืคึฟืŸ ื“ื™ ื˜ืขืงืข /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.

ืฆื•ื’ืขืœื™ื™ื’ื˜ ื ื’ื™ื ืงืก ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ ื˜ืขืงืข /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  /var/log/nginx/access.log  main;            # ะกั‚ะฐะฝะดะฐั€ั‚ะฝั‹ะน ะปะพะณ
access_log  /var/log/nginx/access.json.log vector;      # ะะพะฒั‹ะน ะปะพะณ ะฒ ั„ะพั€ะผะฐั‚ะต json

ื“ื• ื–ืืœืกื˜ ื ื™ืฉื˜ ืคืึทืจื’ืขืกืŸ ืฆื• ืœื™ื™ื’ืŸ ืึท ื”ืขืจืฉืŸ ืฆื• ืœืึธื’ืจืึธื˜ืึทื˜ืข ืคึฟืึทืจ ื ื™ื™ึทืข ืœืึธื’ืก (ืื•ื™ื‘ ื“ื™ ืœืึธื’ ื˜ืขืงืข ื˜ื•ื˜ ื ื™ืฉื˜ ืกื•ืฃ ืžื™ื˜ .ืœืึธื’)

ืึทืจืึธืคึผื ืขืžืขืŸ 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 ื™ืคึผ ืคื•ืŸ ื“ื™ ืกืขืจื•ื•ืขืจ ื•ื•ื• 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 ืึทื“ืจืขืก ืคื•ืŸ ื“ื™ ืงืœืึธืฅ ืกืขืจื•ื•ืขืจ (ื•ื•ืขืงื˜ืึธืจ-ืกืขืจื•ื•ื™ืจืขืจ)

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 ืงืจื™ื™ื™ืฅ ืœืึธื’ืก ืžื™ื˜ ืึทื“ื ื’ืจื•ืคึผืข ืจืขื›ื˜.

usermod -a -G adm vector

ื–ืืœ ืก ืึธื ื”ื™ื™ื‘ืŸ ื“ื™ ื•ื•ืขืงื˜ืึธืจ ื“ื™ื ืกื˜

systemctl enable vector
systemctl start vector

ื•ื•ืขืงื˜ืึธืจ ืœืึธื’ืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื•ื•ื™ื•ื“ ื•ื•ื™ ื“ืึธืก:

journalctl -f -u vector

ืขืก ื–ืึธืœ ื–ื™ื™ืŸ ืึท ืคึผืึธื–ื™ืฆื™ืข ื•ื•ื™ ื“ืึธืก ืื™ืŸ ื“ื™ ืœืึธื’ืก

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

ื“ืจื•ืง ื˜ืขืกื˜ื™ื ื’

ืžื™ืจ ื“ื•ืจื›ืคื™ืจืŸ ื˜ืขืกื˜ื™ื ื’ ืžื™ื˜ ืึทืคึผืึทื˜ืฉื™ ื‘ืขื ื˜ืฉืžืึทืจืง.

ื“ื™ ื”ื˜ื˜ืคึผื“-ืžื›ืฉื™ืจื™ื ืคึผืขืงืœ ืื™ื– ืื™ื ืกื˜ืึทืœื™ืจืŸ ืื•ื™ืฃ ืึทืœืข ืกืขืจื•ื•ืขืจืก

ืžื™ืจ ืึธื ื”ื™ื™ื‘ืŸ ื˜ืขืกื˜ื™ื ื’ ืžื™ื˜ ืึทืคึผืึทื˜ืฉื™ ื‘ืขื ื˜ืฉืžืึทืจืง ืคื•ืŸ 4 ืคืึทืจืฉื™ื“ืขื ืข ืกืขืจื•ื•ืขืจืก ืื™ืŸ ืคืึทืจืฉื˜ืขืœืŸ. ืขืจืฉื˜ืขืจ, ืžื™ืจ ืงืึทื˜ืขืจ ื“ื™ ืคืึทืจืฉื˜ืขืœืŸ ื•ื•ืึธืงื–ืึทืœ ืžื•ืœื˜ื™ืคึผืœืขืงืกืขืจ, ืื•ืŸ ื“ืขืžืึธืœื˜ ืžื™ืจ ืึธื ื”ื™ื™ื‘ืŸ ื˜ืขืกื˜ื™ื ื’ ืžื™ื˜ ื“ื™ ืึทืคึผืึทื˜ืฉื™ ื‘ืขื ื˜ืฉืžืึทืจืง. ื•ื•ื™ ืฆื• ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ ื“ื™ ืคืึทืจืฉื˜ืขืœืŸ ืื™ืจ ืงืขื ืขืŸ ื’ืขืคึฟื™ื ืขืŸ ืื™ืŸ ืึทืจื˜ื™ืงืœ.

ืคึฟื•ืŸ 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-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 ืœืึธื’ืก ืžื™ื˜ ื•ื•ืขืงื˜ืึธืจ ืฆื• Clickhouse ืื•ืŸ Elasticsearch

ื“ื™ ืœืึธื’ืก ื˜ื™ืฉ ื’ืจื™ื™ืก ืื™ื– 857.19 ืžืขื’ืื‘ื™ื™ื˜ืŸ.

ืฉื™ืงื˜ Nginx json ืœืึธื’ืก ืžื™ื˜ ื•ื•ืขืงื˜ืึธืจ ืฆื• Clickhouse ืื•ืŸ Elasticsearch

ื“ื™ ื’ืจื™ื™ืก ืคื•ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ื“ืึทื˜ืŸ ืื™ืŸ ื“ื™ ืื™ื ื“ืขืงืก ืื™ืŸ Elasticsearch ืื™ื– 4,5GB.

ืื•ื™ื‘ ืื™ืจ ื˜ืึธืŸ ื ื™ื˜ ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื“ืึทื˜ืŸ ืื™ืŸ ื“ื™ ื•ื•ืขืงื˜ืึธืจ ืื™ืŸ ื“ื™ ืคึผืึทืจืึทืžืขื˜ืขืจืก, ืงืœื™ืงื›ืึธื•ืกืข ื ืขืžื˜ 4500/857.19 = 5.24 ืžืืœ ื•ื•ื™ื™ื ื™ืงืขืจ ื•ื•ื™ ืื™ืŸ Elasticsearch.

ืื™ืŸ ื•ื•ืขืงื˜ืึธืจ, ื“ื™ ืงืึทืžืคึผืจืขืฉืึทืŸ ืคืขืœื“ ืื™ื– ื’ืขื ื™ืฆื˜ ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜.

ื˜ืขืœืขื’ืจืึทื ืฉืžื•ืขืกืŸ ื“ื•ืจืš ืงืœื™ืงื›ืึธื•ืกืข
ื˜ืขืœืขื’ืจืึทื ืฉืžื•ืขืกืŸ ื“ื•ืจืš ืขืœืึทืกื˜ื™ืงืกืึทืจื˜ืฉ
ื˜ืขืœืขื’ืจืึทื ืฉืžื•ืขืกืŸ ื“ื•ืจืš "ื–ืึทืžืœื•ื ื’ ืื•ืŸ ืึทื ืึทืœื™ืกื™ืก ืคื•ืŸ ื“ื™ ืกื™ืกื˜ืขื ืึทืจื˜ื™ืงืœืขืŸ"

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’