เบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ Nginx json เป‚เบ”เบเปƒเบŠเป‰ Vector เป„เบ›เบซเบฒ Clickhouse เปเบฅเบฐ Elasticsearch

เบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ Nginx json เป‚เบ”เบเปƒเบŠเป‰ Vector เป„เบ›เบซเบฒ Clickhouse เปเบฅเบฐ Elasticsearch

Vector, เบญเบญเบเปเบšเบšเป€เบžเบทเปˆเบญเป€เบเบฑเบšเบเปเบฒ, เบซเบฑเบ™เบ›เปˆเบฝเบ™เปเบฅเบฐเบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบšเบฑเบ™เบ—เบถเบ, metrics เปเบฅเบฐเป€เบซเบ”เบเบฒเบ™.

โ†’ GitHub

เบ–เบทเบเบ‚เบฝเบ™เป€เบ›เบฑเบ™เบžเบฒเบชเบฒ Rust, เบกเบฑเบ™เบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบชเบนเบ‡เปเบฅเบฐเบเบฒเบ™เบšเปเบฅเบดเป‚เบžเบ RAM เบ•เปˆเปเบฒเป€เบกเบทเปˆเบญเบ—เบฝเบšเบเบฑเบš analogues เบ‚เบญเบ‡เบกเบฑเบ™. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบเปเบกเปˆเบ™เบˆเปˆเบฒเบเปƒเบซเป‰เบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบšเบฑเบ™เบ—เบถเบเป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบชเบปเปˆเบ‡เป„เบ›เบซเบฒ buffer เปƒเบ™เปเบœเปˆเบ™เปเบฅเบฐ rotate เป„เบŸเบฅเปŒ.

เปƒเบ™เบ—เบฒเบ‡เบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐ, Vector เปเบกเปˆเบ™ router เป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบˆเบฒเบเบซเบ™เบถเปˆเบ‡เบซเบผเบทเบซเบผเบฒเบเบเบงเปˆเบฒเบ™เบฑเป‰เบ™ เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™, เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰ เบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™, เปเบฅเบฐเบชเบปเปˆเบ‡เบžเบงเบเป€เบ‚เบปเบฒเป„เบ›เบซเบฒเบซเบ™เบถเปˆเบ‡เบซเบผเบทเบซเบผเบฒเบเบเบงเปˆเบฒเบ™เบฑเป‰เบ™ เบ—เปเปˆเบฅเบฐเบšเบฒเบเบ™เปเป‰เบฒ.

Vector เปเบกเปˆเบ™เบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™เบชเปเบฒเบฅเบฑเบš filebeat เปเบฅเบฐ logstash, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบ—เบฑเบ‡เบชเบญเบ‡เบšเบปเบ”เบšเบฒเบ” (เบฎเบฑเบšเปเบฅเบฐเบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ), เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบžเบงเบเบกเบฑเบ™ site.

เบ–เป‰เบฒเบขเบนเปˆเปƒเบ™ Logstash เบฅเบฐเบšเบปเบšเบ•เปˆเบญเบ‡เป‚เบชเป‰เบ–เบทเบเบชเป‰เบฒเบ‡เป€เบ›เบฑเบ™ input โ†’ filter โ†’ output เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปƒเบ™ Vector เบกเบฑเบ™เปเบกเปˆเบ™ เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™ โ†’ เบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™ โ†’ เบšเปˆเบญเบ™เบซเบฅเบปเป‰เบกเบˆเบปเบก

เบ•เบปเบงเบขเปˆเบฒเบ‡เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™.

เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบชเบฐเบšเบฑเบšเบ›เบฑเบšเบ›เบธเบ‡เบˆเบฒเบ Vyacheslav Rakhinsky. เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡ geoip. เป€เบกเบทเปˆเบญเบ—เบปเบ”เบชเบญเบš geoip เบˆเบฒเบเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบžเบฒเบเปƒเบ™, 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

เบ–เป‰เบฒเปƒเบœเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡ geoip, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปƒเบซเป‰เบญเป‰เบฒเบ‡เบญเบตเบ‡เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบˆเบฒเบ Vyacheslav Rakhinsky.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบ‚เบญเบ‡ Nginx (เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡) โ†’ Vector (เบฅเบนเบเบ„เป‰เบฒ | Filebeat) โ†’ Vector (Server | Logstash) โ†’เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเปƒเบ™ Clickhouse เปเบฅเบฐเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเปƒเบ™ Elasticsearch. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡ 4 เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ” bypass เบกเบฑเบ™เบเบฑเบš 3 เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ.

เบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ Nginx json เป‚เบ”เบเปƒเบŠเป‰ Vector เป„เบ›เบซเบฒ Clickhouse เปเบฅเบฐ Elasticsearch

