ویکٹر کا استعمال کرتے ہوئے Nginx json لاگز کو Clickhouse اور Elasticsearch پر بھیجنا

ویکٹر کا استعمال کرتے ہوئے Nginx json لاگز کو Clickhouse اور Elasticsearch پر بھیجنا

ویکٹرلاگ ڈیٹا، میٹرکس اور ایونٹس کو جمع کرنے، تبدیل کرنے اور بھیجنے کے لیے ڈیزائن کیا گیا ہے۔

→ Github کے

زنگ زبان میں لکھے جانے کی وجہ سے، اس کی خصوصیت اس کے ینالاگوں کے مقابلے میں اعلی کارکردگی اور کم RAM کی کھپت ہے۔ اس کے علاوہ، درستگی سے متعلق افعال پر بہت زیادہ توجہ دی جاتی ہے، خاص طور پر، غیر بھیجے ہوئے واقعات کو ڈسک پر موجود بفر میں محفوظ کرنے اور فائلوں کو گھمانے کی صلاحیت۔

آرکیٹیکچرل طور پر، ویکٹر ایک ایونٹ روٹر ہے جو ایک یا زیادہ سے پیغامات وصول کرتا ہے۔ ذرائعاختیاری طور پر ان پیغامات پر لاگو کرنا تبدیلیاں، اور انہیں ایک یا زیادہ کو بھیجنا نالوں.

ویکٹر فائل بیٹ اور لاگ اسٹیش کا نعم البدل ہے، یہ دونوں کرداروں میں کام کرسکتا ہے (لاگز وصول کرنا اور بھیجنا)، ان پر مزید تفصیلات ڈاؤن لوڈ، اتارنا.

اگر Logstash میں سلسلہ ان پٹ → فلٹر → آؤٹ پٹ کے طور پر بنایا گیا ہے تو ویکٹر میں یہ ہے ذرائعتبادلوںڈوبتا ہے۔

دستاویزات میں مثالیں مل سکتی ہیں۔

یہ ہدایت کی طرف سے نظر ثانی شدہ ہدایت ہے۔ ویاچسلاو راخنسکی. اصل ہدایات geoip پروسیسنگ پر مشتمل ہیں۔ اندرونی نیٹ ورک سے geoip کی جانچ کرتے وقت، ویکٹر نے ایک غلطی دی۔

Aug 05 06:25:31.889 DEBUG transform{name=nginx_parse_rename_fields type=rename_fields}: vector::transforms::rename_fields: Field did not exist field=«geoip.country_name» rate_limit_secs=30

اگر کسی کو geoip پر کارروائی کرنے کی ضرورت ہے، تو اصل ہدایات سے رجوع کریں۔ ویاچسلاو راخنسکی.

ہم Nginx (Access logs) → Vector (Client | Filebeat) → Vector (Server | Logstash) → الگ الگ کلک ہاؤس میں اور الگ الگ Elasticsearch میں ترتیب دیں گے۔ ہم 4 سرورز انسٹال کریں گے۔ اگرچہ آپ اسے 3 سرورز کے ساتھ بائی پاس کر سکتے ہیں۔

ویکٹر کا استعمال کرتے ہوئے Nginx json لاگز کو Clickhouse اور Elasticsearch پر بھیجنا

اسکیم کچھ اس طرح ہے۔

اپنے تمام سرورز پر Selinux کو غیر فعال کریں۔

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

ہم تمام سرورز پر ایک HTTP سرور ایمولیٹر + یوٹیلیٹیز انسٹال کرتے ہیں۔

بطور HTTP سرور ایمولیٹر ہم استعمال کریں گے۔ nodejs-stub-server سے میکسم اگناٹینکو

Nodejs-stub-server میں rpm نہیں ہے۔ یہاں اس کے لیے rpm بنائیں۔ rpm کا استعمال کرتے ہوئے مرتب کیا جائے گا۔ Fedora Copr

antonpatsev/nodejs-stub-server repository شامل کریں۔

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

تمام سرورز پر nodejs-stub-server، Apache بینچ مارک اور اسکرین ٹرمینل ملٹی پلیکسر انسٹال کریں

yum -y install stub_http_server screen mc httpd-tools screen

میں نے /var/lib/stub_http_server/stub_http_server.js فائل میں stub_http_server رسپانس ٹائم کو درست کیا تاکہ مزید لاگز ہوں۔

var max_sleep = 10;

آئیے شروع کریں stub_http_server۔

systemctl start stub_http_server
systemctl enable stub_http_server

کلک ہاؤس کی تنصیب سرور 3 پر

ClickHouse SSE 4.2 انسٹرکشن سیٹ کا استعمال کرتا ہے، لہذا جب تک کہ دوسری صورت میں اس کی وضاحت نہ کی جائے، استعمال شدہ پروسیسر میں اس کے لیے سپورٹ سسٹم کی اضافی ضرورت بن جاتی ہے۔ یہ چیک کرنے کے لیے کمانڈ ہے کہ آیا موجودہ پروسیسر SSE 4.2 کو سپورٹ کرتا ہے:

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

سب سے پہلے آپ کو سرکاری ذخیرہ سے منسلک کرنے کی ضرورت ہے:

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

پیکجوں کو انسٹال کرنے کے لیے آپ کو درج ذیل کمانڈز چلانے کی ضرورت ہے۔

sudo yum install -y clickhouse-server clickhouse-client

کلک ہاؤس سرور کو فائل میں نیٹ ورک کارڈ سننے کی اجازت دیں /etc/clickhouse-server/config.xml

<listen_host>0.0.0.0</listen_host>

لاگنگ لیول کو ٹریس سے ڈیبگ تک تبدیل کرنا

