Bunachar Sonraí ClickHouse do Dhaoine, nó Teicneolaíochtaí Eachtrannaigh

Alexey Lizunov, ceann an ionaid inniúlachta do bhealaí cianseirbhíse de chuid Stiúrthóireacht Teicneolaíochta Faisnéise an ICB

Bunachar Sonraí ClickHouse do Dhaoine, nó Teicneolaíochtaí Eachtrannaigh

Mar mhalairt ar chruach ELK (ElasticSearch, Logstash, Kibana), táimid ag déanamh taighde ar úsáid a bhaint as bunachar sonraí ClickHouse mar stóráil sonraí le haghaidh logaí.

San Airteagal seo ba mhaith linn labhairt faoi ár dtaithí ag baint úsáide as an mbunachar sonraí ClickHouse agus réamhthorthaí ó oibriú píolótach. Is fiú a thabhairt faoi deara láithreach go raibh na torthaí go hiontach.


Bunachar Sonraí ClickHouse do Dhaoine, nó Teicneolaíochtaí Eachtrannaigh

Ansin déanfaimid cur síos níos mionsonraithe ar an gcaoi a bhfuil ár gcóras cumraithe agus cad iad na comhpháirteanna atá ann. Ach anois ba mhaith liom labhairt beagán faoin mbunachar sonraí seo ina iomláine, agus cén fáth ar fiú aird a thabhairt air. Is bunachar sonraí colún anailíseach ardfheidhmíochta ó Yandex é bunachar ClickHouse. Úsáidtear é i seirbhísí Yandex, ar dtús is é seo an príomhstóráil sonraí do Yandex.Metrica. Córas foinse oscailte saor in aisce,. Ó thaobh forbróra de, bhí mé i gcónaí ag smaoineamh ar conas a chuir siad é seo i bhfeidhm, toisc go bhfuil sonraí iontacha móra ann. Agus tá comhéadan úsáideora Metrica féin an-solúbtha agus oibríonn sé go tapa. Nuair a fhaigheann tú aithne ar an mbunachar sonraí seo den chéad uair, faigheann tú an tuiscint: “Bhuel, ar deireadh! Déanta “do na daoine”! Ón bpróiseas suiteála go dtí iarratais a sheoladh.”

Tá bacainn iontrála an-íseal ag an mbunachar sonraí seo. Is féidir le fiú forbróir meánach an bunachar sonraí seo a shuiteáil i gceann cúpla nóiméad agus tosú á úsáid. Oibríonn gach rud go réidh. Fiú amháin is féidir le daoine atá nua do Linux déileáil go tapa leis an tsuiteáil agus oibríochtaí simplí a dhéanamh. Más rud é níos luaithe, nuair a chuala na focail Big Data, Hadoop, Google BigTable, HDFS, bhí an smaoineamh ag an bhforbróir meán go raibh siad ag caint faoi roinnt terabytes, petabytes, go raibh baint ag roinnt superhumans le bunú agus forbairt na gcóras seo, ansin leis an teacht ar bhunachar sonraí ClickHouse fuaireamar uirlis shimplí sothuigthe lenar féidir leat raon fadhbanna nach bhféadfaí a bhaint amach roimhe seo a réiteach. Ní thógann sé ach meaisín meánach amháin agus cúig nóiméad le suiteáil. Is é sin, fuair muid bunachar sonraí cosúil le, mar shampla, MySql, ach amháin chun na billiúin taifead a stóráil! Sár-cartlann le teanga SQL. Tá sé mar a tugadh airm eachtrannach do dhaoine.

Maidir lenár gcóras bailithe loga

Chun faisnéis a bhailiú, úsáidtear comhaid logála IIS d’fheidhmchláir ghréasáin de bhformáid chaighdeánach (táimid faoi láthair ag parsáil logaí feidhmchlár freisin, ach is é ár bpríomhsprioc ag an gcéim phíolótach ná logaí IIS a bhailiú).

