Махзани маълумоти ClickHouse барои одамон ё технологияҳои бегона

Алексей Лизунов, роҳбари Маркази салоҳият оид ба каналҳои хидматрасонии дурдасти Раёсати технологияҳои иттилоотии КМБ

Махзани маълумоти ClickHouse барои одамон ё технологияҳои бегона

Ҳамчун алтернатива ба стеки ELK (ElasticSearch, Logstash, Kibana), мо оид ба истифодаи махзани ClickHouse ҳамчун мағозаи маълумот барои гузоришҳо тадқиқот гузаронем.

Дар ин мақола мо мехоҳем дар бораи таҷрибаи худ оид ба истифодаи базаи ClickHouse ва натиҷаҳои пешакии амалиёти озмоишӣ сӯҳбат кунем. Дарҳол бояд қайд кард, ки натиҷаҳо таъсирбахш буданд.


Махзани маълумоти ClickHouse барои одамон ё технологияҳои бегона

Минбаъд, мо муфассалтар шарҳ медиҳем, ки системаи мо чӣ гуна танзим карда шудааст ва он аз кадом ҷузъҳо иборат аст. Аммо ҳоло ман мехостам каме дар бораи ин базаи маълумот дар маҷмӯъ сӯҳбат кунам ва чаро ба он таваҷҷӯҳ кардан лозим аст. Махзани маълумотҳои ClickHouse як махзани сутуни таҳлилии баландсифат аз Яндекс мебошад. Он дар хидматҳои Яндекс истифода мешавад, дар аввал он захираи асосии маълумот барои Yandex.Metrica мебошад. Системаи кушодаасос, ройгон. Аз нуқтаи назари таҳиягар, ман ҳамеша дар ҳайрат будам, ки онҳо онро чӣ гуна амалӣ кардаанд, зеро маълумотҳои бениҳоят калон мавҷуданд. Ва худи интерфейси корбарии Metrica хеле фасеҳ ва зуд аст. Дар аввалин шиносой бо ин база чунин таассурот пайдо мешавад: «Хайр, нихоят! Барои мардум сохта шудааст! Аз раванди насбкунӣ сар карда, бо фиристодани дархостҳо анҷом меёбад.

Ин пойгоҳи додаҳо ҳадди ниҳоии вурудро дорад. Ҳатто як таҳиягари миёнаи моҳир метавонад ин базаро дар тӯли чанд дақиқа насб кунад ва ба истифода аз он оғоз кунад. Ҳама чиз равшан кор мекунад. Ҳатто одамоне, ки дар Linux нав ҳастанд, метавонанд насбро зуд идора кунанд ва соддатарин амалҳоро иҷро кунанд. Агар пештар бо калимаҳои Big Data, Hadoop, Google BigTable, HDFS, як таҳиягари оддӣ фикр мекард, ки сухан дар бораи чанд терабайт, петабайтҳо меравад, ки баъзе одамизод бо танзим ва таҳияи ин системаҳо машғуланд, пас бо пайдоиши ClickHouse базаи маълумот, мо як асбоби оддӣ ва фаҳмо гирифтем, ки шумо метавонед як қатор вазифаҳои қаблан дастнорасро ҳал кунед. Барои насб кардани он танҳо як мошини хеле миёна ва панҷ дақиқа вақт лозим аст. Ин аст, ки мо чунин пойгоҳи додаҳоро ба мисли MySql гирифтем, аммо танҳо барои нигоҳ доштани миллиардҳо сабтҳо! Як супер-архивер бо забони SQL. Ин мисли он аст, ки ба одамон силоҳи бегонагон дода шуд.

Дар бораи системаи бақайдгирии мо

Барои ҷамъоварии маълумот, файлҳои сабти IIS-и веб-барномаҳои формати стандартӣ истифода мешаванд (мо ҳоло ҳам гузоришҳои барномаҳоро таҳлил карда истодаем, аммо ҳадафи асосӣ дар марҳилаи озмоишӣ ҷамъоварии гузоришҳои IIS мебошад).