ڈیبگ

معیاری کمپریشن کی ترتیبات:

min_compress_block_size  65536
max_compress_block_size  1048576

Zstd کمپریشن کو چالو کرنے کے لئے، یہ مشورہ دیا گیا تھا کہ کنفگ کو ہاتھ نہ لگائیں، بلکہ DDL استعمال کریں۔

ویکٹر کا استعمال کرتے ہوئے Nginx json لاگز کو Clickhouse اور Elasticsearch پر بھیجنا

مجھے گوگل میں ڈی ڈی ایل کے ذریعے zstd کمپریشن کا استعمال کرنے کا طریقہ نہیں مل سکا۔ تو میں نے اسے ویسا ہی چھوڑ دیا۔

وہ ساتھی جو Clickhouse میں 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                │
└─────────────────────┘

کلک ہاؤس سے موازنہ کرنے کے لیے وہی ڈیٹا Elasticsearch کو بھیجنے کے لیے 4th سرور پر elasticsearch کو انسٹال کرنا

ایک عوامی rpm کلید شامل کریں۔

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

آئیے 2 ریپو بنائیں:

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

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

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

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

elasticsearch اور kibana انسٹال کریں۔

yum install -y kibana elasticsearch

چونکہ یہ 1 کاپی میں ہوگا، آپ کو مندرجہ ذیل کو /etc/elasticsearch/elasticsearch.yml فائل میں شامل کرنے کی ضرورت ہے:

discovery.type: single-node

تاکہ ویکٹر کسی دوسرے سرور سے elasticsearch پر ڈیٹا بھیج سکے، آئیے network.host کو تبدیل کریں۔

network.host: 0.0.0.0

کبانہ سے جڑنے کے لیے، فائل میں server.host پیرامیٹر تبدیل کریں /etc/kibana/kibana.yml

server.host: "0.0.0.0"

پرانا اور آٹو اسٹارٹ میں لچکدار تلاش شامل کریں۔

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

تنصیب ویکٹر سرور 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 سیکشن کو ایڈجسٹ کر سکتے ہیں۔

جیسا کہ ویاچسلاو راخنسکی ان کنفیگرز کو ایک چھوٹے سی ڈی این کے لیے استعمال کرتا ہے اور 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

سب سے پہلے، ہمیں فائل /etc/nginx/nginx.conf میں Nginx میں لاگ فارمیٹ کو ترتیب دینے کی ضرورت ہے

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

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

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

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

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

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

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

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

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

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

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

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

آپ کی موجودہ کنفیگریشن کو نہ ٹوٹنے کے لیے، Nginx آپ کو کئی رسائی_لاگ ڈائریکٹیو حاصل کرنے کی اجازت دیتا ہے۔

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

نئے لاگز کے لیے لاگروٹیٹ کے لیے ایک اصول شامل کرنا نہ بھولیں (اگر لاگ فائل .log کے ساتھ ختم نہیں ہوتی ہے)

/etc/nginx/conf.d/ سے default.conf کو ہٹا دیں

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

اور فائل بیٹ کی تبدیلی کو /etc/vector/vector.toml ترتیب میں ترتیب دیں۔ IP ایڈریس 172.26.10.108 لاگ سرور کا IP پتہ ہے (ویکٹر-سرور)

data_dir = "/var/lib/vector"

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

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

  address                       = "172.26.10.108:9876"

ویکٹر صارف کو مطلوبہ گروپ میں شامل کرنا نہ بھولیں تاکہ وہ لاگ فائلوں کو پڑھ سکے۔ مثال کے طور پر، سینٹوس میں nginx ایڈم گروپ کے حقوق کے ساتھ لاگز بناتا ہے۔

usermod -a -G adm vector

آئیے ویکٹر سروس شروع کریں۔

systemctl enable vector
systemctl start vector

ویکٹر لاگز کو اس طرح دیکھا جا سکتا ہے:

journalctl -f -u vector

نوشتہ جات میں اس طرح کا اندراج ہونا چاہیے۔

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

تناؤ کی جانچ

ہم اپاچی بینچ مارک کا استعمال کرتے ہوئے جانچ کرتے ہیں۔

httpd-tools پیکیج تمام سرورز پر انسٹال کیا گیا تھا۔

ہم اسکرین میں 4 مختلف سرورز سے اپاچی بینچ مارک کا استعمال کرتے ہوئے جانچ شروع کرتے ہیں۔ سب سے پہلے، ہم اسکرین ٹرمینل ملٹی پلیکسر لانچ کرتے ہیں، اور پھر ہم اپاچی بینچ مارک کا استعمال کرتے ہوئے جانچ شروع کرتے ہیں۔ اسکرین کے ساتھ کام کرنے کا طریقہ جس میں آپ تلاش کرسکتے ہیں۔ آرٹیکل.

1st سرور سے

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

2st سرور سے

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

3st سرور سے

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

4st سرور سے

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 ہے۔

اگر آپ پیرامیٹرز میں ویکٹر میں ڈیٹا کی وضاحت نہیں کرتے ہیں، تو Clickhouse Elasticsearch کے مقابلے میں 4500/857.19 = 5.24 گنا کم لیتا ہے۔

ویکٹر میں، کمپریشن فیلڈ بطور ڈیفالٹ استعمال ہوتا ہے۔

ٹیلیگرام چیٹ بذریعہ کلک ہاؤس
ٹیلیگرام چیٹ بذریعہ Elasticsearch
ٹیلیگرام چیٹ بذریعہ "نظام کا مجموعہ اور تجزیہ پیغامات"

ماخذ: www.habr.com

نیا تبصرہ شامل کریں