Níorbh fhéidir linn an cruach ELK a thréigean go hiomlán ar chúiseanna éagsúla, agus leanaimid ar aghaidh ag baint úsáide as na comhpháirteanna LogStash agus Filebeat, atá cruthaithe go maith agus a oibríonn go hiontaofa agus intuartha.

Tá an scéim logála ginearálta léirithe san fhigiúr thíos:

Bunachar Sonraí ClickHouse do Dhaoine, nó Teicneolaíochtaí Eachtrannaigh

Gné a bhaineann le sonraí a thaifeadadh i mbunachar sonraí ClickHouse is ea taifid a chur isteach go hannamh (uair sa soicind) i mbaisceanna móra. Is é seo, de réir dealraimh, an chuid is “fadhbanna” a bhíonn agat agus tú ag obair le bunachar sonraí ClickHouse don chéad uair: éiríonn an scéim rud beag níos casta.
Chuidigh an breiseán do LogStash, a chuireann sonraí isteach go díreach isteach i ClickHouse, go leor anseo. Imscartar an chomhpháirt seo ar an bhfreastalaí céanna leis an mbunachar sonraí féin. Mar sin, go ginearálta, ní mholtar é seo a dhéanamh, ach ó thaobh praiticiúil de, ionas nach gcruthófar freastalaithe ar leith agus é á imscaradh ar an bhfreastalaí céanna. Níor thugamar faoi deara aon teip nó coimhlint acmhainní leis an mbunachar sonraí. Ina theannta sin, ba chóir a thabhairt faoi deara go bhfuil meicníocht atriail ag an mbreiseán i gcás earráidí. Agus i gcás earráidí, scríobhann an breiseán ar dhiosca bhaisc sonraí nach bhféadfaí a chur isteach (tá an fhormáid comhaid áisiúil: tar éis eagarthóireacht a dhéanamh, is féidir leat an bhaisc cheartaithe a chur isteach go héasca ag baint úsáide as clickhouse-client).

Tá liosta iomlán de na bogearraí a úsáideadh sa scéim curtha i láthair sa tábla:

Liosta de na bogearraí a úsáideadh

Ainm

Cur síos

Nasc le dáileadh

nginx

Frithsheachfhreastalaí chun rochtain ag calafort a shrianadh agus údarú a eagrú

Ní úsáidtear sa scéim faoi láthair

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

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

ComhadBeat

Logchomhaid a aistriú.

https://www.elastic.co/downloads/beats/filebeat (dáileadh le haghaidh Windows 64 giotán).

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

LogStash

Bailitheoir logáil.

Úsáidtear é chun logaí a bhailiú ó FileBeat, chomh maith le logaí a bhailiú ó scuaine RabbitMQ (do fhreastalaithe atá lonnaithe sa DMZ.)

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

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

Logstash- aschur- cliceáilteach

Breiseán Loagstash chun logaí a aistriú chuig bunachar sonraí ClickHouse i mbaisceanna

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

/usr/share/logstash/bin/logstash-plugin shuiteáil logstash-aschur-clickhouse

/usr/share/logstash/bin/logstash-plugin shuiteáil logstash-filter-prune

/usr/share/logstash/bin/logstash-plugin shuiteáil logstash-filter-multiline

Cliceáil Teach

Stóráil logáil 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

Nóta. Ag tosú ó Lúnasa 2018, bhí foirgnimh rpm “gnáth” do RHEL le feiceáil i stór Yandex, ionas gur féidir leat triail a bhaint astu. Tráth na suiteála bhíomar ag baint úsáide as pacáistí a thiomsaigh Altinity.

grafana

Amharcléiriú na logaí. Paistí a shocrú

https://grafana.com/

https://grafana.com/grafana/download

Redhat & Centos (64 giotán) - an leagan is déanaí

Foinse sonraí ClickHouse le haghaidh Grafana 4.6+

Breiseán do Grafana le foinse sonraí ClickHouse

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

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

LogStash

Logáil ródaire ó FileBeat go dtí an scuaine RabbitMQ.

