ویکٹر استعمال ڪندي Nginx json لاگس موڪلڻ لاءِ Clickhouse ۽ Elasticsearch ڏانهن

ویکٹر استعمال ڪندي Nginx json لاگس موڪلڻ لاءِ Clickhouse ۽ Elasticsearch ڏانهن

Vector, گڏ ڪرڻ، تبديل ڪرڻ ۽ لاگ ڊيٽا موڪلڻ لاء ٺهيل، ميٽرڪ ۽ واقعا.

→ GitHub

زنگ جي ٻولي ۾ لکيو وڃي ٿو، اهو اعلي ڪارڪردگي ۽ ان جي اينالاگ جي مقابلي ۾ گهٽ ريم واپرائڻ جي خاصيت آهي. ان کان علاوه، صحيحيت سان لاڳاپيل ڪمن تي تمام گهڻو ڌيان ڏنو ويو آهي، خاص طور تي، ڊسڪ تي بفر تي اڻڄاتل واقعن کي محفوظ ڪرڻ ۽ فائلن کي گھمڻ جي صلاحيت.

تعميراتي طور تي، ویکٹر هڪ ايونٽ روٽر آهي جيڪو هڪ يا وڌيڪ کان پيغام وصول ڪري ٿو ذريعااختياري طور تي انهن پيغامن تي لاڳو ڪرڻ تبديليون، ۽ انهن کي هڪ يا وڌيڪ ڏانهن موڪلڻ نالين.

ویکٹر فائل بيٽ ۽ لاگ اسٽاش جو متبادل آهي، اهو ٻنهي ڪردارن ۾ ڪم ڪري سگهي ٿو (لاگ وصول ڪرڻ ۽ موڪلڻ)، انهن بابت وڌيڪ تفصيل сайте.

جيڪڏهن Logstash ۾ زنجير ان پٽ → فلٽر → آئوٽ پٽ طور ٺهيل آهي ته پوءِ ویکٹر ۾ اهو آهي ذريعنبدلائي ٿوڪري ڇڏيو

مثال دستاويز ۾ ملي سگهن ٿا.

هي هدايتون هڪ نظر ثاني ٿيل هدايتن مان آهي Vyacheslav Rakhinsky. اصل هدايتون جيوپي پروسيسنگ تي مشتمل آهن. جڏهن هڪ اندروني نيٽ ورڪ کان جيوپ جي جانچ ڪندي، ویکٹر هڪ غلطي ڏني.

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

جيڪڏهن ڪنهن کي جيوپ کي پروسيس ڪرڻ جي ضرورت آهي، ته پوء اصل هدايتون ڏانهن رجوع ڪريو Vyacheslav Rakhinsky.

