ClickHouse Database for Humans, or Alien Technologies

Ալեքսեյ Լիզունով, MKB-ի տեղեկատվական տեխնոլոգիաների տնօրինության հեռակա սպասարկման ալիքների իրավասության կենտրոնի ղեկավար

ClickHouse Database for Humans, or Alien Technologies

Որպես ELK stack-ի այլընտրանք (ElasticSearch, Logstash, Kibana), մենք հետազոտություն ենք անում ClickHouse տվյալների բազան որպես տեղեկամատյանների տվյալների պահեստ օգտագործելու վերաբերյալ:

Այս հոդվածում մենք կցանկանայինք խոսել ClickHouse տվյալների բազայի օգտագործման մեր փորձի և փորձնական գործողության նախնական արդյունքների մասին: Անմիջապես պետք է նշել, որ արդյունքները տպավորիչ էին։


ClickHouse Database for Humans, or Alien Technologies

Հաջորդը, մենք ավելի մանրամասն նկարագրելու ենք, թե ինչպես է կազմաձևված մեր համակարգը և ինչ բաղադրիչներից է այն բաղկացած: Բայց հիմա ես կցանկանայի մի փոքր խոսել այս տվյալների բազայի մասին, որպես ամբողջություն, և թե ինչու է արժե ուշադրություն դարձնել: ClickHouse տվյալների բազան բարձր արդյունավետությամբ վերլուծական սյունակային տվյալների բազա է Yandex-ից: Այն օգտագործվում է Yandex ծառայություններում, ի սկզբանե այն Yandex.Metrica-ի տվյալների հիմնական պահեստն է։ Բաց կոդով համակարգ, անվճար: Մշակողի տեսանկյունից ես միշտ մտածել եմ, թե ինչպես են դա իրականացրել, քանի որ ֆանտաստիկ մեծ տվյալներ կան։ Իսկ Metrica-ի ինտերֆեյսը ինքնին շատ ճկուն է և արագ: Այս տվյալների բազայի հետ առաջին ծանոթության ժամանակ տպավորություն է ստեղծվում. «Դե, վերջապես: Ստեղծված է ժողովրդի համար: Սկսած տեղադրման գործընթացից և վերջացրած հարցումներ ուղարկելով:

Այս տվյալների բազան մուտքի շատ ցածր շեմ ունի: Նույնիսկ միջին հմուտ ծրագրավորողը կարող է մի քանի րոպեում տեղադրել այս տվյալների բազան և սկսել օգտագործել այն: Ամեն ինչ պարզ է աշխատում. Նույնիսկ այն մարդիկ, ովքեր նոր են Linux-ում, կարող են արագ կարգավորել տեղադրումը և կատարել ամենապարզ գործողությունները: Եթե ​​ավելի վաղ, Big Data, Hadoop, Google BigTable, HDFS բառերով, սովորական ծրագրավորողը պատկերացումներ ուներ, որ խոսքը որոշ տերաբայթերի, petabytes-ի մասին է, որ որոշ գերմարդկանց ներգրավված են այս համակարգերի կարգավորումներում և զարգացումներում, ապա ClickHouse-ի գալուստով: տվյալների բազան, մենք ստացանք պարզ, հասկանալի գործիք, որով դուք կարող եք լուծել նախկինում անհասանելի առաջադրանքների շարք: Տեղադրելու համար պահանջվում է ընդամենը մեկ բավականին միջին մեքենա և հինգ րոպե: Այսինքն, մենք ստացանք այնպիսի տվյալների բազա, ինչպիսին, օրինակ, MySql-ն է, բայց միայն միլիարդավոր գրառումներ պահելու համար: Որոշակի գերարխիվատոր SQL լեզվով: Կարծես մարդկանց հանձնել են այլմոլորակայինների զենքերը:

Մեր անտառահատումների համակարգի մասին

Տեղեկատվություն հավաքելու համար օգտագործվում են ստանդարտ ձևաչափի վեբ հավելվածների IIS տեղեկամատյանների ֆայլեր (մենք նաև ներկայումս վերլուծում ենք հավելվածների տեղեկամատյանները, բայց փորձնական փուլում հիմնական նպատակը IIS տեղեկամատյանների հավաքումն է):