Nóta. Ar an drochuair níl aschur díreach ag FileBeat go RabbitMQ, mar sin tá nasc idirmheánach i bhfoirm Logstash ag teastáil

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

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

Coinín MQ

scuaine teachtaireachta. Is maolán é seo d’iontrálacha logála sa 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 (Riachtanach do RabbitMQ)

Erlang am rite. Ag teastáil le go n-oibreoidh RabbitMQ

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

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

Léirítear cumraíocht an fhreastalaí leis an mbunachar sonraí ClickHouse sa tábla seo a leanas:

Ainm

Luach

Tabhair faoi deara

Cumraíocht

HDD: 40GB
RAM: 8GB
Próiseálaí: Core 2 2Ghz

Ba cheart duit aird a thabhairt ar na leideanna chun bunachar sonraí ClickHouse a úsáid (https://clickhouse.yandex/docs/ru/operations/tips/)

Bogearraí ar fud an chórais

OS: Freastalaí Red Hat Enterprise Linux (Maipo)

JRE (Java 8)

 

Mar a fheiceann tú, is stáisiún oibre rialta é seo.

Seo a leanas struchtúr an tábla chun logaí a stóráil:

logáil_gréasáin.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;

Bainimid úsáid as luachanna réamhshocraithe le haghaidh deighilt (míosúil) agus granularity innéacs. Freagraíonn gach réimse go praiticiúil le hiontrálacha logála IIS chun iarratais http a thaifeadadh. Ar leithligh, tugaimid faoi deara go bhfuil réimsí ar leith ann chun clibeanna utm a stóráil (déantar iad a pharsáil ag an gcéim a gcuirtear isteach sa tábla iad ó réimse an téad cheist).

Chomh maith leis sin, cuireadh roinnt réimsí córais leis an tábla chun faisnéis a stóráil faoi chórais, comhpháirteanna agus freastalaithe. Chun cur síos a fháil ar na réimsí seo, féach an tábla thíos. I dtábla amháin stórálaimid logaí do chórais éagsúla.

Ainm

Cur síos

Sampla

fld_app_ainm

Ainm an fheidhmchláir/chórais
Luachanna bailí:

  • site1.domain.com Suíomh seachtrach 1
  • site2.domain.com Suíomh seachtrach 2
  • inmheánach-suíomh1.domain.local Suíomh inmheánach 1

suíomh1.domain.com

fld_app_modúl

Modúl córais
Luachanna bailí:

  • gréasáin - Suíomh Gréasáin
  • svc — Seirbhís gréasáin tsuímh
  • intgr — seirbhís comhtháthú Gréasáin
  • bo — Riarthóir (BackOffice)

gréasáin

fld_suíomh gréasáin_ainm

Ainm an tsuímh in IIS

Is féidir roinnt córas a imscaradh ar fhreastalaí amháin, nó fiú roinnt cásanna de mhodúl córais amháin

príomhlíonra

fld_server_ainm

Ainm freastalaí

gréasáin1.domain.com

fld_log_file_name

Conair chuig an logchomhad ar an bhfreastalaí

Ó: inetpublogsLogFiles
W3SVC1u_ex190711.log

Ligeann sé seo duit graif a thógáil go héifeachtach i Grafana. Mar shampla, féach ar iarratais ó thaobh tosaigh córais ar leith. Tá sé seo cosúil leis an gcuntar suíomh i Yandex.Metrica.

Seo roinnt staitisticí ar úsáid bhunachair sonraí le haghaidh dhá mhí.

Líon na dtaifead de réir córais agus comhpháirte

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.)

Toirt sonraí diosca

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.

Cóimheas comhbhrú sonraí colún

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.

Cur síos ar na comhpháirteanna a úsáideadh

ComhadBeat. Logchomhaid a aistriú

