د خلکو لپاره د کلیک هاوس ډیټابیس، یا ایلین ټیکنالوژي

الیکسي لیزونوف، د ICB د معلوماتي ټیکنالوژۍ ریاست د لیرې پرتو خدماتو چینلونو لپاره د وړتیا مرکز مشر

د خلکو لپاره د کلیک هاوس ډیټابیس، یا ایلین ټیکنالوژي

د ELK سټیک (ElasticSearch، Logstash، Kibana) د بدیل په توګه، موږ د لاګونو لپاره د معلوماتو ذخیره کولو په توګه د ClickHouse ډیټابیس کارولو په اړه څیړنې ترسره کوو.

پدې مقاله کې موږ غواړو د کلیک هاوس ډیټابیس کارولو تجربې او د پیلوټ عملیاتو پایلو پراساس لومړني پایلو په اړه وغږیږو. دا سمدستي د یادولو وړ ده چې پایلې یې اغیزمنې وې.


د خلکو لپاره د کلیک هاوس ډیټابیس، یا ایلین ټیکنالوژي

بیا به موږ په تفصیل سره تشریح کړو چې زموږ سیسټم څنګه تنظیم شوی او کوم برخې لري. مګر اوس زه غواړم د دې ډیټابیس په اړه لږ څه وغږیږم، او ولې دا د پام وړ ارزښت لري. د ClickHouse ډیټابیس د Yandex څخه د لوړ فعالیت تحلیلي کالمر ډیټابیس دی. په Yandex خدماتو کې کارول کیږي، په پیل کې دا د Yandex.Metrica لپاره اصلي ډاټا ذخیره ده. د خلاصې سرچینې سیسټم، وړیا. د پراختیا کونکي له نظره ، زه تل حیران وم چې دوی دا څنګه پلي کوي ، ځکه چې دلته په زړه پوري لوی معلومات شتون لري. او د میټریکا کارن انٹرفیس پخپله خورا انعطاف منونکی دی او په چټکۍ سره کار کوي. کله چې تاسو لومړی د دې ډیټابیس سره آشنا شئ، تاسو دا تاثر ترلاسه کوئ: "ښه، په پای کې! د "خلکو لپاره" جوړ شوی! د نصب کولو پروسې څخه د غوښتنو لیږلو پورې.

دا ډیټابیس د ننوتلو خورا ټیټ خنډ لري. حتی یو اوسط پراختیا کونکی کولی شي دا ډیټابیس په څو دقیقو کې نصب کړي او کارول یې پیل کړي. هر څه په اسانۍ سره کار کوي. حتی هغه خلک چې لینکس ته نوي دي کولی شي په چټکۍ سره د نصب کولو سره مقابله وکړي او ساده عملیات ترسره کړي. که مخکې، کله چې د Big Data, Hadoop, Google BigTable, HDFS کلمې اوریدلې، اوسط پراختیا کونکي فکر کاوه چې دوی د ځینې ټیرابایټ، پیټابایټ په اړه خبرې کوي، چې ځینې سپر انسانان د دې سیسټمونو په ترتیب او پراختیا کې ښکیل دي، نو بیا د ClickHouse ډیټابیس راتګ موږ یو ساده، د پوهیدو وړ وسیله ترلاسه کړه چې تاسو یې کولی شئ د پخوانۍ نه منلو وړ ستونزې حل کړئ. ټول دا یو مناسب اوسط ماشین او د نصبولو لپاره پنځه دقیقې وخت نیسي. دا دی، موږ یو ډیټابیس ترلاسه کړ لکه د مثال په توګه، MySql، مګر یوازې د ملیاردونو ریکارډونو ذخیره کولو لپاره! د SQL ژبې سره یو ډول سوپر آرکیور. داسې ښکاري چې خلکو ته بهرني وسلې ورکړل شوي وي.

زموږ د لاګ راټولولو سیسټم په اړه

د معلوماتو راټولولو لپاره، د معیاري فارمیټ ویب غوښتنلیکونو IIS لاګ فایلونه کارول کیږي (موږ همدا اوس د غوښتنلیک لاګونو پارس کولو کې هم بوخت یو ، مګر په ازمایښتي مرحله کې زموږ اصلي هدف د IIS لاګونو راټولول دي).

موږ نشو کولی د مختلفو دلایلو لپاره د ELK سټیک په بشپړه توګه پریږدو، او موږ د LogStash او Filebeat اجزاوو کارولو ته دوام ورکوو، کوم چې خپل ځان ښه ثابت کړی او په خورا معتبر او اټکل سره کار کوي.

د ننوتلو عمومي سکیم په لاندې انځور کې ښودل شوی:

د خلکو لپاره د کلیک هاوس ډیټابیس، یا ایلین ټیکنالوژي

د ClickHouse ډیټابیس کې د معلوماتو ثبتولو ځانګړتیا په لویو بستونو کې د ریکارډونو بې ساري (په یوه ثانیه کې یو ځل) داخلول دي. دا، په ښکاره ډول، ترټولو "ستونزه" برخه ده چې تاسو د لومړي ځل لپاره د ClickHouse ډیټابیس سره کار کولو پر مهال ورسره مخ کیږئ: سکیم یو څه ډیر پیچلی کیږي.
د LogStash لپاره پلگ ان، کوم چې په مستقیم ډول په ClickHouse کې ډاټا داخلوي، دلته ډیره مرسته کړې. دا برخه په ورته سرور کې د ډیټابیس په څیر ځای پرځای شوي. نو، په عموم کې، دا سپارښتنه نه کیږي چې دا کار وکړي، مګر د عملي نظر څخه، نو دا چې جلا سرورونه رامینځته نه کړي پداسې حال کې چې دا په ورته سرور کې ځای پرځای شوي. موږ د ډیټابیس سره کومه ناکامي یا د سرچینو شخړه نه ده لیدلې. سربیره پردې ، دا باید په یاد ولرئ چې پلگ ان د غلطیو په صورت کې د ریټری میکانیزم لري. او د غلطیو په صورت کې، پلگ ان د ډیټا یوه بسته ډیسک ته لیکي چې نشي داخلیدلی (د فایل بڼه مناسبه ده: د ترمیم وروسته، تاسو کولی شئ په اسانۍ سره د کلک هاؤس مراجع په کارولو سره سمه بسته داخل کړئ).