เป‚เบ„เบ‡เบเบฒเบ™เปเบกเปˆเบ™เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰.

เบ›เบดเบ”เปƒเบŠเป‰เบ‡เบฒเบ™ Selinux เปƒเบ™เบ—เบธเบเป€เบŠเบตเบšเป€เบงเบตเบ‚เบญเบ‡เบ—เปˆเบฒเบ™

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

เบžเบงเบเป€เบฎเบปเบฒเบ•เบดเบ”เบ•เบฑเป‰เบ‡ HTTP server emulator + utilities เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”

เปƒเบ™เบ–เบฒเบ™เบฐเป€เบ›เบฑเบ™ emulator เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ HTTP เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰ nodejs-stub-server เบˆเบฒเบ Maxim Ignatenko

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 benchmark เปเบฅเบฐ screen terminal multiplexer เปƒเบ™เบ—เบธเบเป€เบŠเบตเบšเป€เบงเบต

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>

เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบฅเบฐเบ”เบฑเบšเบเบฒเบ™เบšเบฑเบ™เบ—เบถเบเบˆเบฒเบเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเป„เบ›เบชเบนเปˆเบเบฒเบ™เบ”เบตเบšเบฑเบ

debug

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบšเบตเบšเบญเบฑเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™:

min_compress_block_size  65536
max_compress_block_size  1048576

เป€เบžเบทเปˆเบญเป€เบ›เบตเบ”เปƒเบŠเป‰เบเบฒเบ™เบšเบตเบšเบญเบฑเบ” Zstd, เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเปเบ™เบฐเบ™เปเบฒเบšเปเปˆเปƒเบซเป‰เปเบ•เบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เปเบ•เปˆเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ DDL.

เบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ Nginx json เป‚เบ”เบเปƒเบŠเป‰ Vector เป„เบ›เบซเบฒ Clickhouse เปเบฅเบฐ Elasticsearch

เบ‚เป‰เบญเบเบšเปเปˆเบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบงเบดเบ—เบตเปƒเบŠเป‰เบเบฒเบ™เบšเบตเบšเบญเบฑเบ” zstd เบœเปˆเบฒเบ™ DDL เปƒเบ™ Google. เบชเบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบถเปˆเบ‡เบ›เบฐเป„เบงเป‰เบ„เบทเป€เบเบปเปˆเบฒ.

เป€เบžเบทเปˆเบญเบ™เบฎเปˆเบงเบกเบ‡เบฒเบ™เบ—เบตเปˆเปƒเบŠเป‰เบเบฒเบ™เบšเบตเบšเบญเบฑเบ” zstd เปƒเบ™ Clickhouse, เบเบฐเบฅเบธเบ™เบฒเปเบšเปˆเบ‡เบ›เบฑเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ.

เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบ›เบฑเบ™ daemon, เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™:

service clickhouse-server start

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบฎเบปเบฒเบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Clickhouse

เป„เบ›เบ—เบตเปˆ Clickhouse

clickhouse-client -h 172.26.10.109 -m

172.26.10.109 โ€” IP เบ‚เบญเบ‡เป€เบŠเบตเบšเป€เบงเบตเบ—เบตเปˆ Clickhouse เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡.

เปƒเบซเป‰เบชเป‰เบฒเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ vector

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 เปเบฅเบฐเป€เบฎเบฑเบ”เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป.

เปƒเบซเป‰เป„เบ›เบ—เบตเปˆเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ vector.

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

เบ•เบดเบ”เบ•เบฑเป‰เบ‡ elasticsearch เปเบฅเบฐ kibana

yum install -y kibana elasticsearch

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบกเบฑเบ™เบˆเบฐเบขเบนเปˆเปƒเบ™ 1 เบชเปเบฒเป€เบ™เบปเบฒ, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบชเบดเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰เปƒเบชเปˆเป„เบŸเบฅเปŒ /etc/elasticsearch/elasticsearch.yml:

discovery.type: single-node

เป€เบžเบทเปˆเบญเปƒเบซเป‰ vector เบ™เบฑเป‰เบ™เบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เป„เบ›เบซเบฒ 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

เปเบฅเบฐ kibana

systemctl enable kibana
systemctl start kibana

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Elasticsearch เบชเปเบฒเบฅเบฑเบšเป‚เบซเบกเบ”เบ”เบฝเบง 1 shard, 0 replica. เบชเปˆเบงเบ™เบซเบผเบฒเบเบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบกเบตเบเบธเปˆเบกเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบˆเปเบฒเบ™เบงเบ™เบซเบฅเบฒเบเปเบฅเบฐเบ—เปˆเบฒเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰.