Déanann an chomhpháirt seo monatóireacht ar athruithe ar chomhaid logála ar dhiosca agus cuireann sé an fhaisnéis ar aghaidh chuig LogStash. Suiteáilte ar gach freastalaí ina bhfuil comhaid loga scríofa (IIS de ghnáth). Oibríonn sé i mód eireaball (i.e., ní aistríonn sé ach taifid bhreise chuig an gcomhad). Ach is féidir leat é a chumrú ar leithligh chun comhaid iomlána a aistriú. Tá sé seo áisiúil nuair is gá duit sonraí a íoslódáil do na míonna roimhe seo. Cuir an comhad logála isteach i bhfillteán agus léifidh sé ina iomláine é.

Nuair a stopann an tseirbhís, stopann na sonraí a aistriú níos faide chuig an stóráil.

Breathnaíonn cumraíocht shamplach mar seo:

comhadbeat.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. Bailitheoir Logchomhaid

Tá an chomhpháirt seo deartha chun taifid loga a fháil ó FileBeat (nó trí scuaine RabbitMQ), a pharsáil agus a chur isteach i mbaisceanna i mbunachar sonraí ClickHouse.

Chun cur isteach i ClickHouse, bain úsáid as an breiseán Logstash-aschur-clickhouse. Tá meicníocht ag an mbreiseán Logstash chun iarratais a aisrianú, ach le linn múchadh rialta, is fearr an tseirbhís féin a stopadh. Nuair a stopfar iad, carnfaidh teachtaireachtaí sa scuaine RabbitMQ, mar sin má tá an stad ar feadh i bhfad, ansin is fearr Filebeats a stopadh ar na freastalaithe. I scéim nach n-úsáidtear RabbitMQ (ar an líonra áitiúil seolann Filebeat logaí go Logstash go díreach), oibríonn Filebeats sách inghlactha agus sábháilte, agus mar sin níl aon iarmhairtí ag baint le neamh-infhaighteacht an aschuir dóibh.

Breathnaíonn cumraíocht shamplach mar seo:

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

píblínte.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"

Cliceáil Teach. Stóráil logáil

Déantar logaí do gach córas a shábháil i dtábla amháin (féach ag tús an ailt). Tá sé deartha chun faisnéis a stóráil faoi iarratais: tá na paraiméadair go léir cosúil le haghaidh formáidí éagsúla, mar shampla logaí IIS, logaí apache agus nginx. I gcás logaí feidhmchlár ina ndéantar, mar shampla, earráidí, teachtaireachtaí faisnéise, rabhaidh a thaifeadadh, cuirfear tábla ar leith ar fáil leis an struchtúr cuí (ag an gcéim deartha faoi láthair).

Agus tábla á dhearadh, tá sé an-tábhachtach cinneadh a dhéanamh ar an bpríomheochair (lena ndéanfar na sonraí a shórtáil le linn stórála). Braitheann an méid comhbhrú sonraí agus luas fiosrúcháin air seo. In ár sampla, is é an eochair
ORDER BY (fld_app_name, fld_app_module, logdatetime)
Is é sin, de réir ainm an chórais, ainm chomhpháirt an chórais agus dáta an imeachta. Ar dtús, tháinig dáta na hócáide ar dtús. Tar éis é a aistriú go dtí an áit dheireanach, thosaigh fiosrúcháin ag obair thart ar dhá uair chomh tapa. Chun an príomheochair a athrú beidh gá an tábla a athchruthú agus na sonraí a ath-uaslódáil ionas go ndéanfaidh ClickHouse na sonraí ar diosca a athshórtáil. Is oibríocht dheacair é seo, mar sin moltar smaoineamh go cúramach roimh ré ar cad ba cheart a áireamh san eochair sórtála.

Ba chóir a thabhairt faoi deara freisin go raibh an cineál sonraí LowCardinality le feiceáil i leaganacha réasúnta nua. Agus é á úsáid, laghdaítear méid na sonraí comhbhrúite go mór do na réimsí sin a bhfuil cardinality íseal (beagán roghanna).