په سکیم کې کارول شوي سافټویر بشپړ لیست په جدول کې وړاندې شوی:

د کارول شوي سافټویر لیست

سرلیک

شرح

د توزیع لپاره لینک

NGINX

د پورټ لخوا د لاسرسي محدودولو او د اجازې تنظیم کولو لپاره ریورس پراکسي

اوس مهال په سکیم کې نه کارول کیږي

https://nginx.org/ru/download.html

https://nginx.org/download/nginx-1.16.0.tar.gz

فایل بیټ

د فایلونو لیږد.

https://www.elastic.co/downloads/beats/filebeat (د وینډوز 64bit لپاره ویش).

https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.0-windows-x86_64.zip

LogStash

د ننوتلو راټولونکی.

د فایل بیټ څخه د لاګونو راټولولو لپاره کارول کیږي ، په بیله بیا د RabbitMQ کتار څخه د لاګونو راټولولو لپاره (د سرورونو لپاره چې په DMZ کې موقعیت لري.)

https://www.elastic.co/products/logstash

https://artifacts.elastic.co/downloads/logstash/logstash-7.0.1.rpm

Logstash- output- clickhouse

په بیچونو کې د کلیک هاوس ډیټابیس ته د لاګونو لیږدولو لپاره د Loagstash پلگ ان

https://github.com/mikechris/logstash-output-clickhouse

/usr/share/logstash/bin/logstash-plugin logstash-output-clickhouse نصب کړئ

/usr/share/logstash/bin/logstash-plugin logstash-filter-prune نصب کړئ

/usr/share/logstash/bin/logstash-plugin logstash-filter-multiline نصب کړئ

ټک هاوس

د ننوتلو ذخیره https://clickhouse.yandex/docs/ru/

https://packagecloud.io/Altinity/clickhouse/packages/el/7/clickhouse-server-19.5.3.8-1.el7.x86_64.rpm

https://packagecloud.io/Altinity/clickhouse/packages/el/7/clickhouse-client-19.5.3.8-1.el7.x86_64.rpm

نوټ. د اګست 2018 څخه پیل، د RHEL لپاره "عادي" rpm جوړونه د Yandex ذخیره کې ښکاره شوه، نو تاسو کولی شئ د دوی کارولو هڅه وکړئ. د نصب کولو په وخت کې موږ د Altinity لخوا ترتیب شوي کڅوړې کاروو.

ګرافانا

د لوګو لید. د ډشبورډونو تنظیم کول

https://grafana.com/

https://grafana.com/grafana/download

Redhat & Centos (64 Bit) - وروستۍ نسخه

د Grafana 4.6+ لپاره د هاؤس ډیټا سرچینه کلیک وکړئ

د کلیک هاوس ډیټا سرچینې سره د ګرافانا لپاره پلگ ان

https://grafana.com/plugins/vertamedia-clickhouse-datasource

https://grafana.com/api/plugins/vertamedia-clickhouse-datasource/versions/1.8.1/download

LogStash

له FileBeat څخه RabbitMQ کتار ته روټر ننوتل.

نوټ. له بده مرغه FileBeat په مستقیم ډول RabbitMQ ته محصول نلري، نو د Logstash په بڼه منځمهاله لینک ته اړتیا ده

https://www.elastic.co/products/logstash

https://artifacts.elastic.co/downloads/logstash/logstash-7.0.1.rpm

RabbitMQ

د پیغام کتار. دا په DMZ کې د لاګ ننوتلو بفر دی

https://www.rabbitmq.com/download.html

https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.14/rabbitmq-server-3.7.14-1.el7.noarch.rpm

ایرلانګ چلولو وخت (د RabbitMQ لپاره اړین دی)

ایرلنګ چلولو وخت. د RabbitMQ کار کولو لپاره اړین دی

http://www.erlang.org/download.html

https://www.rabbitmq.com/install-rpm.html#install-erlang http://www.erlang.org/downloads/21.3

د ClickHouse ډیټابیس سره د سرور ترتیب په لاندې جدول کې وړاندې کیږي:

سرلیک

ارزښت

تبصره

شکل بندي

HDD: 40GB
رام: 8GB
پروسیسر: کور 2 2GHz