Տարբեր պատճառներով մենք չկարողացանք ամբողջությամբ հրաժարվել ELK stack-ից, և մենք շարունակում ենք օգտագործել LogStash և Filebeat բաղադրիչները, որոնք իրենց լավ են ապացուցել և աշխատում են բավականին հուսալի և կանխատեսելի:

Հատումների ընդհանուր սխեման ներկայացված է ստորև բերված նկարում.

ClickHouse Database for Humans, or Alien Technologies

ClickHouse տվյալների բազայում տվյալներ գրելու առանձնահատկությունն այն է, որ գրառումների հազվադեպ (վայրկյանում մեկ անգամ) տեղադրումը մեծ խմբաքանակներով: Սա, ըստ երևույթին, ամենա«խնդրահարույց» մասն է, որին հանդիպում եք, երբ առաջին անգամ փորձ եք անում աշխատել ClickHouse տվյալների բազայի հետ. սխեման մի փոքր ավելի բարդ է դառնում:
LogStash-ի հավելումը, որն ուղղակիորեն տվյալներ է տեղադրում ClickHouse-ում, շատ օգնեց այստեղ: Այս բաղադրիչը տեղակայված է նույն սերվերի վրա, ինչ տվյալների բազան: Այսպիսով, ընդհանուր առմամբ, խորհուրդ չի տրվում դա անել, բայց գործնական տեսանկյունից, որպեսզի չարտադրվեն առանձին սերվերներ, երբ այն տեղակայված է նույն սերվերի վրա: Մենք տվյալների բազայի հետ ոչ մի ձախողում կամ ռեսուրսների կոնֆլիկտ չենք նկատել: Բացի այդ, պետք է նշել, որ փլագինը սխալների դեպքում ունի կրկնակի փորձարկման մեխանիզմ։ Իսկ սխալների դեպքում plugin-ը գրում է սկավառակի վրա տվյալների մի խմբաքանակ, որը հնարավոր չէ տեղադրել (ֆայլի ձևաչափը հարմար է. խմբագրելուց հետո կարող եք հեշտությամբ տեղադրել շտկված խմբաքանակը՝ օգտագործելով clickhouse-client):

Սխեմայում օգտագործվող ծրագրերի ամբողջական ցանկը ներկայացված է աղյուսակում.

Օգտագործված ծրագրաշարի ցանկը

Անվանում

Նկարագրություն

Բաշխման հղում

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

լոգստաշ

Գերանների կոլեկցիոներ:

Օգտագործվում է 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 install 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-ի «նորմալ» պտույտ/րոպե կառուցումները հայտնվել են Yandex-ի պահոցում, այնպես որ կարող եք փորձել օգտագործել դրանք: Տեղադրման ժամանակ մենք օգտագործում էինք Altinity-ի կողմից ստեղծված փաթեթներ:

Գրաֆանա

Մատյան վիզուալիզացիա: Վահանակների տեղադրում

https://grafana.com/

https://grafana.com/grafana/download

Redhat & Centos (64 Bit) - վերջին տարբերակը

ClickHouse տվյալների աղբյուրը Grafana 4.6+-ի համար

Plugin Grafana-ի համար ClickHouse տվյալների աղբյուրով

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

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

լոգստաշ

Մուտքագրեք երթուղիչը 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-ի համար)