Táimid ag baint úsáide as leagan 19.6 faoi láthair agus tá sé beartaithe againn iarracht a dhéanamh nuashonrú go dtí an leagan is déanaí. Tá gnéithe iontacha den sórt sin acu mar Oiriúnaitheach Granularity, gan bacadh le hinnéacsanna agus an CODEC DoubleDelta, mar shampla.

De réir réamhshocraithe, socraítear leibhéal logála na cumraíochta a rianú le linn na suiteála. Déantar logaí a rothlú agus a chartlannú, ach ag an am céanna leathnaíonn siad suas go dtí gigabyte. Mura bhfuil aon ghá ann, ansin is féidir leat an leibhéal a shocrú chun rabhadh a thabhairt, ansin laghdóidh méid an loga go géar. Tá na socruithe logála sonraithe sa chomhad config.xml:

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

Roinnt orduithe úsáideacha

Поскольку оригинальные пакеты установки собираются по 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. Logáil ródaire ó FileBeat go dtí an scuaine RabbitMQ

Úsáidtear an chomhpháirt seo chun logaí a thagann ó FileBeat go dtí an scuaine RabbitMQ a sheoladh. Tá dhá phointe anseo:

  1. Ar an drochuair, níl breiseán aschuir ag FileBeat chun scríobh go díreach chuig RabbitMQ. Agus níl sé beartaithe feidhmiúlacht den sórt sin, a mheas leis an bpost ar a github, a chur i bhfeidhm. Tá breiseán ann do Kafka, ach ar chúiseanna áirithe ní féidir linn féin é a úsáid.
  2. Tá ceanglais ann maidir le logaí a bhailiú sa DMZ. Bunaithe orthu, ní mór na logaí a scuainiú ar dtús agus ansin léann LogStash taifid ón scuaine go seachtrach.

Dá bhrí sin, go sonrach i gcás freastalaithe atá lonnaithe i DMZ, is gá scéim den sórt sin beagán casta a úsáid. Breathnaíonn cumraíocht shamplach mar seo:

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. Scuaine Teachtaireachta

Úsáidtear an chomhpháirt seo chun iontrálacha logála sa DMZ a mhaolánú. Déantar an taifeadadh tríd an nasc Filebeat → LogStash. Déantar léamh ó lasmuigh den DMZ trí LogStash. Agus iad ag feidhmiú trí RabbitMQ, déantar thart ar 4 mhíle teachtaireacht in aghaidh an tsoicind a phróiseáil.

Tá ródú teachtaireachta cumraithe de réir ainm an chórais, i.e., bunaithe ar shonraí cumraíochta FileBeat. Téann gach teachtaireacht isteach i scuaine amháin. Má stoptar an tseirbhís scuaine ar chúis éigin, ní chaillfidh sé seo teachtaireacht: gheobhaidh FileBeats earráidí ceangail agus stopfaidh sé á sheoladh go sealadach. Agus gheobhaidh LogStash, a léann ón scuaine, earráidí líonra freisin agus fanfaidh sé go gcuirfear an nasc ar ais. Sa chás seo, ar ndóigh, ní scríobhfar na sonraí chuig an mbunachar sonraí a thuilleadh.

Úsáidtear na treoracha seo a leanas chun scuainí a chruthú agus a chumrú:

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. Deais

Úsáidtear an chomhpháirt seo chun sonraí monatóireachta a léirshamhlú. Sa chás seo, ní mór duit an fhoinse sonraí ClickHouse le haghaidh breiseán Grafana 4.6+ a shuiteáil. Bhí orainn é a athrú beagán chun feabhas a chur ar éifeachtúlacht próiseála scagairí SQL ar an deais.

Mar shampla, úsáidimid athróga, agus mura bhfuil siad sonraithe sa réimse scagaire, ba mhaith linn nach ndéanfaí coinníoll a ghiniúint san ÁIT den fhoirm ( uriStem = "AGUS uriStem ! = "). Sa chás seo, léifidh ClickHouse an colún uriStem. Mar sin, rinneamar roghanna éagsúla a thriail agus ar deireadh shocraigh muid an breiseán (an macra $valueIfEmpty) chun 1 a thabhairt ar ais i gcás luach folamh, gan an colún féin a lua.