تاسو باید د ClickHouse ډیټابیس کارولو لپاره لارښوونو ته پاملرنه وکړئ (https://clickhouse.yandex/docs/ru/operations/tips/)

د سیسټم پراخه سافټویر

OS: د Red Hat Enterprise Linux سرور (Maipo)

JRE (جاوا 8)

 

لکه څنګه چې تاسو لیدلی شئ، دا یو منظم کارځای دی.

د لوګو ذخیره کولو لپاره د میز جوړښت په لاندې ډول دی:

log_web.sql

CREATE TABLE log_web (
  logdate Date,
  logdatetime DateTime CODEC(Delta, LZ4HC),
   
  fld_log_file_name LowCardinality( String ),
  fld_server_name LowCardinality( String ),
  fld_app_name LowCardinality( String ),
  fld_app_module LowCardinality( String ),
  fld_website_name LowCardinality( String ),
 
  serverIP LowCardinality( String ),
  method LowCardinality( String ),
  uriStem String,
  uriQuery String,
  port UInt32,
  username LowCardinality( String ),
  clientIP String,
  clientRealIP String,
  userAgent String,
  referer String,
  response String,
  subresponse String,
  win32response String,
  timetaken UInt64
   
  , uriQuery__utm_medium String
  , uriQuery__utm_source String
  , uriQuery__utm_campaign String
  , uriQuery__utm_term String
  , uriQuery__utm_content String
  , uriQuery__yclid String
  , uriQuery__region String
 
) Engine = MergeTree()
PARTITION BY toYYYYMM(logdate)
ORDER BY (fld_app_name, fld_app_module, logdatetime)
SETTINGS index_granularity = 8192;

موږ د ویشلو (میاشتنۍ) او شاخص ګرانولریت لپاره ډیفالټ ارزښتونه کاروو. ټولې ساحې په عملي توګه د HTTP غوښتنو ثبتولو لپاره د IIS لاګ ننوتلو سره مطابقت لري. په جلا توګه، موږ یادونه کوو چې د utm ټګونو ذخیره کولو لپاره جلا ساحې شتون لري (دوی د پوښتنې سټینګ ساحې څخه میز ته د ننوتلو په مرحله کې تجزیه شوي).

همدارنګه، د سیسټمونو، برخو، او سرورونو په اړه د معلوماتو ذخیره کولو لپاره په میز کې ډیری سیسټمونه اضافه شوي. د دې ساحو د توضیح لپاره، لاندې جدول وګورئ. په یو میز کې موږ د څو سیسټمونو لپاره لاګونه ذخیره کوو.

سرلیک

شرح

بېلګه:

fld_app_name

د غوښتنلیک/سیسټم نوم
معتبر ارزښتونه:

  • site1.domain.com بهرنۍ سایټ 1
  • site2.domain.com بهرنۍ سایټ 2
  • Internal-site1.domain.local داخلي سایټ 1

site1.domain.com

fld_app_module

د سیسټم ماډل
معتبر ارزښتونه:

  • ویب - ویب پاڼه
  • svc - د ویب پاڼې ویب خدمت
  • intgr - د ویب ادغام خدمت
  • bo — مدیر (BackOffice)

ګورت

fld_website_name

په IIS کې د سایټ نوم

ډیری سیسټمونه په یو سرور کې ځای په ځای کیدی شي، یا حتی د یو سیسټم ماډل ډیری مثالونه

ویب مین

fld_server_name

د سرور نوم

web1.domain.com

fld_log_file_name

په سرور کې د لاګ فایل ته لاره

له خوا: inetpublogsLogFiles
W3SVC1u_ex190711.log

دا تاسو ته اجازه درکوي په مؤثره توګه په ګرافانا کې ګرافونه جوړ کړئ. د مثال په توګه، د یو ځانګړي سیسټم مخکینۍ پای څخه غوښتنې وګورئ. دا په Yandex.Metrica کې د سایټ کاونټر سره ورته دی.

دلته د دوو میاشتو لپاره د ډیټابیس کارولو په اړه ځینې احصایې دي.

د سیسټم او برخې لخوا د ریکارډونو شمیر

SELECT
    fld_app_name,
    fld_app_module,
    count(fld_app_name) AS rows_count
FROM log_web
GROUP BY
    fld_app_name,
    fld_app_module
    WITH TOTALS
ORDER BY
    fld_app_name ASC,
    rows_count DESC
 
┌─fld_app_name─────┬─fld_app_module─┬─rows_count─┐
│ site1.domain.ru  │ web            │     131441 │
│ site2.domain.ru  │ web            │    1751081 │
│ site3.domain.ru  │ web            │  106887543 │
│ site3.domain.ru  │ svc            │   44908603 │
│ site3.domain.ru  │ intgr          │    9813911 │
│ site4.domain.ru  │ web            │     772095 │
│ site5.domain.ru  │ web            │   17037221 │
│ site5.domain.ru  │ intgr          │     838559 │
│ site5.domain.ru  │ bo             │       7404 │
│ site6.domain.ru  │ web            │     595877 │
│ site7.domain.ru  │ web            │   27778858 │
└──────────────────┴────────────────┴────────────┘
 
Totals:
┌─fld_app_name─┬─fld_app_module─┬─rows_count─┐
│              │                │  210522593 │
└──────────────┴────────────────┴────────────┘
 
11 rows in set. Elapsed: 4.874 sec. Processed 210.52 million rows, 421.67 MB (43.19 million rows/s., 86.51 MB/s.)

د ډیسک ډیټا حجم

SELECT
    formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed,
    formatReadableSize(sum(data_compressed_bytes)) AS compressed,
    sum(rows) AS total_rows
FROM system.parts
WHERE table = 'log_web'
 
┌─uncompressed─┬─compressed─┬─total_rows─┐
│ 54.50 GiB    │ 4.86 GiB   │  211427094 │
└──────────────┴────────────┴────────────┘
 
1 rows in set. Elapsed: 0.035 sec.

د کالم ډیټا کمپریشن تناسب

SELECT
    name,
    formatReadableSize(data_uncompressed_bytes) AS uncompressed,
    formatReadableSize(data_compressed_bytes) AS compressed,
    data_uncompressed_bytes / data_compressed_bytes AS compress_ratio
FROM system.columns
WHERE table = 'log_web'
 
┌─name───────────────────┬─uncompressed─┬─compressed─┬─────compress_ratio─┐
│ logdate                │ 401.53 MiB   │ 1.80 MiB   │ 223.16665968777315 │
│ logdatetime            │ 803.06 MiB   │ 35.91 MiB  │ 22.363966401202305 │
│ fld_log_file_name      │ 220.66 MiB   │ 2.60 MiB   │  84.99905736932571 │
│ fld_server_name        │ 201.54 MiB   │ 50.63 MiB  │  3.980924816977078 │
│ fld_app_name           │ 201.17 MiB   │ 969.17 KiB │ 212.55518183686877 │
│ fld_app_module         │ 201.17 MiB   │ 968.60 KiB │ 212.67805817411906 │
│ fld_website_name       │ 201.54 MiB   │ 1.24 MiB   │  162.7204926761546 │
│ serverIP               │ 201.54 MiB   │ 50.25 MiB  │  4.010824061219731 │
│ method                 │ 201.53 MiB   │ 43.64 MiB  │  4.617721053304486 │
│ uriStem                │ 5.13 GiB     │ 832.51 MiB │  6.311522291936919 │
│ uriQuery               │ 2.58 GiB     │ 501.06 MiB │  5.269731450124478 │
│ port                   │ 803.06 MiB   │ 3.98 MiB   │ 201.91673864241824 │
│ username               │ 318.08 MiB   │ 26.93 MiB  │ 11.812513794583598 │
│ clientIP               │ 2.35 GiB     │ 82.59 MiB  │ 29.132328640073343 │
│ clientRealIP           │ 2.49 GiB     │ 465.05 MiB │  5.478382297052563 │
│ userAgent              │ 18.34 GiB    │ 764.08 MiB │  24.57905114484208 │
│ referer                │ 14.71 GiB    │ 1.37 GiB   │ 10.736792723669906 │
│ response               │ 803.06 MiB   │ 83.81 MiB  │  9.582334090987247 │
│ subresponse            │ 399.87 MiB   │ 1.83 MiB   │  218.4831068635027 │
│ win32response          │ 407.86 MiB   │ 7.41 MiB   │ 55.050315514606815 │
│ timetaken              │ 1.57 GiB     │ 402.06 MiB │ 3.9947395692010637 │
│ uriQuery__utm_medium   │ 208.17 MiB   │ 12.29 MiB  │ 16.936148912472955 │
│ uriQuery__utm_source   │ 215.18 MiB   │ 13.00 MiB  │ 16.548367623199912 │
│ uriQuery__utm_campaign │ 381.46 MiB   │ 37.94 MiB  │ 10.055156353418509 │
│ uriQuery__utm_term     │ 231.82 MiB   │ 10.78 MiB  │ 21.502540454070672 │
│ uriQuery__utm_content  │ 441.34 MiB   │ 87.60 MiB  │  5.038260760449327 │
│ uriQuery__yclid        │ 216.88 MiB   │ 16.58 MiB  │  13.07721335008116 │
│ uriQuery__region       │ 204.35 MiB   │ 9.49 MiB   │  21.52661903446796 │
└────────────────────────┴──────────────┴────────────┴────────────────────┘
 
28 rows in set. Elapsed: 0.005 sec.

د کارول شویو اجزاوو توضیحات

فایل بیټ. د دوتنې لوګو لیږدول

دا برخه په ډیسک کې د لاګ فایلونو بدلونونو څارنه کوي او معلومات LogStash ته لیږدوي. په ټولو سرورونو کې نصب شوی چیرې چې د لاګ فایلونه لیکل شوي (معمولا IIS). په دم حالت کې کار کوي (د بیلګې په توګه ، دا یوازې فایل ته اضافه شوي ریکارډونه لیږدوي). مګر تاسو کولی شئ دا په جلا توګه د ټولو فایلونو لیږدولو لپاره تنظیم کړئ. دا مناسب دی کله چې تاسو د تیرو میاشتو لپاره ډیټا ډاونلوډ کولو ته اړتیا لرئ. یوازې د لاګ فایل په فولډر کې وساتئ او دا به په بشپړ ډول لوستل شي.

کله چې خدمت ودریږي ، ډیټا نور ذخیره ته لیږدول کیږي.

د نمونې ترتیب داسې ښکاري:

filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - C:/inetpub/logs/LogFiles/W3SVC1/*.log
  exclude_files: ['.gz$','.zip$']
  tail_files: true
  ignore_older: 24h
  fields:
    fld_server_name: "site1.domain.ru"
    fld_app_name: "site1.domain.ru"
    fld_app_module: "web"
    fld_website_name: "web-main"
 
- type: log
  enabled: true
  paths:
    - C:/inetpub/logs/LogFiles/__Import/access_log-*
  exclude_files: ['.gz$','.zip$']
  tail_files: false
  fields:
    fld_server_name: "site2.domain.ru"
    fld_app_name: "site2.domain.ru"
    fld_app_module: "web"
    fld_website_name: "web-main"
    fld_logformat: "logformat__apache"
 
 
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
  reload.period: 2s
 
output.logstash:
  hosts: ["log.domain.com:5044"]
 
  ssl.enabled: true
  ssl.certificate_authorities: ["C:/filebeat/certs/ca.pem", "C:/filebeat/certs/ca-issuing.pem"]
  ssl.certificate: "C:/filebeat/certs/site1.domain.ru.cer"
  ssl.key: "C:/filebeat/certs/site1.domain.ru.key"
 
#================================ Processors =====================================
 
processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~

LogStash. د ننوتلو راټولونکی

دا برخه د فایل بیټ (یا د RabbitMQ کتار له لارې) څخه د لاګ ریکارډونو ترلاسه کولو لپاره ډیزاین شوې ، د کلیک هاوس ډیټابیس کې یې په بیچونو کې پارس او دننه کړئ.

ClickHouse ته د ننوتلو لپاره، د Logstash-output-clickhouse پلگ ان وکاروئ. د Logstash پلگ ان د غوښتنو بیرته اخیستلو لپاره میکانیزم لري، مګر د منظم بند په جریان کې، دا غوره ده چې پخپله خدمت ودروي. کله چې ودرول شي ، پیغامونه به د RabbitMQ په کتار کې راټول شي ، نو که چیرې تمځای د اوږدې مودې لپاره وي ، نو دا به غوره وي چې په سرورونو کې د فایل بیټس ودرول شي. په یوه سکیم کې چیرې چې RabbitMQ نه کارول کیږي (په سیمه ایز شبکه کې فایل بیټ مستقیم لوګسټاش ته لاګونه لیږي) ، فایل بیټس خورا د منلو وړ او خوندي کار کوي ، نو د دوی لپاره د محصول نشتوالی هیڅ پایلې نلري.

د نمونې ترتیب داسې ښکاري:

log_web__filebeat_clickhouse.conf

input {
 
    beats {
        port => 5044
        type => 'iis'
        ssl => true
        ssl_certificate_authorities => ["/etc/logstash/certs/ca.cer", "/etc/logstash/certs/ca-issuing.cer"]
        ssl_certificate => "/etc/logstash/certs/server.cer"
        ssl_key => "/etc/logstash/certs/server-pkcs8.key"
        ssl_verify_mode => "peer"
 
            add_field => {
                "fld_server_name" => "%{[fields][fld_server_name]}"
                "fld_app_name" => "%{[fields][fld_app_name]}"
                "fld_app_module" => "%{[fields][fld_app_module]}"
                "fld_website_name" => "%{[fields][fld_website_name]}"
                "fld_log_file_name" => "%{source}"
                "fld_logformat" => "%{[fields][fld_logformat]}"
            }
    }
 
    rabbitmq {
        host => "queue.domain.com"
        port => 5671
        user => "q-reader"
        password => "password"
        queue => "web_log"
        heartbeat => 30
        durable => true
        ssl => true
        #ssl_certificate_path => "/etc/logstash/certs/server.p12"
        #ssl_certificate_password => "password"
 
        add_field => {
            "fld_server_name" => "%{[fields][fld_server_name]}"
            "fld_app_name" => "%{[fields][fld_app_name]}"
            "fld_app_module" => "%{[fields][fld_app_module]}"
            "fld_website_name" => "%{[fields][fld_website_name]}"
            "fld_log_file_name" => "%{source}"
            "fld_logformat" => "%{[fields][fld_logformat]}"
        }
    }
 
}
 
filter { 
 
      if [message] =~ "^#" {
        drop {}
      }
 
      if [fld_logformat] == "logformat__iis_with_xrealip" {
     
          grok {
            match => ["message", "%{TIMESTAMP_ISO8601:log_timestamp} %{IP:serverIP} %{WORD:method} %{NOTSPACE:uriStem} %{NOTSPACE:uriQuery} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clientIP} %{NOTSPACE:userAgent} %{NOTSPACE:referer} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:win32response} %{NUMBER:timetaken} %{NOTSPACE:xrealIP} %{NOTSPACE:xforwarderfor}"]
          }
      } else {
   
          grok {
             match => ["message", "%{TIMESTAMP_ISO8601:log_timestamp} %{IP:serverIP} %{WORD:method} %{NOTSPACE:uriStem} %{NOTSPACE:uriQuery} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clientIP} %{NOTSPACE:userAgent} %{NOTSPACE:referer} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:win32response} %{NUMBER:timetaken}"]
          }
 
      }
 
      date {
        match => [ "log_timestamp", "YYYY-MM-dd HH:mm:ss" ]
          timezone => "Etc/UTC"
        remove_field => [ "log_timestamp", "@timestamp" ]
        target => [ "log_timestamp2" ]
      }
 
        ruby {
            code => "tstamp = event.get('log_timestamp2').to_i
                        event.set('logdatetime', Time.at(tstamp).strftime('%Y-%m-%d %H:%M:%S'))
                        event.set('logdate', Time.at(tstamp).strftime('%Y-%m-%d'))"
        }
 
      if [bytesSent] {
        ruby {
          code => "event['kilobytesSent'] = event['bytesSent'].to_i / 1024.0"
        }
      }
 
 
      if [bytesReceived] {
        ruby {
          code => "event['kilobytesReceived'] = event['bytesReceived'].to_i / 1024.0"
        }
      }
 
   
        ruby {
            code => "event.set('clientRealIP', event.get('clientIP'))"
        }
        if [xrealIP] {
            ruby {
                code => "event.set('clientRealIP', event.get('xrealIP'))"
            }
        }
        if [xforwarderfor] {
            ruby {
                code => "event.set('clientRealIP', event.get('xforwarderfor'))"
            }
        }
 
      mutate {
        convert => ["bytesSent", "integer"]
        convert => ["bytesReceived", "integer"]
        convert => ["timetaken", "integer"] 
        convert => ["port", "integer"]
 
        add_field => {
            "clientHostname" => "%{clientIP}"
        }
      }
 
        useragent {
            source=> "useragent"
            prefix=> "browser"
        }
 
        kv {
            source => "uriQuery"
            prefix => "uriQuery__"
            allow_duplicate_values => false
            field_split => "&"
            include_keys => [ "utm_medium", "utm_source", "utm_campaign", "utm_term", "utm_content", "yclid", "region" ]
        }
 
        mutate {
            join => { "uriQuery__utm_source" => "," }
            join => { "uriQuery__utm_medium" => "," }
            join => { "uriQuery__utm_campaign" => "," }
            join => { "uriQuery__utm_term" => "," }
            join => { "uriQuery__utm_content" => "," }
            join => { "uriQuery__yclid" => "," }
            join => { "uriQuery__region" => "," }
        }
 
}
 
output { 
  #stdout {codec => rubydebug}
    clickhouse {
      headers => ["Authorization", "Basic abcdsfks..."]
      http_hosts => ["http://127.0.0.1:8123"]
      save_dir => "/etc/logstash/tmp"
      table => "log_web"
      request_tolerance => 1
      flush_size => 10000
      idle_flush_time => 1
        mutations => {
            "fld_log_file_name" => "fld_log_file_name"
            "fld_server_name" => "fld_server_name"
            "fld_app_name" => "fld_app_name"
            "fld_app_module" => "fld_app_module"
            "fld_website_name" => "fld_website_name"
 
            "logdatetime" => "logdatetime"
            "logdate" => "logdate"
            "serverIP" => "serverIP"
            "method" => "method"
            "uriStem" => "uriStem"
            "uriQuery" => "uriQuery"
            "port" => "port"
            "username" => "username"
            "clientIP" => "clientIP"
            "clientRealIP" => "clientRealIP"
            "userAgent" => "userAgent"
            "referer" => "referer"
            "response" => "response"
            "subresponse" => "subresponse"
            "win32response" => "win32response"
            "timetaken" => "timetaken"
             
            "uriQuery__utm_medium" => "uriQuery__utm_medium"
            "uriQuery__utm_source" => "uriQuery__utm_source"
            "uriQuery__utm_campaign" => "uriQuery__utm_campaign"
            "uriQuery__utm_term" => "uriQuery__utm_term"
            "uriQuery__utm_content" => "uriQuery__utm_content"
            "uriQuery__yclid" => "uriQuery__yclid"
            "uriQuery__region" => "uriQuery__region"
        }
    }
 
}

pipelines.yml

# This file is where you define your pipelines. You can define multiple.
# For more information on multiple pipelines, see the documentation:
#   https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
 
- pipeline.id: log_web__filebeat_clickhouse
  path.config: "/etc/logstash/log_web__filebeat_clickhouse.conf"

کلیک هاوس. د ننوتلو ذخیره

د ټولو سیسټمونو logs په یوه جدول کې خوندي شوي (د مقالې په پیل کې وګورئ). دا د غوښتنو په اړه د معلوماتو ذخیره کولو لپاره ډیزاین شوی: ټول پیرامیټونه د مختلف فارمیټونو لپاره ورته دي، د بیلګې په توګه د IIS لاګ، اپاچي او نګینکس لاګ. د غوښتنلیک لاګونو لپاره چې د مثال په توګه ، غلطۍ ، د معلوماتو پیغامونه ، اخطارونه ثبت شوي ، یو جلا جدول به د مناسب جوړښت سره چمتو شي (اوس مهال د ډیزاین مرحله کې).

کله چې د میز ډیزاین کول، دا خورا مهم دي چې د لومړني کیلي په اړه پریکړه وکړئ (د کوم له مخې به ډاټا د ذخیره کولو پرمهال ترتیب شي). د ډیټا کمپریشن درجې او د پوښتنې سرعت پدې پورې اړه لري. زموږ په مثال کې، کلیدي ده
امر وکړئ (fld_app_name, fld_app_module, logdatetime)
دا د سیسټم په نوم، د سیسټم برخې نوم او د پیښې نیټه ده. په پیل کې، د پیښې نیټه لومړی راغله. وروستی ځای ته د لیږدولو وروسته، پوښتنو نږدې دوه چنده چټک کار پیل کړ. د لومړني کیلي بدلول به د میز بیا رامینځته کولو او د ډیټا بیا پورته کولو ته اړتیا ولري ترڅو کلیک هاوس به په ډیسک کې ډاټا بیا تنظیم کړي. دا یو ستونزمن عملیات دی، نو دا مشوره ورکول کیږي چې مخکې له مخکې په احتیاط سره فکر وکړئ چې د ترتیب کولو کیلي کې باید څه شامل وي.

دا هم باید په یاد ولرئ چې د ټیټ کارډینالیت ډیټا ډول په نسبتا وروستیو نسخو کې څرګند شوی. کله چې دا کاروئ، د کمپریس شوي ډاټا اندازه د هغو ساحو لپاره په چټکۍ سره کمه شوې چې ټیټ کارتینالیټي لري (څو اختیارونه).

موږ اوس مهال 19.6 نسخه کاروو او موږ پلان لرو چې وروستي نسخې ته د تازه کولو هڅه وکړو. دوی داسې په زړه پوري ب featuresې لري لکه د تطبیق وړ ګرانولریت ، د وتلو شاخصونه او د ډبل ډیلټا کوډیک ، د مثال په توګه.

د ډیفالټ په واسطه، د نصب کولو په جریان کې د ترتیب کولو د ننوتلو کچه د تعقیب لپاره ټاکل شوې. لاګونه ګرځول شوي او آرشیف شوي ، مګر په ورته وخت کې دوی تر ګیګابایټ پورې پراخیږي. که اړتیا نه وي، نو تاسو کولی شئ د خبرتیا کچه وټاکئ، نو د لاګ اندازه به په چټکۍ سره راټیټ شي. د ننوتلو ترتیبات په config.xml فایل کې مشخص شوي:

<!-- Possible levels: https://github.com/pocoproject/poco/blob/develop/Foundation/include/Poco/Logger. h#L105 -->
<level>warning</level>

ځینې ​​ګټور حکمونه

Поскольку оригинальные пакеты установки собираются по Debian, то для других версий Linux необходимо использовать пакеты собранные компанией Altinity.
 
Вот по этой ссылке есть инструкции с ссылками на их репозиторий: https://www.altinity.com/blog/2017/12/18/logstash-with-clickhouse
sudo yum search clickhouse-server
sudo yum install clickhouse-server.noarch
  
1. проверка статуса
sudo systemctl status clickhouse-server
 
2. остановка сервера
sudo systemctl stop clickhouse-server
 
3. запуск сервера
sudo systemctl start clickhouse-server
 
Запуск для выполнения запросов в многострочном режиме (выполнение после знака ";")
clickhouse-client --multiline
clickhouse-client --multiline --host 127.0.0.1 --password pa55w0rd
clickhouse-client --multiline --host 127.0.0.1 --port 9440 --secure --user default --password pa55w0rd
 
Плагин кликлауза для логстеш в случае ошибки в одной строке сохраняет всю пачку в файл /tmp/log_web_failed.json
Можно вручную исправить этот файл и попробовать залить его в БД вручную:
clickhouse-client --host 127.0.0.1 --password password --query="INSERT INTO log_web FORMAT JSONEachRow" < /tmp/log_web_failed__fixed.json
 
sudo mv /etc/logstash/tmp/log_web_failed.json /etc/logstash/tmp/log_web_failed__fixed.json
sudo chown user_dev /etc/logstash/tmp/log_web_failed__fixed.json
sudo clickhouse-client --host 127.0.0.1 --password password --query="INSERT INTO log_web FORMAT JSONEachRow" < /etc/logstash/tmp/log_web_failed__fixed.json
sudo mv /etc/logstash/tmp/log_web_failed__fixed.json /etc/logstash/tmp/log_web_failed__fixed_.json
 
выход из командной строки
quit;
## Настройка TLS
https://www.altinity.com/blog/2019/3/5/clickhouse-networking-part-2
 
openssl s_client -connect log.domain.com:9440 < /dev/null

LogStash. له FileBeat څخه RabbitMQ کتار ته روټر ننوتل

دا برخه د FileBeat څخه د RabbitMQ کتار ته د راوتلو لاګونو لپاره کارول کیږي. دلته دوه ټکي شتون لري:

  1. له بده مرغه، FileBeat مستقیم RabbitMQ ته د لیکلو لپاره د محصول پلگ ان نلري. او دا ډول فعالیت، د دوی په ګیتوب کې د پوست لخوا قضاوت کول، د پلي کولو لپاره پالن شوي ندي. د کافکا لپاره یو پلگ ان شتون لري، مګر د ځینو دلیلونو لپاره موږ نشو کولی دا پخپله وکاروو.
  2. په DMZ کې د لاګونو راټولولو لپاره اړتیاوې شتون لري. د دوی پر بنسټ، لاګونه باید لومړی په قطار کې وي او بیا LogStash په بهر کې د قطار څخه ریکارډونه لولي.

له همدې امله ، په ځانګړي توګه د سرورونو قضیې لپاره چې په DMZ کې موقعیت لري ، دا اړینه ده چې دا یو څه پیچلي سکیم وکاروئ. د نمونې ترتیب داسې ښکاري:

iis_w3c_logs__filebeat_rabbitmq.conf

input {
 
    beats {
        port => 5044
        type => 'iis'
        ssl => true
        ssl_certificate_authorities => ["/etc/pki/tls/certs/app/ca.pem", "/etc/pki/tls/certs/app/ca-issuing.pem"]
        ssl_certificate => "/etc/pki/tls/certs/app/queue.domain.com.cer"
        ssl_key => "/etc/pki/tls/certs/app/queue.domain.com-pkcs8.key"
        ssl_verify_mode => "peer"
    }
 
}
 
output { 
  #stdout {codec => rubydebug}
 
    rabbitmq {
        host => "127.0.0.1"
        port => 5672
        exchange => "monitor.direct"
        exchange_type => "direct"
        key => "%{[fields][fld_app_name]}"
        user => "q-writer"
        password => "password"
        ssl => false
    }
}

RabbitMQ. د پیغام کتار

دا برخه په DMZ کې د ننوتنو بفر کولو لپاره کارول کیږي. ثبت کول د Filebeat → LogStash لینک له لارې ترسره کیږي. لوستل د LogStash له لارې د DMZ بهر څخه ترسره کیږي. کله چې د RabbitMQ له لارې کار کوي، په هره ثانیه کې شاوخوا 4 زره پیغامونه پروسس کیږي.

د پیغام روټینګ د سیسټم نوم لخوا ترتیب شوی، د بیلګې په توګه، د FileBeat ترتیب ډاټا پراساس. ټول پیغامونه په یوه کتار کې ځي. که د کوم دلیل لپاره د قطار خدمت ودرول شي ، نو دا به د پیغام له لاسه ورکولو لامل نشي: فایل بیټس به د پیوستون غلطۍ ترلاسه کړي او په لنډمهاله توګه به لیږل ودروي. او LogStash، چې له کتار څخه لوستل کیږي، د شبکې تېروتنې به هم ترلاسه کړي او د پیوستون بیا رغولو ته انتظار وکړي. په دې حالت کې، البته، ډاټا به نور ډیټابیس ته ونه لیکل شي.

لاندې لارښوونې د قطارونو جوړولو او تنظیم کولو لپاره کارول کیږي:

sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin declare exchange --vhost=/ name=monitor.direct type=direct sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin declare queue --vhost=/ name=web_log durable=true
sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin --vhost="/" declare binding source="monitor.direct" destination_type="queue" destination="web_log" routing_key="site1.domain.ru"
sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin --vhost="/" declare binding source="monitor.direct" destination_type="queue" destination="web_log" routing_key="site2.domain.ru"

ګرافانا. ډشبورډونه

دا برخه د څارنې ډاټا لیدلو لپاره کارول کیږي. پدې حالت کې ، تاسو اړتیا لرئ د ګرافانا 4.6+ پلگ ان لپاره د کلیک هاوس ډیټا سرچینه نصب کړئ. موږ باید دا په ډشبورډ کې د SQL فلټرونو پروسس کولو موثریت ته وده ورکولو لپاره یو څه ټیک کړو.

د مثال په توګه، موږ متغیرونه کاروو، او که دوی د فلټر په ساحه کې مشخص شوي نه وي، نو موږ غواړو چې د فورمې په ځای کې داسې حالت رامینځته نه کړو (uriStem = "AND uriStem! = "). په دې حالت کې، ClickHouse به د uriStem کالم ولولي. نو، موږ مختلف انتخابونه هڅه وکړه او په پای کې یې فلګ ($valueIfEmpty میکرو) د خالي ارزښت په صورت کې د 1 بیرته راستنیدو لپاره فکس کړ، پرته له دې چې پخپله کالم ذکر کړي.

او اوس تاسو کولی شئ دا پوښتنه د ګراف لپاره وکاروئ

$columns(response, count(*) c) from $table where $adhoc
and $valueIfEmpty($fld_app_name, 1, fld_app_name = '$fld_app_name')
and $valueIfEmpty($fld_app_module, 1, fld_app_module = '$fld_app_module') and $valueIfEmpty($fld_server_name, 1, fld_server_name = '$fld_server_name') and $valueIfEmpty($uriStem, 1, uriStem like '%$uriStem%')
and $valueIfEmpty($clientRealIP, 1, clientRealIP = '$clientRealIP')

کوم چې د دې په څیر SQL ته بدل شوی (یادونه وکړئ چې د uriStem خالي ساحې یوازې 1 ته بدل شوي)

SELECT
t,
groupArray((response, c)) AS groupArr
FROM (
SELECT
(intDiv(toUInt32(logdatetime), 60) * 60) * 1000 AS t, response,
count(*) AS c FROM default.log_web
WHERE (logdate >= toDate(1565061982)) AND (logdatetime >= toDateTime(1565061982)) AND 1 AND (fld_app_name = 'site1.domain.ru') AND (fld_app_module = 'web') AND 1 AND 1 AND 1
GROUP BY
t, response
ORDER BY
t ASC,
response ASC
)
GROUP BY t ORDER BY t ASC

پایلې

د کلک هاؤس ډیټابیس څرګندیدل په بازار کې د پام وړ پیښه ګرځیدلې. دا تصور کول ګران وو چې په یوه فوري کې، په بشپړه توګه وړیا، موږ د لویو معلوماتو سره کار کولو لپاره د ځواکمن او عملي وسیلې سره وسله وال یو. البته، لکه څنګه چې اړتیاوې زیاتیږي (د بیلګې په توګه، ډیری سرورونو ته شارډینګ او نقل کول)، سکیم به ډیر پیچلی شي. مګر د لومړي تاثیراتو له مخې، د دې ډیټابیس سره کار کول خورا خوندور دي. دا روښانه ده چې محصول د "خلکو لپاره" جوړ شوی.

د ElasticSearch په پرتله، د لاګونو ذخیره کولو او پروسس کولو لګښت، د لومړنیو اټکلونو سره سم، له پنځو څخه تر لسو ځله کم شوی. په بل عبارت، که د ډیټا اوسني حجم لپاره موږ باید د څو ماشینونو کلستر جوړ کړو، نو کله چې د ClickHouse کاروئ موږ یوازې یو ټیټ بریښنا ماشین ته اړتیا لرو. هو، البته، ElasticSearch د ډیسک ډیټا کمپریشن میکانیزمونه او نور ځانګړتیاوې هم لري چې کولی شي د پام وړ د سرچینو مصرف کم کړي، مګر د ClickHouse په پرتله دا به ډیر لګښتونو ته اړتیا ولري.

زموږ په برخه کې د کوم ځانګړي اصلاح کولو پرته ، د ډیفالټ ترتیباتو سره ، د ډیټابیس څخه د ډیټا بار کول او بیرته ترلاسه کول په حیرانونکي سرعت سره کار کوي. موږ لاهم ډیر معلومات نلرو (شاوخوا 200 ملیون ریکارډونه)، مګر سرور پخپله کمزوری دی. موږ ممکن دا وسیله په راتلونکي کې د نورو موخو لپاره وکاروو چې د لاګونو ذخیره کولو پورې اړه نلري. د مثال په توګه، د پای څخه تر پایه تحلیلونو لپاره، د امنیت په برخه کې، د ماشین زده کړه.

په پای کې، د ګټو او زیانونو په اړه لږ څه.

Минусы

  1. په لویو بستونو کې ریکارډونه پورته کول. له یوې خوا، دا یو ځانګړتیا ده، مګر تاسو لاهم باید د بفر ریکارډونو لپاره اضافي برخې وکاروئ. دا کار تل ساده نه دی، مګر بیا هم د حل وړ دی. او زه غواړم سکیم ساده کړم.
  2. ځینې ​​بهرني فعالیت یا نوي ځانګړتیاوې اکثرا په نوي نسخو کې ماتیږي. دا اندیښنې راپورته کوي، نوي نسخه ته د لوړولو لیوالتیا کموي. د مثال په توګه، د کافکا جدول انجن یو خورا ګټور خصوصیت دی چې تاسو ته اجازه درکوي په مستقیم ډول د کافکا څخه پیښې ولولئ، پرته له دې چې مصرف کونکي پلي کړي. مګر په ګیتوب کې د مسلو شمیر سره قضاوت کول ، موږ لاهم په تولید کې د دې انجن کارولو څخه محتاط یو. په هرصورت، که تاسو غاړې ته ناڅاپه حرکت نه کوئ او بنسټیز فعالیت وکاروئ، نو دا په ثابت ډول کار کوي.

Плюсы

  1. سست نه کوي.
  2. د ننوتلو ټیټ حد.
  3. خلاص سرچینه.
  4. وړيا.
  5. د توزیع وړ (شیډینګ/د بکس څخه بهر نقل)
  6. د مخابراتو وزارت لخوا وړاندیز شوي د روسی سافټویر په راجستر کې شامل دي.
  7. د Yandex څخه د رسمي ملاتړ شتون.

سرچینه: www.habr.com

Add a comment