اسان نگنڪس (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 от ميڪسم Ignatenko

Nodejs-stub-server وٽ rpm ڪونهي. اهو آهي ان لاءِ rpm ٺاهيو. rpm استعمال ڪندي مرتب ڪيو ويندو Fedora Copr

repository 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 ۽ اسڪرين ٽرمينل ملٽي پلڪسر سڀني سرورن تي

yum -y install stub_http_server screen mc httpd-tools screen

مون /var/lib/stub_http_server/stub_http_server.js فائل ۾ stub_http_server جي جوابي وقت کي درست ڪيو ته جيئن وڌيڪ لاگ موجود هجن.

var max_sleep = 10;

اچو ته شروع ڪريون stub_http_server.

systemctl start stub_http_server
systemctl enable stub_http_server

ڪلڪ هائوس جي انسٽاليشن سرور 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>

لاگنگ جي سطح کي ٽريڪ کان ڊيبگ تائين تبديل ڪرڻ

debug

معياري ڪمپريشن سيٽنگون:

min_compress_block_size  65536
max_compress_block_size  1048576

Zstd کمپريشن کي چالو ڪرڻ لاء، اهو مشورو ڏنو ويو ته ترتيب کي ڇڪڻ نه، بلڪه ڊي ڊي ايل استعمال ڪرڻ لاء.

ویکٹر استعمال ڪندي Nginx json لاگس موڪلڻ لاءِ Clickhouse ۽ Elasticsearch ڏانهن

مان نه ڳولي سگهيس ته گوگل ۾ ڊي ڊي ايل ذريعي zstd ڪمپريشن ڪيئن استعمال ڪجي. تنهنڪري مون ان کي ڇڏي ڏنو.

ساٿي جيڪي ڪلڪ هائوس ۾ zstd کمپريشن استعمال ڪندا آهن، مهرباني ڪري هدايتون حصيداري ڪريو.

سرور کي ڊيمن جي طور تي شروع ڪرڻ لاء، هلائڻ:

service clickhouse-server start

ھاڻي اچو ته ڪلڪ ھاؤس قائم ڪرڻ ڏانھن وڃو

ڪلڪ هائوس ڏانھن وڃو

clickhouse-client -h 172.26.10.109 -m

172.26.10.109 — سرور جو IP جتي ڪلڪ هاؤس انسٽال ٿيل آهي.

اچو ته هڪ ویکٹر ڊيٽابيس ٺاهي

CREATE DATABASE vector;

اچو ته چيڪ ڪريو ته ڊيٽابيس موجود آهي.

show databases;

هڪ vector.logs ٽيبل ٺاهيو.

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

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

اسان چيڪ ڪريون ٿا ته ٽيبل ٺاهيا ويا آهن. اچو ته لانچ ڪريون clickhouse-client ۽ درخواست ڪريو.

اچو ته ویکٹر ڊيٽابيس ڏانهن وڃو.

use vector;

Ok.

0 rows in set. Elapsed: 0.001 sec.

اچو ته ٽيبل تي نظر رکون.

show tables;

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

4th سرور تي elasticsearch کي انسٽال ڪرڻ لاءِ ساڳئي ڊيٽا کي Elasticsearch ڏانهن Clickhouse سان مقابلي لاءِ موڪلڻ لاءِ

عوامي rpm ڪيچ شامل ڪريو

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

اچو ته 2 ريپو ٺاهي:

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

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

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

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

elasticsearch ۽ kibana انسٽال ڪريو

yum install -y kibana elasticsearch

جيئن ته اهو 1 ڪاپي ۾ هوندو، توهان کي هيٺ ڏنل شامل ڪرڻ جي ضرورت آهي /etc/elasticsearch/elasticsearch.yml فائل:

discovery.type: single-node

تنهن ڪري اهو ویکٹر ٻئي سرور کان لچڪدار ڳولا ڏانهن ڊيٽا موڪلي سگهي ٿو، اچو ته تبديل ڪريون network.host.

network.host: 0.0.0.0

kibana سان ڳنڍڻ لاء، فائل ۾ server.host پيٽرول تبديل ڪريو /etc/kibana/kibana.yml

server.host: "0.0.0.0"

پراڻي ۽ شامل ڪريو elasticsearch autostart ۾

systemctl enable elasticsearch
systemctl start elasticsearch

۽ ڪيبانا

systemctl enable kibana
systemctl start kibana

سنگل نوڊ موڊ 1 شارڊ، 0 ريپليڪا لاءِ Elasticsearch ترتيب ڏيڻ. گهڻو ڪري توهان وٽ سرور جي وڏي تعداد جو ڪلستر هوندو ۽ توهان کي اهو ڪرڻ جي ضرورت ناهي.

مستقبل جي انڊيڪسس لاءِ، ڊفالٽ ٽيمپليٽ کي اپڊيٽ ڪريو:

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 سرور 2 تي Logstash جي متبادل جي طور تي

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

اچو ته ویکٹر کي Logstash جي متبادل طور سيٽ اپ ڪريون. فائل کي تبديل ڪندي /etc/vector/vector.toml

# /etc/vector/vector.toml

data_dir = "/var/lib/vector"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    emit(event)

  end
  """

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

[transforms.nginx_parse_coercer]

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

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

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

    types.remote_port = "int"

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

    types.timestamp = "timestamp"

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

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

    encoding.timestamp_format = "unix"

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

    request.in_flight_limit = 20

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

توھان ترتيب ڏئي سگھوٿا transforms.nginx_parse_add_defaults سيڪشن.

کان 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.

ڪلائنٽ تي (ويب سرور) - پهريون سرور

nginx سان سرور تي، توهان کي ipv6 کي غير فعال ڪرڻ جي ضرورت آهي، ڇاڪاڻ ته ڪلڪ هائوس ۾ لاگس ٽيبل فيلڊ کي استعمال ڪري ٿو upstream_addr IPv4، ڇاڪاڻ ته مان نيٽ ورڪ ۾ ipv6 استعمال نٿو ڪريان. جيڪڏهن ipv6 بند نه ڪيو ويو آهي، اتي غلطيون هونديون:

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

شايد پڙهندڙ، ipv6 سپورٽ شامل ڪريو.

فائل ٺاهيو /etc/sysctl.d/98-disable-ipv6.conf

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

سيٽنگون لاڳو ڪرڻ

sysctl --system

اچو ته انسٽال ڪريون nginx.

شامل ڪيو ويو nginx مخزن فائل /etc/yum.repos.d/nginx.repo

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

nginx پيڪيج انسٽال ڪريو

yum install -y nginx

پهرين، اسان کي فائل ۾ 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;
}

توھان جي موجوده تشڪيل کي ٽوڙڻ لاءِ، نينگڪس توھان کي اجازت ڏئي ٿو ڪيترن ئي access_log ھدايتون

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

نون لاگز لاءِ لاگروٽ ڪرڻ لاءِ قاعدو شامل ڪرڻ نه وساريو (جيستائين لاگ فائل .log سان ختم نه ٿئي)

default.conf تان هٽايو /etc/nginx/conf.d/

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

ورچوئل ميزبان شامل ڪريو /etc/nginx/conf.d/vhost1.conf

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

ورچوئل ميزبان شامل ڪريو /etc/nginx/conf.d/vhost2.conf

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

ورچوئل ميزبان شامل ڪريو /etc/nginx/conf.d/vhost3.conf

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

ورچوئل ميزبان شامل ڪريو /etc/nginx/conf.d/vhost4.conf

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

ورچوئل هوسٽ شامل ڪريو (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

۽ /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"

ویکٹر استعمال ڪندڙ کي گهربل گروپ ۾ شامل ڪرڻ نه وساريو ته جيئن هو لاگ فائلون پڙهي سگهي. مثال طور، centos ۾ nginx ٺاهي ٿو لاگز ايڊم گروپ جي حقن سان.

usermod -a -G adm vector

اچو ته ویکٹر سروس شروع ڪريون

systemctl enable vector
systemctl start vector

ویکٹر لاگ هن طرح ڏسي سگهجن ٿا:

journalctl -f -u vector

لاگن ۾ اهڙي قسم جي داخلا هجڻ گهرجي

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

دٻاء جي جاچ

اسان اپاچي بينچ مارڪ استعمال ڪندي جاچ ڪندا آهيون.

httpd-tools پيڪيج سڀني سرورن تي نصب ڪيو ويو

اسان اسڪرين ۾ 4 مختلف سرورز مان اپاپي بينچ مارڪ استعمال ڪندي جاچ شروع ڪندا آهيون. پهريون، اسان لانچ ڪيو اسڪرين ٽرمينل ملٽي پلڪسر، ۽ پوءِ اسان اپاچي بينچ مارڪ استعمال ڪندي جاچ شروع ڪريون ٿا. اسڪرين سان ڪيئن ڪم ڪجي جنهن ۾ توهان ڳولي سگهو ٿا مضمون.

پهرين سرور کان

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

پهرين سرور کان

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

پهرين سرور کان

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

پهرين سرور کان

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

اچو ته چيڪ هاؤس ۾ ڊيٽا چيڪ ڪريو

ڪلڪ هائوس ڏانھن وڃو

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 │                       │
└──────────────┴─────────────────────┴─────────────┴─────────┴────────────────┴────────────────────┴───────────────────┴─────────────┴────────────────┴────────────────┴────────────────┴──────────────┴──────────────────┴─────────────────┴──────────────────────────┴───────────────────────┴───────────────┴─────────────┴─────────────┴───────────────┴───────────────┴─────────────────────────┴─────────────────────┴───────────────────────┴───────────────────────┴──────────────────────┴──────────────────────────┴────────────────────────┴─────────────────┴───────────────────────

ڪلڪ هاؤس ۾ جدولن جي سائيز معلوم ڪريو

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;

اچو ته اهو معلوم ڪريون ته ڪلڪ هاؤس ۾ ڪيترا لاگ اپ ٿيا.

ویکٹر استعمال ڪندي Nginx json لاگس موڪلڻ لاءِ Clickhouse ۽ Elasticsearch ڏانهن

لاگ ٽيبل جي سائيز 857.19 MB آهي.

ویکٹر استعمال ڪندي Nginx json لاگس موڪلڻ لاءِ Clickhouse ۽ Elasticsearch ڏانهن

Elasticsearch ۾ انڊيڪس ۾ ساڳئي ڊيٽا جي سائيز 4,5GB آهي.

جيڪڏهن توهان ویکٹر ۾ ڊيٽا جي وضاحت نه ڪندا آهيو پيٽرولن ۾، ڪلڪ هائوس 4500/857.19 = 5.24 ڀيرا گھٽ وٺندو آهي Elasticsearch جي ڀيٽ ۾.

ویکٹر ۾، ڪمپريشن فيلڊ ڊفالٽ طور استعمال ڪيو ويندو آهي.

ٽيليگرام چيٽ ذريعي ڪلڪ هائوس
ٽيليگرام چيٽ ذريعي ElasticsSearch
ٽيليگرام چيٽ پاران "گڏ ڪرڻ ۽ نظام جو تجزيو پيغامَ"

جو ذريعو: www.habr.com

تبصرو شامل ڪريو