Էրլանգ գործարկման ժամանակ: Պահանջվում է 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
RAM- ը `8GB
Պրոցեսոր՝ Core 2 2Ghz

Անհրաժեշտ է ուշադրություն դարձնել ClickHouse տվյալների բազայի գործարկման խորհուրդներին (https://clickhouse.yandex/docs/ru/operations/tips/)

Համակարգի ընդհանուր ծրագրակազմ

ՕՀ՝ Red Hat Enterprise Linux սերվեր (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-tags պահելու առանձին դաշտեր (դրանք վերլուծվում են հարցման տողի դաշտից աղյուսակի մեջ ներդնելու փուլում):

Նաև աղյուսակում ավելացվել են մի քանի համակարգի դաշտեր՝ համակարգերի, բաղադրիչների, սերվերների մասին տեղեկատվությունը պահելու համար: Այս դաշտերի նկարագրության համար տե՛ս ստորև բերված աղյուսակը: Մեկ աղյուսակում մենք պահում ենք տեղեկամատյանները մի քանի համակարգերի համար:

Անվանում

Նկարագրություն

Օրինակ

fld_app_name

Հավելվածի/համակարգի անվանումը
Վավեր արժեքներ.

  • site1.domain.com Արտաքին կայք 1
  • site2.domain.com Արտաքին կայք 2
  • interior-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

Սերվերի գրանցամատյանի ֆայլի ուղին

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-ին: Տեղադրված է բոլոր սերվերների վրա, որտեղ գրված են log ֆայլերը (սովորաբար 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: ~

լոգստաշ. Տեղեկամատյանների կոլեկցիոներ

Այս բաղադրիչը նախատեսված է FileBeat-ից (կամ RabbitMQ հերթի միջոցով) մուտքագրումներ ստանալու համար՝ վերլուծելով և խմբաքանակները ClickHouse տվյալների բազայում տեղադրելու համար:

ClickHouse-ում տեղադրելու համար օգտագործվում է Logstash-output-clickhouse հավելվածը: Logstash plugin-ն ունի հարցման կրկնակի փորձարկման մեխանիզմ, սակայն կանոնավոր անջատման դեպքում ավելի լավ է դադարեցնել ծառայությունը: Երբ դադարեցվի, հաղորդագրությունները կկուտակվեն 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"
        }
    }
 
}

խողովակաշարեր.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

լոգստաշ. Մուտքագրեք երթուղիչը FileBeat-ից մինչև RabbitMQ հերթ

Այս բաղադրիչն օգտագործվում է FileBeat-ից դեպի RabbitMQ հերթ տանող տեղեկամատյանները: Այստեղ երկու կետ կա.

  1. Ցավոք, FileBeat-ը չունի ելքային հավելված՝ անմիջապես RabbitMQ-ին գրելու համար: Եվ նման ֆունկցիոնալությունը, դատելով նրանց github-ի խնդրից, նախատեսված չէ իրականացնել։ Կաֆկայի համար կա plugin, բայց ինչ-ինչ պատճառներով մենք չենք կարող այն օգտագործել տանը:
  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 ֆիլտրերի մշակման արդյունավետությունը վահանակի վրա:

Օրինակ, մենք օգտագործում ենք փոփոխականներ, և եթե դրանք դրված չեն ֆիլտրի դաշտում, ապա մենք կցանկանայինք, որ այն ձևի WHERE-ում պայման չստեղծեր ( uriStem = » AND uriStem != » ): Այս դեպքում ClickHouse-ը կկարդա uriStem սյունակը: Ընդհանուր առմամբ, մենք փորձեցինք տարբեր տարբերակներ և ի վերջո շտկեցինք plugin-ը ($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. Որոշ էկզոտիկ ֆունկցիոնալություն կամ նոր հնարավորություններ հաճախ խախտում են նոր տարբերակներում: Սա անհանգստություն է առաջացնում՝ նվազեցնելով նոր տարբերակի թարմացման ցանկությունը։ Օրինակ, Kafka սեղանի շարժիչը շատ օգտակար հատկություն է, որը թույլ է տալիս ուղղակիորեն կարդալ իրադարձությունները Կաֆկայից՝ առանց սպառողների ներդրման: Բայց դատելով github-ի խնդիրների քանակից, մենք դեռ զգույշ ենք, որպեսզի չօգտագործենք այս շարժիչը արտադրության մեջ: Այնուամենայնիվ, եթե դուք հանկարծակի ժեստեր չեք անում կողքի վրա և չեք օգտագործում հիմնական գործառույթը, ապա այն կայուն է աշխատում:

Կոալիցիայում

  1. Չի դանդաղեցնում:
  2. Մուտքի ցածր շեմ:
  3. Բաց կոդով։
  4. Անվճար.
  5. Լավ է չափվում (կտրում/կրկնօրինակում տուփից դուրս)
  6. Ներառված է կապի նախարարության կողմից առաջարկվող ռուսական ծրագրային ապահովման ռեեստրում:
  7. Yandex-ի պաշտոնական աջակցության առկայությունը:

Source: www.habr.com

Добавить комментарий