αž€αžΆαžšαž•αŸ’αž‰αžΎαž€αŸ†αžŽαžαŸ‹αž αŸαžαž» Nginx json αžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαŸ‰αž·αž…αž‘αŸαžšαž‘αŸ… Clickhouse αž“αž·αž„ Elasticsearch

αž€αžΆαžšαž•αŸ’αž‰αžΎαž€αŸ†αžŽαžαŸ‹αž αŸαžαž» Nginx json αžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαŸ‰αž·αž…αž‘αŸαžšαž‘αŸ… Clickhouse αž“αž·αž„ Elasticsearch

αžœαŸ‰αž·αž…αž‘αŸαžšαžšαž…αž“αžΆαž‘αžΎαž„αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαž˜αžΌαž› αž”αŸ†αž”αŸ’αž›αŸ‚αž„ αž“αž·αž„αž•αŸ’αž‰αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αŸ†αžŽαžαŸ‹αž αŸαžαž» αžšαž„αŸ’αžœαžΆαžŸαŸ‹ αž“αž·αž„αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαŸ”

β†’ Github

αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‡αžΆαž—αžΆαžŸαžΆ Rust αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž›αž€αŸ’αžαžŽαŸˆαžŠαŸ„αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ’αž–αžŸαŸ‹ αž“αž·αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ RAM αž‘αžΆαž” αž”αžΎαž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž‘αŸ…αž“αžΉαž„ analogues αžšαž”αžŸαŸ‹αžœαžΆαŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αž€αžΆαžšαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž…αŸ’αžšαžΎαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ‹αž…αŸ†αž–αŸ„αŸ‡αž˜αž»αžαž„αžΆαžšαžŠαŸ‚αž›αž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ αž‡αžΆαž–αž·αžŸαŸαžŸαžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαžŠαŸ‚αž›αž˜αž·αž“αž”αžΆαž“αž•αŸ’αž‰αžΎαž‘αŸ…αž€αžΆαž“αŸ‹αžŸαžαž·αž”αžŽαŸ’αžŠαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“αž“αŸ…αž›αžΎαžαžΆαžŸ αž“αž·αž„αž”αž„αŸ’αžœαž·αž›αž―αž€αžŸαžΆαžšαŸ”

αžαžΆαž˜αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜ αžœαŸ‰αž·αž…αž‘αŸαžš αž‚αžΊαž‡αžΆαžšαŸ‰αŸ„αžαž‘αŸαžšαž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαžŠαŸ‚αž›αž‘αž‘αž½αž›αžŸαžΆαžšαž–αžΈαž˜αž½αž™ αž¬αž…αŸ’αžšαžΎαž“αŸ” αž”αŸ’αžšαž—αž–αž‡αžΆαž‡αž˜αŸ’αžšαžΎαžŸαž’αž“αž»αžœαžαŸ’αžαž›αžΎαžŸαžΆαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡ αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž αžΎαž™αž”αž‰αŸ’αž‡αžΌαž“αž–αž½αž€αž‚αŸαž‘αŸ…αž˜αž½αž™ αž¬αž…αŸ’αžšαžΎαž“αŸ” αž”αž„αŸ’αž αžΌαžš.

αžœαŸ‰αž·αž…αž‘αŸαžšαž‚αžΊαž‡αžΆαž€αžΆαžšαž‡αŸ†αž“αž½αžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ filebeat αž“αž·αž„ logstash αžœαžΆαž’αžΆαž…αžŠαžΎαžšαžαž½αž‘αžΆαŸ†αž„αž–αžΈαžš (αž‘αž‘αž½αž› αž“αž·αž„αž•αŸ’αž‰αžΎαž€αŸ†αžŽαžαŸ‹αž αŸαžαž») αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž›αžΎαž–αž½αž€αžœαžΆ αžαŸ†αž”αž“αŸ‹αž”αžŽαŸ’αžαžΆαž‰.

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž“αŸ…αž€αŸ’αž“αž»αž„ Logstash αžαŸ’αžŸαŸ‚αžŸαž„αŸ’αžœαžΆαž€αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‡αžΆ input β†’ filter β†’ output αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž“αŸ…αž€αŸ’αž“αž»αž„ Vector αžœαžΆαž‚αžΊ αž”αŸ’αžšαž—αž– β†’ αž”αŸ†αž›αŸ‚αž„αŸ” β†’ αž›αž·αž…

αž§αž‘αžΆαž αžšαžŽαŸαž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαŸ”

αžŸαŸαž…αž€αŸ’αžαžΈαžŽαŸ‚αž“αžΆαŸ†β€‹αž“αŸαŸ‡β€‹αž‚αžΊαž‡αžΆβ€‹αžŸαŸαž…αž€αŸ’αžαžΈαžŽαŸ‚αž“αžΆαŸ†β€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž€αŸ‚αž”αŸ’αžšαŸ‚β€‹αž–αžΈβ€‹ Vyacheslav Rakhinsky. αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαžΎαž˜αž˜αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš 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 αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αŸ„αž„αž‘αŸ…αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαžΎαž˜αž–αžΈ Vyacheslav Rakhinsky.