Agus anois is féidir leat an cheist seo a úsáid don ghraf

$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')

a thiontaítear go SQL mar seo (tabhair faoi deara nach ndéantar ach réimsí uriStem folamh a thiontú go 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

Conclúid

Tá cuma bhunachar sonraí ClickHouse ina imeacht suntasach sa mhargadh. Bhí sé deacair a shamhlú go raibh uirlis chumhachtach agus phraiticiúil againn ar an toirt, go hiomlán saor in aisce, chun oibriú le sonraí móra. Ar ndóigh, de réir mar a mhéadaíonn riachtanais (mar shampla, roinnt agus macasamhlú ar fhreastalaithe iolracha), éireoidh an scéim níos casta. Ach de réir an chéad imprisean, tá sé an-taitneamhach oibriú leis an mbunachar sonraí seo. Is léir go ndéantar an táirge “do dhaoine”.

I gcomparáid le ElasticSearch, laghdaítear an costas a bhaineann le logaí a stóráil agus a phróiseáil, de réir réamh-mheastacháin, cúig go deich n-uaire. Is é sin le rá, dá mba rud é go gcaithfimid braisle de mheaisíní éagsúla a chur ar bun maidir leis an méid sonraí atá ann faoi láthair, ansin ní gá dúinn ach meaisín ísealchumhachta amháin agus ClickHouse in úsáid againn. Sea, ar ndóigh, tá meicníochtaí comhbhrú sonraí ar an diosca agus gnéithe eile ag ElasticSearch freisin ar féidir leo tomhaltas acmhainní a laghdú go suntasach, ach i gcomparáid le ClickHouse beidh costais níos mó ag teastáil uaidh seo.

Gan aon optimizations speisialta ar ár gcuid, le socruithe réamhshocraithe, sonraí a luchtú agus sonraí a aisghabháil ón mbunachar sonraí oibreacha ag luas iontach. Níl mórán sonraí againn fós (thart ar 200 milliún taifead), ach tá an freastalaí féin lag. Féadfaimid an uirlis seo a úsáid sa todhchaí chun críocha eile nach mbaineann le logaí a stóráil. Mar shampla, le haghaidh anailísí ceann go ceann, i réimse na slándála, meaisínfhoghlama.

Ag an deireadh, beagán faoi na buntáistí agus na míbhuntáistí.

CONS

  1. Taifid á lódáil i mbaisceanna móra. Ar thaobh amháin, is gné é seo, ach caithfidh tú comhpháirteanna breise a úsáid fós chun taifid a mhaolánú. Níl an tasc seo simplí i gcónaí, ach fós insolvable. Agus ba mhaith liom an scéim a shimpliú.
  2. Is minic a bhriseann roinnt feidhmiúlacht choimhthíocha nó gnéithe nua i leaganacha nua. Ardaíonn sé seo imní, ag laghdú an fonn a uasghrádú go leagan nua. Mar shampla, is gné an-úsáideach é inneall tábla Kafka a ligeann duit imeachtaí Kafka a léamh go díreach, gan tomhaltóirí a chur i bhfeidhm. Ach ag breathnú ar líon na Saincheisteanna ar Github, táimid fós ar an airdeall faoin inneall seo a úsáid i dtáirgeadh. Mar sin féin, mura ndéanann tú gluaiseachtaí tobann ar an taobh agus an fheidhmiúlacht bhunúsach a úsáid, ansin oibríonn sé go cobhsaí.

Son

  1. Ní mall síos.
  2. Tairseach iontrála íseal.
  3. Foinse oscailte.
  4. Saor.
  5. Inscálaithe (macasamhlú sharding/as-an-bhosca)
  6. San áireamh i gclár na bogearraí Rúisis molta ag an Aireacht Cumarsáide.
  7. Tacaíocht oifigiúil a bheith ar fáil ó Yandex.

Foinse: will.com

Add a comment