Бо сабабҳои гуногун, мо натавонистем аз стеки ELK комилан даст кашем ва мо истифода бурдани ҷузъҳои LogStash ва Filebeat -ро идома медиҳем, ки худро хуб собит кардаанд ва комилан боэътимод ва пешгӯинашаванда кор мекунанд.

Нақшаи умумии бақайдгирӣ дар расми зерин нишон дода шудааст:

Махзани маълумоти ClickHouse барои одамон ё технологияҳои бегона

Хусусияти навиштани маълумот ба махзани ClickHouse кам-кам (як маротиба дар як сония) ворид кардани сабтҳо дар дастаҳои калон мебошад. Ин, аз афташ, қисми аз ҳама "мушкил" аст, ки шумо ҳангоми бори аввал кор бо пойгоҳи додаҳои ClickHouse дучор мешавед: схема каме мураккабтар мешавад.
Васлкунаки LogStash, ки бевосита ба ClickHouse маълумот ворид мекунад, дар ин ҷо бисёр кӯмак кард. Ин ҷузъ дар ҳамон сервер бо худи пойгоҳи додаҳо ҷойгир карда мешавад. Ҳамин тавр, дар маҷмӯъ, тавсия дода намешавад, ки ин корро анҷом диҳед, балки аз нуқтаи назари амалӣ, то ҳангоми ҷойгиркунии он дар як сервер серверҳои алоҳида тавлид нашаванд. Мо ягон нокомӣ ё ихтилофи захираҳоро бо пойгоҳи додаҳо мушоҳида накардем. Илова бар ин, бояд қайд кард, ки плагин дар сурати хатогиҳо механизми такрорӣ дорад. Ва дар сурати хатогиҳо, плагин ба диск маҷмӯи маълумотеро менависад, ки ворид кардан ғайриимкон аст (формати файл қулай аст: пас аз таҳрир шумо метавонед бо истифода аз clickhouse-client партияи ислоҳшударо ба осонӣ ворид кунед).

Рӯйхати пурраи нармафзоре, ки дар нақша истифода мешаванд, дар ҷадвал оварда шудаанд:

Рӯйхати нармафзори истифодашуда

Title

Шарҳи

Пайванди тақсимот

NGINX

Reverse-proxy барои маҳдуд кардани дастрасӣ ба портҳо ва ташкили иҷозат

Дар айни замон дар схема истифода намешавад

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

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

FileBeat

Интиқоли сабтҳои файл.

https://www.elastic.co/downloads/beats/filebeat (маҷмӯаи паҳнкунӣ барои Windows 64bit).

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

logstash

Ҷамъоварии сабт.

Барои ҷамъоварии гузоришҳо аз FileBeat ва инчунин барои ҷамъоварии гузоришҳо аз навбати RabbitMQ (барои серверҳое, ки дар DMZ ҳастанд) истифода мешавад.

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

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

Logstash-output-clickhouse

Васлкунаки Loagstash барои интиқоли гузоришҳо ба пойгоҳи додаҳои ClickHouse дар гурӯҳҳо

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 пайдо шуд, бинобар ин шумо метавонед онҳоро истифода баред. Ҳангоми насб, мо бастаҳоеро истифода мебурдем, ки аз ҷониби Altinity сохта шудааст.

Графана

Визуализатсияи сабт. Танзими панелҳои идоракунӣ

https://grafana.com/

https://grafana.com/grafana/download

Redhat & Centos (64 Bit) - версияи охирин

Манбаи маълумоти ClickHouse барои Grafana 4.6+

Васлкунак барои Grafana бо манбаи маълумоти ClickHouse

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

Харгӯш

навбати паём. Ин буфери сабт дар 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

Erlang Runtime (барои RabbitMQ лозим аст)