αž™αžΎαž„αž“αžΉαž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒ Nginx (Access logs) β†’ Vector (Client | Filebeat) β†’ Vector (Server | Logstash) β†’ αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ Clickhouse αž“αž·αž„αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ Elasticsearch αŸ” αž™αžΎαž„αž“αžΉαž„αžŠαŸ†αž‘αžΎαž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž…αŸ†αž“αž½αž“ 4 αŸ” αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž’αŸ’αž“αž€αž’αžΆαž…αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžœαžΆαž‡αžΆαž˜αž½αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ 3 αž€αŸαžŠαŸ„αž™αŸ”

αž€αžΆαžšαž•αŸ’αž‰αžΎαž€αŸ†αžŽαžαŸ‹αž αŸαžαž» Nginx json αžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαŸ‰αž·αž…αž‘αŸαžšαž‘αŸ… Clickhouse αž“αž·αž„ Elasticsearch

αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž‚αžΊαžŠαžΌαž…αž“αŸαŸ‡αŸ”

αž”αž·αž‘ Selinux αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

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

αž™αžΎαž„αžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ HTTP + αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

αž‡αžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ 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 αž“αŸ…αž›αžΎ servers αž‘αžΆαŸ†αž„αž’αžŸαŸ‹

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 αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž›αž»αŸ‡αžαŸ’αžšαžΆαžαŸ‚αž˜αžΆαž“αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž•αŸ’αžŸαŸαž„αž–αžΈαž“αŸαŸ‡ αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžαž½αžšαž€αŸ’αž”αžΆαž›αžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžΎαž€αŸ’αž›αžΆαž™αž‡αžΆαžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αž“αŸ’αžαŸ‚αž˜αŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžαžΎ processor αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž‚αžΆαŸ†αž‘αŸ’αžš SSE 4.2 αžŠαŸ‚αžšαž¬αž‘αŸαŸ–

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

αžŠαŸ†αž”αžΌαž„αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž—αŸ’αž‡αžΆαž”αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αž•αŸ’αž›αžΌαžœαž€αžΆαžšαŸ–

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

αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

sudo yum install -y clickhouse-server clickhouse-client

αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™ clickhouse-server αžŸαŸ’αžαžΆαž”αŸ‹αž€αžΆαžαž”αžŽαŸ’αžαžΆαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš /etc/clickhouse-server/config.xml

<listen_host>0.0.0.0</listen_host>

αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αž˜αŸ’αžšαž·αžαž“αŸƒαž€αžΆαžšαž€αžαŸ‹αžαŸ’αžšαžΆαž–αžΈαžŠαžΆαž“αž‘αŸ…αž‡αžΆαž€αžΆαžšαž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸ

αž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸ

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαŸ–

min_compress_block_size  65536
max_compress_block_size  1048576

αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹ Zstd αžŸαž€αž˜αŸ’αž˜ αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŽαŸ‚αž“αžΆαŸ†αž˜αž·αž“αž±αŸ’αž™αž”αŸ‰αŸ‡αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎ DDL αŸ”

αž€αžΆαžšαž•αŸ’αž‰αžΎαž€αŸ†αžŽαžαŸ‹αž αŸαžαž» Nginx json αžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαŸ‰αž·αž…αž‘αŸαžšαž‘αŸ… Clickhouse αž“αž·αž„ Elasticsearch

αžαŸ’αž‰αž»αŸ†αžšαž€αž˜αž·αž“αžƒαžΎαž‰αž–αžΈαžšαž”αŸ€αž”αž”αŸ’αžšαžΎαž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹ zstd αžαžΆαž˜αžšαž™αŸˆ DDL αž“αŸ…αž€αŸ’αž“αž»αž„ Google αž‘αŸαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αž‘αž»αž€β€‹αžœαžΆβ€‹αžŠαžΌαž…β€‹αž‡αžΆαŸ”

αž˜αž·αžαŸ’αžαžšαž½αž˜αž€αžΆαžšαž„αžΆαžšαžŠαŸ‚αž›αž”αŸ’αžšαžΎαž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹ zstd αž“αŸ…αž€αŸ’αž“αž»αž„ Clickhouse αžŸαžΌαž˜αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‡αžΆαžŠαŸαž˜αž·αž“ αžŸαžΌαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ–

service clickhouse-server start

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžŸαžΌαž˜αž”αž“αŸ’αžαž‘αŸ…αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ Clickhouse

αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ Clickhouse

clickhouse-client -h 172.26.10.109 -m

