ClickHouse адамдар үчүн маалымат базасы, же келгин технологиялары

Алексей Лизунов, ICB Маалыматтык технологиялар дирекциясынын аралыктан тейлөө каналдары боюнча компетенция борборунун жетекчиси

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-клиенттин жардамы менен оңдолгон партияны оңой киргизе аласыз).

Схемада колдонулган программалык камсыздоонун толук тизмеси таблицада келтирилген:

Колдонулган программалардын тизмеси

ысым

баяндоо

Тартууга шилтеме

жөргөмүш

Порт аркылуу кирүүнү чектөө жана авторизацияны уюштуруу үчүн тескери прокси

Учурда схемада колдонулбайт

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

Clickhouse

Журнал сактагыч 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) – акыркы версия

Grafana 4.6+ үчүн ClickHouse маалымат булагы

ClickHouse маалымат булагы менен Grafana үчүн плагин

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

Rabbit MQ

Билдирүү кезеги. Бул 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 маалымат базасы менен сервер конфигурациясы төмөнкү таблицада берилген:

ысым

Наркы

пикир

тарам

Катуу диск: 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;

Бөлүү (айлык) жана индекстин гранулярдуулугу үчүн демейки маанилерди колдонобуз. Бардык талаалар иш жүзүндө 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

Сервердеги журнал файлына жол

From: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. Log Collector

Бул компонент 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"

ClickHouse. Журнал сактагыч

Бардык системалар үчүн журналдар бир таблицада сакталат (макаланын башында караңыз). Ал суроо-талаптар жөнүндө маалыматты сактоо үчүн иштелип чыккан: бардык параметрлер ар кандай форматтар үчүн окшош, мисалы IIS журналдары, apache жана nginx журналдары. Мисалы, каталар, маалыматтык билдирүүлөр, эскертүүлөр жазылган тиркемелердин журналдары үчүн тиешелүү түзүмү менен өзүнчө таблица берилет (учурда долбоорлоо стадиясында).

Таблицаны иштеп чыгууда, негизги ачкычты (маалыматтар сактоо учурунда сорттолот) аныктоо абдан маанилүү. Маалыматтарды кысуу даражасы жана суроо ылдамдыгы ушундан көз каранды. Биздин мисалда, негизги болуп саналат
БУЙРУК БЕРҮҮ (fld_app_name, fld_app_module, logdatetime)
Башкача айтканда, системанын аталышы, системанын компонентинин аталышы жана окуя болгон күнү. Алгач иш-чаранын датасы биринчи келген. Аны акыркы орунга жылдыргандан кийин, сурамдар болжол менен эки эсе тез иштей баштады. Негизги ачкычты өзгөртүү таблицаны кайра түзүүнү жана маалыматтарды кайра жүктөөнү талап кылат, андыктан ClickHouse дисктеги маалыматтарды кайра сорттойт. Бул татаал операция, ошондуктан сорттоо ачкычына эмнелер киргизилиши керектиги жөнүндө алдын ала жакшылап ойлонуу сунушталат.

Ошондой эле LowCardinality маалымат түрү салыштырмалуу акыркы версияларда пайда болгонун белгилей кетүү керек. Аны колдонууда, кысылган маалыматтардын көлөмү кардиналдуулугу төмөн талаалар үчүн кескин кыскарат (бир нече варианттар).

Учурда биз 19.6 версиясын колдонуп жатабыз жана акыркы версияга жаңыртууга аракет кылууну пландап жатабыз. Алар, мисалы, Adaptive Granularity, Skipping индекстер жана 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 шилтемеси аркылуу жүргүзүлөт. Окуу LogStash аркылуу DMZ сыртынан жасалат. RabbitMQ аркылуу иштөөдө секундасына 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"

Grafana. Куралдар такталары

Бул компонент мониторинг маалыматтарды визуализациялоо үчүн колдонулат. Бул учурда, сиз Grafana 4.6+ плагини үчүн ClickHouse маалымат булагын орнотушуңуз керек. Куралдар тактасында SQL чыпкаларын иштетүүнүн натыйжалуулугун жогорулатуу үчүн биз аны бир аз өзгөртүүгө туура келди.

Мисалы, биз өзгөрмөлөрдү колдонобуз жана алар чыпка талаасында көрсөтүлбөсө, анда форманын WHERE шартында шарт түзбөшүн каалайбыз ( 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. Яндекстен расмий колдоонун болушу.

Source: www.habr.com

Комментарий кошуу