เบชเปเบฒเบฅเบฑเบšเบ”เบฑเบ”เบชเบฐเบ™เบตเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”, เบ›เบฑเบšเบ›เบธเบ‡เปเบกเปˆเปเบšเบšเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™:

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

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Vector เป€เบ›เบฑเบ™เบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™ Logstash เปƒเบ™เป€เบŠเบตเบšเป€เบงเบต 2

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

เปƒเบซเป‰เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Vector เปเบ—เบ™ Logstash. เบเบฒเบ™เปเบเป‰เป„เบ‚เป„เบŸเบฅเปŒ /etc/vector/vector.toml

# /etc/vector/vector.toml

data_dir = "/var/lib/vector"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    emit(event)

  end
  """

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

[transforms.nginx_parse_coercer]

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

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

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

    types.remote_port = "int"

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

    types.timestamp = "timestamp"

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

    database = "vector"
    healthcheck = true
    host = "http://172.26.10.109:8123" #  ะะดั€ะตั Clickhouse
    table = "logs"

    encoding.timestamp_format = "unix"

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

    request.in_flight_limit = 20

[sinks.elasticsearch]
    type = "elasticsearch"
    inputs   = ["nginx_parse_coercer"]
    compression = "none"
    healthcheck = true
    # 172.26.10.116 - ัะตั€ะฒะตั€ ะณะดะต ัƒัั‚ะฐะฝะพะฒะตะฝ elasticsearch
    host = "http://172.26.10.116:9200" 
    index = "vector-%Y-%m-%d"

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบžเบฒเบเบชเปˆเบงเบ™ transforms.nginx_parse_add_defaults เป„เบ”เป‰.

เบ™เบฑเบšโ€‹เบ•เบฑเป‰เบ‡โ€‹เปเบ•เปˆ Vyacheslav Rakhinsky เปƒเบŠเป‰ config เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบชเปเบฒเบฅเบฑเบš CDN เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเปเบฅเบฐเบชเบฒเบกเบฒเบ”เบกเบตเบซเบผเบฒเบเบ„เปˆเบฒเปƒเบ™ upstream_*

เบ•เบปเบงเบขเปˆเบฒเบ‡:

"upstream_addr": "128.66.0.10:443, 128.66.0.11:443, 128.66.0.12:443"
"upstream_bytes_received": "-, -, 123"
"upstream_status": "502, 502, 200"

เบ–เป‰เบฒเบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ, เบžเบฒเบเบชเปˆเบงเบ™เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ‡เปˆเบฒเบเบ”เบฒเบเป„เบ”เป‰

เปƒเบซเป‰เบชเป‰เบฒเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบชเปเบฒเบฅเบฑเบš systemd /etc/systemd/system/vector.service

# /etc/systemd/system/vector.service

[Unit]
Description=Vector
After=network-online.target
Requires=network-online.target

[Service]
User=vector
Group=vector
ExecStart=/usr/bin/vector
ExecReload=/bin/kill -HUP $MAINPID
Restart=no
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=vector

[Install]
WantedBy=multi-user.target

เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ Vector

systemctl enable vector
systemctl start vector

เบšเบฑเบ™เบ—เบถเบ 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.

เป€เบžเบตเปˆเบกเป„เบŸเบฅเปŒ repository 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

เบขเปˆเบฒเบฅเบทเบกเป€เบžเบตเปˆเบกเบเบปเบ”เบฅเบฐเบšเบฝเบšเป€เบžเบทเปˆเบญ logrotate เบชเปเบฒเบฅเบฑเบšเบšเบฑเบ™เบ—เบถเบเปƒเบซเบกเปˆ (เบ–เป‰เบฒเป„เบŸเบฅเปŒเบšเบฑเบ™เบ—เบถเบเบšเปเปˆเป„เบ”เป‰เบฅเบปเบ‡เบ—เป‰เบฒเบเบ”เป‰เบงเบ .log).

เป€เบญเบปเบฒ default.conf เบญเบญเบเบˆเบฒเบ /etc/nginx/conf.d/

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

เป€เบžเบตเปˆเบกเป€เบˆเบปเป‰เบฒเบžเบฒเบš virtual /etc/nginx/conf.d/vhost1.conf

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

เป€เบžเบตเปˆเบกเป€เบˆเบปเป‰เบฒเบžเบฒเบš virtual /etc/nginx/conf.d/vhost2.conf

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

เป€เบžเบตเปˆเบกเป€เบˆเบปเป‰เบฒเบžเบฒเบš virtual /etc/nginx/conf.d/vhost3.conf

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

เป€เบžเบตเปˆเบกเป€เบˆเบปเป‰เบฒเบžเบฒเบš virtual /etc/nginx/conf.d/vhost4.conf

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

เป€เบžเบตเปˆเบก virtual hosts (172.26.10.106 ip เบ‚เบญเบ‡เป€เบŠเบตเบšเป€เบงเบตเบ—เบตเปˆ nginx เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡) เปƒเบซเป‰เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”เป„เบ›เบซเบฒเป„เบŸเบฅเปŒ /etc/hosts:

172.26.10.106 vhost1
172.26.10.106 vhost2
172.26.10.106 vhost3
172.26.10.106 vhost4

เปเบฅเบฐเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบเบฝเบกเบžเป‰เบญเบกเปเบฅเป‰เบง

nginx -t 
systemctl restart nginx

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบฎเบปเบฒเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™เป€เบญเบ‡ Vector

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

เปƒเบซเป‰เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบš systemd /etc/systemd/system/vector.service

[Unit]
Description=Vector
After=network-online.target
Requires=network-online.target

[Service]
User=vector
Group=vector
ExecStart=/usr/bin/vector
ExecReload=/bin/kill -HUP $MAINPID
Restart=no
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=vector

[Install]
WantedBy=multi-user.target

เปเบฅเบฐเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™ Filebeat เปƒเบ™ /etc/vector/vector.toml config. เบ—เบตเปˆเบขเบนเปˆ IP 172.26.10.108 เปเบกเปˆเบ™เบ—เบตเปˆเบขเบนเปˆ IP เบ‚เบญเบ‡เป€เบŠเบตเบšเป€เบงเบตเบšเบฑเบ™เบ—เบถเบ (Vector-Server)

data_dir = "/var/lib/vector"

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

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

  address                       = "172.26.10.108:9876"

เบขเปˆเบฒเบฅเบทเบกเป€เบžเบตเปˆเบกเบœเบนเป‰เปƒเบŠเป‰ vector เบเบฑเบšเบเบธเปˆเบกเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เบฅเบฒเบงเบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบŸเบฅเปŒเบšเบฑเบ™เบ—เบถเบ. เบ•เบปเบงเบขเปˆเบฒเบ‡, nginx เปƒเบ™ centos เบชเป‰เบฒเบ‡เบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบกเบตเบชเบดเบ”เบ—เบดเบเบธเปˆเบก adm.

usermod -a -G adm vector

เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ vector

systemctl enable vector
systemctl start vector

เบšเบฑเบ™เบ—เบถเบ vector เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป„เบ”เป‰เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

journalctl -f -u vector

เบ„เบงเบ™เบˆเบฐเบกเบตเบฅเบฒเบเบเบฒเบ™เปเบšเบšเบ™เบตเป‰เบขเบนเปˆเปƒเบ™เบšเบฑเบ™เบ—เบถเบ

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

เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ„เบงเบฒเบกเบเบปเบ”เบ”เบฑเบ™

เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เป‚เบ”เบเปƒเบŠเป‰ Apache benchmark.

เบŠเบธเบ” httpd-tools เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”

เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป‚เบ”เบเปƒเบŠเป‰ Apache benchmark เบˆเบฒเบ 4 เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เปƒเบ™เบซเบ™เป‰เบฒเบˆเป. เบ—เปเบฒเบญเบดเบ”, เบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบตเบ”เบ•เบปเบง multixer terminal เบซเบ™เป‰เบฒเบˆเป, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป‚เบ”เบเปƒเบŠเป‰ Apache benchmark. เบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบซเบ™เป‰เบฒเบˆเปเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเป„เบ”เป‰ เบšเบปเบ”เบ„เบงเบฒเบก.

เบˆเบฒเบเป€เบŠเบตเบšเป€เบงเบตเบ—เบต 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 MB.

เบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ Nginx json เป‚เบ”เบเปƒเบŠเป‰ Vector เป„เบ›เบซเบฒ Clickhouse เปเบฅเบฐ Elasticsearch

เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ”เบฝเบงเบเบฑเบ™เปƒเบ™เบ”เบฑเบ”เบŠเบฐเบ™เบตเปƒเบ™ Elasticsearch เปเบกเปˆเบ™ 4,5GB.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบฅเบฐเบšเบธเบ‚เปเป‰เบกเบนเบ™เปƒเบ™ vector เปƒเบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต, Clickhouse เปƒเบŠเป‰เป€เบงเบฅเบฒ 4500/857.19 = 5.24 เป€เบ—เบปเปˆเบฒเปƒเบ™ Elasticsearch.

เปƒเบ™ vector, เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก compression เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™.

Telegram เบชเบปเบ™เบ—เบฐเบ™เบฒเป‚เบ”เบ clickhouse
Telegram เบชเบปเบ™เบ—เบฐเบ™เบฒเป‚เบ”เบ Elasticsearch
Telegram เบชเบปเบ™เบ—เบฐเบ™เบฒเป‚เบ”เบ "เบเบฒเบ™เป€เบเบฑเบšเบเปเบฒเปเบฅเบฐเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบฅเบฐเบšเบปเบš เบ‚เปเป‰เบ„เบงเบฒเบก"

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™