172.26.10.109 β€” IP αžšαž”αžŸαŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αžŠαŸ‚αž› Clickhouse αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αŸ”

αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžœαŸ‰αž·αž…αž‘αŸαžš

CREATE DATABASE vector;

αžŸαžΌαž˜αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αžΆαž“αŸ”

show databases;

αž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„ vector.logs αŸ”

/* Π­Ρ‚ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π° Π³Π΄Π΅ хранятся Π»ΠΎΠ³ΠΈ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ */

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

αž™αžΎαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžαžΆαžšαžΆαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αŸ” αžαŸ„αŸ‡αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ clickhouse-client αž“αž·αž„αž’αŸ’αžœαžΎαž€αžΆαžšαžŸαŸ’αž“αžΎαžŸαž»αŸ†αŸ”

αžαŸ„αŸ‡αž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžœαŸ‰αž·αž…αž‘αŸαžšαŸ”

use vector;

Ok.

0 rows in set. Elapsed: 0.001 sec.

αžαŸ„αŸ‡αž˜αžΎαž›αžαžΆαžšαžΆαž„αŸ”

show tables;

β”Œβ”€name────────────────┐
β”‚ logs                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ elasticsearch αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‘αžΈ 4 αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‰αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαžΌαž…αž‚αŸ’αž“αžΆαž‘αŸ… Elasticsearch αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž‡αžΆαž˜αž½αž™ Clickhouse

αž”αž“αŸ’αžαŸ‚αž˜αž‚αŸ’αžšαžΆαž”αŸ‹αž…αž»αž… rpm αžŸαžΆαž’αžΆαžšαžŽαŸˆ

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

αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαž 2 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

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžœαŸ‰αž·αž…αž‘αŸαžšαž“αŸ„αŸ‡αž’αžΆαž…αž•αŸ’αž‰αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ… elasticsearch αž–αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž•αŸ’αžŸαŸαž„αž‘αŸ€αž αžŸαžΌαž˜αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš network.host αŸ”

network.host: 0.0.0.0

αžŠαžΎαž˜αŸ’αž”αžΈαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ… kibana αžŸαžΌαž˜αž”αŸ’αžαžΌαžšαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš server.host αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš /etc/kibana/kibana.yml

server.host: "0.0.0.0"

αž…αžΆαžŸαŸ‹ αž“αž·αž„αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž™αžΊαžαž“αŸ…αž€αŸ’αž“αž»αž„ autostart

systemctl enable elasticsearch
systemctl start elasticsearch

αž“αž·αž„αž‚αžΈαž”αžΆαžŽαžΆ

systemctl enable kibana
systemctl start kibana

αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ Elasticsearch αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž”αŸ€αž”αžαŸ’αž“αžΆαŸ†αž„αžαŸ‚αž˜αž½αž™ 1 shard, 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 αž“αŸ…αž›αžΎ server 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 αŸ”

αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈ Vyacheslav Rakhinsky αž”αŸ’αžšαžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž‘αžΆαŸ†αž„αž“αŸαŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 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

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„ αž’αŸ’αž“αž€αž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαŸ‰αž·αž…αž‘αŸαžšαž”αžΆαž“αŸ”

systemctl enable vector
systemctl start vector

αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αžœαŸ‰αž·αž…αž‘αŸαžšαž’αžΆαž…αž˜αžΎαž›αžŠαžΌαž…αž“αŸαŸ‡αŸ–

journalctl -f -u vector

αž‚αž½αžšαžαŸ‚αž˜αžΆαž“αž’αžΆαžαž»αžŠαžΌαž…αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»

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

αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœ (αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αžŽαŸ’αžαžΆαž‰) - αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‘αžΈ 1

αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαŸ‚αž›αž˜αžΆαž“ nginx αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž·αž‘ ipv6 αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαžαžΆαžšαžΆαž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž“αŸ…αž€αŸ’αž“αž»αž„ clickhouse αž”αŸ’αžšαžΎαžœαžΆαž› upstream_addr IPv4 αž–αŸ’αžšαŸ„αŸ‡αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αŸ’αžšαžΎ ipv6 αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžαžΆαž‰αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎ ipv6 αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘αžœαžΆαž“αžΉαž„αž˜αžΆαž“αž€αŸ†αž αž»αžŸαŸ–

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

αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž’αŸ’αž“αž€αž’αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžš ipv6 αŸ”

αž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžš /etc/sysctl.d/98-disable-ipv6.conf

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

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹

sysctl --system

αžαŸ„αŸ‡αžŠαŸ†αž‘αžΎαž„ nginx αŸ”

αž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž―αž€αžŸαžΆαžšαžƒαŸ’αž›αžΆαŸ†αž„ nginx /etc/yum.repos.d/nginx.repo

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

αžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹ nginx

yum install -y nginx