Вақти иҷроиши Erlang. Барои кор кардан RabbitMQ лозим аст

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

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

Конфигуратсияи сервер бо базаи ClickHouse дар ҷадвали зерин оварда шудааст:

Title

арзиши

эрод гирифтан

Танзимот

HDD: 40 ГБ
RAM: 8GB
Протсессор: Core 2 2Ghz

Ба маслиҳатҳо оид ба корбарии базаи ClickHouse диққат додан лозим аст (https://clickhouse.yandex/docs/ru/operations/tips/)

Нармафзори умумии система

OS: Red Hat Enterprise Linux Server (Maipo)

JRE (Java 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;

Мо тақсимоти пешфарз (аз рӯи моҳ) ва гранулярии индексро истифода мебарем. Ҳама майдонҳо амалан ба сабтҳои журнали IIS барои сабти дархостҳои http мувофиқанд. Алоҳида, мо қайд мекунем, ки барои нигоҳ доштани utm-тегҳо майдонҳои алоҳида мавҷуданд (онҳо дар марҳилаи ворид кардан ба ҷадвал аз майдони сатри дархост таҳлил карда мешаванд).

Инчунин, якчанд майдонҳои системавӣ ба ҷадвал барои нигоҳ доштани маълумот дар бораи системаҳо, ҷузъҳо ва серверҳо илова карда шудаанд. Барои тавсифи ин майдонҳо ба ҷадвали зер нигаред. Дар як ҷадвал мо гузоришҳоро барои якчанд система нигоҳ медорем.

Title

Шарҳи

Мисол

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 - Admin (BackOffice)

Веб

fld_website_name

Номи сайт дар IIS

Якчанд системаҳо метавонанд дар як сервер ҷойгир карда шаванд, ё ҳатто якчанд мисолҳои як модули система

асосии веб

fld_server_name

Номи сервер

web1.domain.com

fld_log_file_name

Роҳ ба файли сабт дар сервер

C: inetpublogsLogFiles
W3SVC1u_ex190711.log

Ин ба шумо имкон медиҳад, ки графикҳоро дар Grafana самаранок созед. Масалан, дидани дархостҳо аз пешинаи системаи мушаххас. Ин ба ҳисобкунаки сайт дар 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.

Тавсифи ҷузъҳои истифодашуда

filebeat. Интиқоли сабтҳои файл

Ин ҷузъ тағиротро дар файлҳои сабти диск пайгирӣ мекунад ва маълумотро ба 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. Ҷамъоварии сабт

Ин ҷузъ барои қабули сабтҳои гузориш аз FileBeat (ё тавассути навбати RabbitMQ), таҳлил ва ворид кардани партияҳо ба пойгоҳи додаҳои ClickHouse тарҳрезӣ шудааст.

Барои ворид кардан ба ClickHouse, плагини Logstash-output-clickhouse истифода мешавад. Васлкунаки Logstash дорои механизми кӯшиши такрории дархост мебошад, аммо ҳангоми қатъи мунтазам, беҳтар аст, ки худи хидматро қатъ кунед. Ҳангоми қатъ, паёмҳо дар навбати RabbitMQ ҷамъ мешаванд, бинобар ин, агар таваққуф муддати тӯлонӣ бошад, беҳтар аст Filebeats-ро дар серверҳо қатъ кунед. Дар нақшае, ки RabbitMQ истифода намешавад (дар шабакаи маҳаллӣ, Filebeat мустақиман гузоришҳоро ба Logstash мефиристад), Filebeats комилан қобили қабул ва бехатар кор мекунад, бинобар ин барои онҳо мавҷуд набудани баромад бе оқибат мегузарад.

Намунаи конфигуратсия чунин менамояд:

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"

кликхона. Нигоҳдории сабт

Гузоришҳо барои ҳамаи системаҳо дар як ҷадвал нигоҳ дошта мешаванд (ба аввали мақола нигаред). Он барои нигоҳ доштани маълумот дар бораи дархостҳо пешбинӣ шудааст: ҳама параметрҳо барои форматҳои гуногун монанданд, ба монанди гузоришҳои IIS, apache ва nginx. Барои сабтҳои барномаҳо, ки дар онҳо, масалан, хатоҳо, паёмҳои иттилоотӣ, огоҳиҳо сабт карда мешаванд, ҷадвали алоҳида бо сохтори мувофиқ (ҳоло дар марҳилаи тарҳрезӣ) дода мешавад.

Ҳангоми тарҳрезии ҷадвал тасмим гирифтан дар бораи калиди ибтидоӣ (бо он маълумот ҳангоми нигоҳдорӣ мураттаб карда мешавад) хеле муҳим аст. Дараҷаи фишурдани маълумот ва суръати дархост аз ин вобаста аст. Дар мисоли мо калид аст
Фармоиш аз рӯи (fld_app_name, fld_app_module, logdatetime)
Яъне бо номи система, номи ҷузъи система ва санаи рӯйдод. Дар аввал, санаи чорабинӣ аввал омад. Пас аз интиқоли он ба ҷои охирин, дархостҳо тақрибан ду маротиба тезтар кор карданд. Тағир додани калиди ибтидоӣ аз нав сохтани ҷадвал ва аз нав боркунии маълумотро талаб мекунад, то ClickHouse маълумотро дар диск аз нав ҷудо кунад. Ин як амалиёти вазнин аст, бинобар ин хуб аст, ки дар бораи он чизе, ки бояд ба калиди навъ дохил карда шавад, бисёр фикр кунед.

Инчунин бояд қайд кард, ки навъи маълумоти LowCardinality дар версияҳои нисбатан нав пайдо шудааст. Ҳангоми истифодаи он, андозаи маълумоти фишурдашуда барои он майдонҳое, ки дараҷаи паст доранд (якчанд вариантҳо) хеле кам карда мешавад.

Версияи 19.6 дар айни замон истифода мешавад ва мо нақша дорем, ки ба версияи охирин навсозӣ кунем. Онҳо дорои чунин хусусиятҳои олиҷаноб ба монанди Granularity Adaptive, Skipping Indexs ва Codec DoubleDelta мебошанд.

Бо нобаёнӣ, ҳангоми насб, сатҳи сабткунӣ ба пайгирӣ таъин карда мешавад. Гузоришҳо гардиш ва бойгонӣ мешаванд, аммо дар айни замон онҳо то як гигабайт васеъ мешаванд. Агар зарурат набошад, пас шумо метавонед сатҳи огоҳиро муқаррар кунед, пас андозаи гузориш ба таври назаррас коҳиш меёбад. Танзими сабт дар файли 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 надорад. Ва чунин функсия, аз рӯи масъала дар github онҳо, барои татбиқ ба нақша гирифта нашудааст. Васлкунаки Кафка вуҷуд дорад, аммо бо баъзе сабабҳо мо онро дар хона истифода бурда наметавонем.
  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 анҷом дода мешавад. Хондан аз берун аз DMZ тавассути LogStash анҷом дода мешавад. Ҳангоми кор тавассути RabboitMQ тақрибан 4 ҳазор паём дар як сония коркард мешавад.

Масири паём бо номи система танзим карда мешавад, яъне дар асоси маълумоти конфигуратсияи FileBeat. Ҳама паёмҳо ба як навбат мераванд. Агар бо ягон сабаб хидмати навбат қатъ карда шавад, пас ин ба гум шудани паёмҳо оварда намерасонад: FileBeats хатогиҳои пайвастро қабул мекунад ва ирсолро муваққатан бозмедорад. Ва 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"

Графана. Панели идоракунӣ

Ин ҷузъ барои визуализатсияи маълумоти мониторинг истифода мешавад. Дар ин ҳолат, шумо бояд манбаи маълумоти ClickHouse -ро барои плагини Grafana 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

хулоса

Пайдоиши пойгоҳи додаҳои ClickHouse як воқеаи муҳим дар бозор гардид. Тасаввур кардан душвор буд, ки мо комилан бепул дар як лаҳза бо асбоби пурқувват ва амалӣ барои кор бо додаҳои калон муҷаҳҳаз шудем. Албатта, бо афзоиши эҳтиёҷот (масалан, тақсимкунӣ ва такрорӣ ба серверҳои сершумор), схема мураккабтар мешавад. Аммо дар таассуроти аввал кор бо ин база хеле гуворо аст. Дидан мумкин аст, ки махсулот «барои одамон» тайёр карда шудааст.

Дар муқоиса бо ElasticSearch, арзиши нигоҳдорӣ ва коркарди гузоришҳо аз панҷ то даҳ маротиба кам карда мешавад. Ба ибораи дигар, агар барои миқдори мавҷудаи маълумот мо бояд кластери якчанд мошинро таъсис диҳем, пас ҳангоми истифодаи ClickHouse як мошини камқувват барои мо кифоя аст. Бале, албатта, ElasticSearch инчунин механизмҳои фишурдани маълумот дар диск ва дигар хусусиятҳоро дорад, ки метавонанд истеъмоли захираҳоро ба таври назаррас коҳиш диҳанд, аммо дар муқоиса бо ClickHouse, ин гаронтар хоҳад буд.

Бе ягон оптимизатсияи махсус аз ҷониби мо, дар танзимоти пешфарз, боркунии маълумот ва интихоб аз пойгоҳи додаҳо бо суръати аҷиб кор мекунад. Мо ҳоло маълумоти зиёд надорем (тақрибан 200 миллион сабт), аммо худи сервер заиф аст. Мо метавонем ин асбобро дар оянда барои мақсадҳои дигаре, ки бо нигоҳдории гузоришҳо алоқаманд нестанд, истифода барем. Масалан, барои таҳлили ниҳоӣ, дар соҳаи амният, омӯзиши мошин.

Дар охир, каме дар бораи мусбат ва манфии.

Минусы

  1. Боркунии сабтҳо дар дастаҳои калон. Аз як тараф, ин хусусият аст, аммо шумо ба ҳар ҳол бояд ҷузъҳои иловагиро барои буфер кардани сабтҳо истифода баред. Ин вазифа на ҳамеша осон, вале ҳалшаванда аст. Ва ман мехоҳам нақшаро содда кунам.
  2. Баъзе функсияҳои экзотикӣ ё хусусиятҳои нав аксар вақт дар версияҳои нав вайрон мешаванд. Ин боиси нигаронӣ шуда, хоҳиши навсозӣ ба версияи навро коҳиш медиҳад. Масалан, муҳаррики мизи Кафка як хусусияти хеле муфид аст, ки ба шумо имкон медиҳад, ки бидуни татбиқи истеъмолкунандагон рӯйдодҳоро аз Кафка мустақиман хонед. Аммо аз рӯи шумораи масъалаҳо дар github, мо то ҳол эҳтиёт мекунем, ки ин муҳаррикро дар истеҳсолот истифода набарем. Аммо, агар шумо имову ишораҳои ногаҳонӣ ба паҳлӯ назанед ва функсияи асосиро истифода баред, он гоҳ мӯътадил кор мекунад.

Плюсы

  1. Суръатро суст намекунад.
  2. Ҳадди пасти вуруд.
  3. Манбаи кушода.
  4. Озод.
  5. Миқёси хуб (тақсимкунӣ / такрорӣ аз қуттӣ)
  6. Ба феҳристи нармафзори Русия, ки аз ҷониби Вазорати алоқа тавсия шудааст, дохил карда шудааст.
  7. Мавҷудияти дастгирии расмии Yandex.

Манбаъ: will.com

Илова Эзоҳ