αžŠαŸ†αž”αžΌαž„αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž€αŸ’αž“αž»αž„ Nginx αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš /etc/nginx/nginx.conf

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

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

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

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

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

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

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

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

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

    access_log  /var/log/nginx/access.log  main;
    access_log  /var/log/nginx/access.json.log vector;      # Новый Π»ΠΎΠ³ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ json

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

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

αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αžαžΌαž…αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ Nginx αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž˜αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ† access_log αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ”

access_log  /var/log/nginx/access.log  main;            # Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Π»ΠΎΠ³
access_log  /var/log/nginx/access.json.log vector;      # Новый Π»ΠΎΠ³ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ json

αž€αž»αŸ†αž—αŸ’αž›αŸαž…αž”αž“αŸ’αžαŸ‚αž˜αž…αŸ’αž”αžΆαž”αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈ logrotate αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αžαŸ’αž˜αžΈ (αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž˜αž·αž“αž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™ .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;
    }
}

αž”αž“αŸ’αžαŸ‚αž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž (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

αž₯αž‘αžΌαžœαžαŸ„αŸ‡αžŠαŸ†αž‘αžΎαž„αžœαžΆαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αŸ” αžœαŸ‰αž·αž…αž‘αŸαžš

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"

αž€αž»αŸ†αž—αŸ’αž›αŸαž…αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžœαŸ‰αž·αž…αž‘αŸαžšαž‘αŸ…αž€αŸ’αžšαž»αž˜αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž‚αžΆαžαŸ‹αž’αžΆαž…αž’αžΆαž“αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αŸ” αž§αž‘αžΆαž αžšαžŽαŸ nginx αž€αŸ’αž“αž»αž„ centos αž”αž„αŸ’αž€αžΎαžαž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž€αŸ’αžšαž»αž˜ adm αŸ”

usermod -a -G adm vector

αžαŸ„αŸ‡αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžœαŸ‰αž·αž…αž‘αŸαžš

systemctl enable vector
systemctl start vector

αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αžœαŸ‰αž·αž…αž‘αŸαžšαž’αžΆαž…αž˜αžΎαž›αžŠαžΌαž…αž“αŸαŸ‡αŸ–

journalctl -f -u vector

αž‚αž½αžšαžαŸ‚αž˜αžΆαž“αž’αžΆαžαž»αžŠαžΌαž…αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»

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

αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž—αžΆαž–αžαžΆαž“αžαžΉαž„

αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž”αŸ’αžšαžΎ Apache benchmark αŸ”

αž€αž‰αŸ’αž…αž”αŸ‹ httpd-tools αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

αž™αžΎαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ„αž™αž”αŸ’αžšαžΎ Apache benchmark αž–αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ 4 αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž’αŸαž€αŸ’αžšαž„αŸ‹αŸ” αžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš multixer αžŸαŸ’αžαžΆαž“αžΈαž™αž’αŸαž€αŸ’αžšαž„αŸ‹ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ„αž™αž”αŸ’αžšαžΎ 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 αžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαŸ‰αž·αž…αž‘αŸαžšαž‘αŸ… Clickhouse αž“αž·αž„ Elasticsearch

αž‘αŸ†αž αŸ†αžαžΆαžšαžΆαž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž‚αžΊ 857.19 MB αŸ”

αž€αžΆαžšαž•αŸ’αž‰αžΎαž€αŸ†αžŽαžαŸ‹αž αŸαžαž» Nginx json αžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαŸ‰αž·αž…αž‘αŸαžšαž‘αŸ… Clickhouse αž“αž·αž„ Elasticsearch

αž‘αŸ†αž αŸ†αž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž“αŸ’αž‘αžŸαŸ’αžŸαž“αŸαž“αŸ…αž€αŸ’αž“αž»αž„ Elasticsearch αž‚αžΊ 4,5GB αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αž·αž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αŸ’αž“αž»αž„αžœαŸ‰αž·αž…αž‘αŸαžšαž€αŸ’αž“αž»αž„αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž“αŸ„αŸ‡ Clickhouse αž…αŸ†αžŽαžΆαž™ 4500/857.19 = 5.24 αžŠαž„αžαž·αž…αž‡αžΆαž„αž“αŸ…αž€αŸ’αž“αž»αž„ Elasticsearch αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αžœαŸ‰αž·αž…αž‘αŸαžš αžœαžΆαž›αž”αž„αŸ’αž αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αŸ”

Telegram αž‡αž‡αŸ‚αž€αžŠαŸ„αž™ αž•αŸ’αž‘αŸ‡αž…αž»αž…
Telegram αž‡αž‡αŸ‚αž€αžŠαŸ„αž™ Elasticsearch
Telegram αž‡αž‡αŸ‚αž€αžŠαŸ„αž™ "αž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž“αž·αž„αž€αžΆαžšαžœαž·αž—αžΆαž‚αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’ សអរ"

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