Aleksey Lizunov, Ceannard an Ionad Comais airson Sianalan Seirbheis Iomallach de Bhuidheann-stiùiridh Teicneòlas Fiosrachaidh an MKB
Mar roghainn eile an àite stac ELK (ElasticSearch, Logstash, Kibana), tha sinn a’ dèanamh rannsachadh air a bhith a’ cleachdadh stòr-dàta ClickHouse mar stòr dàta airson logaichean.
San artaigil seo, bu mhath leinn bruidhinn mun eòlas a th’ againn air a bhith a’ cleachdadh stòr-dàta ClickHouse agus toraidhean tòiseachaidh na h-obrach pìleat. Bu chòir a thoirt fa-near sa bhad gun robh na toraidhean drùidhteach.
An ath rud, bheir sinn cunntas nas mionaidiche air mar a tha an siostam againn air a rèiteachadh, agus dè na pàirtean a th’ ann. Ach a-nis bu mhath leam bruidhinn beagan mun stòr-dàta seo gu h-iomlan, agus carson as fhiach aire a thoirt dha. Tha an stòr-dàta ClickHouse na stòr-dàta colbhan anailis àrd-choileanaidh bho Yandex. Tha e air a chleachdadh ann an seirbheisean Yandex, an toiseach is e am prìomh stòradh dàta airson Yandex.Metrica. Siostam còd fosgailte, saor an-asgaidh. Bho shealladh leasaiche, bha mi a-riamh a’ faighneachd ciamar a chuir iad an gnìomh e, leis gu bheil dàta air leth mòr ann. Agus tha eadar-aghaidh cleachdaiche Metrica fhèin gu math sùbailte agus luath. Aig a’ chiad eòlas air an stòr-dàta seo, is e a’ bheachd: “Uill, mu dheireadh! Air a dhèanamh dha na daoine! A 'tòiseachadh bhon phròiseas stàlaidh agus a' crìochnachadh le bhith a 'cur iarrtasan.
Tha stairsneach inntrigidh glè ìosal aig an stòr-dàta seo. Faodaidh eadhon leasaiche le sgilean cuibheasach an stòr-dàta seo a chuir a-steach ann am beagan mhionaidean agus tòiseachadh air a chleachdadh. Bidh a h-uile dad ag obair gu soilleir. Faodaidh eadhon daoine a tha ùr do Linux an stàladh a làimhseachadh gu sgiobalta agus na h-obraichean as sìmplidh a dhèanamh. Nam biodh na bu thràithe, leis na faclan Big Data, Hadoop, Google BigTable, HDFS, bha beachdan aig leasaiche àbhaisteach gur ann mu dheidhinn cuid de terabytes, petabytes, a bha cuid de superhumans an sàs ann an suidheachaidhean agus leasachadh nan siostaman sin, an uairsin nuair a thàinig an ClickHouse stòr-dàta, fhuair sinn inneal sìmplidh, so-thuigsinn leis an urrainn dhut raon de ghnìomhan nach deach a choileanadh roimhe fhuasgladh. Cha toir e ach aon inneal meadhanach cuibheasach agus còig mionaidean airson a chuir a-steach. Is e sin, fhuair sinn stòr-dàta mar, mar eisimpleir, MySql, ach a-mhàin airson billeanan de chlàran a stòradh! Sàr-thasglann sònraichte leis a’ chànan SQL. Tha e mar gum biodh buill-airm nan coigreach air an toirt seachad do dhaoine.
Mun t-siostam clàraidh againn
Gus fiosrachadh a chruinneachadh, thathas a’ cleachdadh faidhlichean log IIS de thagraidhean lìn cruth àbhaisteach (tha sinn an-dràsta a’ parsadh logaichean tagraidh, ach is e am prìomh amas aig an ìre pìleat logaichean IIS a chruinneachadh).
Airson diofar adhbharan, cha b’ urrainn dhuinn stac ELK a thrèigsinn gu tur, agus tha sinn a’ leantainn air adhart a’ cleachdadh nam pàirtean LogStash agus Filebeat, a tha air iad fhèin a dhearbhadh gu math agus ag obair gu math earbsach agus ro-innseach.
Tha an sgeama logaidh coitcheann air a shealltainn anns an fhigear gu h-ìosal:
Is e feart de sgrìobhadh dàta gu stòr-dàta ClickHouse gu math tric (aon uair san diog) de chlàran a chuir a-steach ann an baidsean mòra. Is e seo, a rèir coltais, am pàirt as “trioblaideach” a choinnicheas tu nuair a gheibh thu eòlas air a bhith ag obair le stòr-dàta ClickHouse an-toiseach: bidh an sgeama a’ fàs beagan nas iom-fhillte.
Chuidich am plugan airson LogStash, a chuireas a-steach dàta gu dìreach ann an ClickHouse, gu mòr an seo. Tha am pàirt seo air a chleachdadh air an aon fhrithealaiche ris an stòr-dàta fhèin. Mar sin, san fharsaingeachd, chan eilear a’ moladh a dhèanamh, ach bho shealladh practaigeach, gus nach cuir thu a-mach frithealaichean fa leth fhad ‘s a tha e air a chleachdadh air an aon fhrithealaiche. Chan fhaca sinn fàilligidhean no còmhstri ghoireasan sam bith leis an stòr-dàta. A bharrachd air an sin, bu chòir a thoirt fa-near gu bheil inneal ath-chuairteachaidh aig a ’plugan gun fhios nach bi mearachdan ann. Agus ma tha mearachdan ann, bidh am plugan a’ sgrìobhadh gu diosc baidse de dhàta nach gabhadh a chuir a-steach (tha cruth an fhaidhle goireasach: às deidh deasachadh, is urrainn dhut am baidse ceartaichte a chuir a-steach gu furasta le bhith a’ cleachdadh clickhouse-client).
Tha liosta iomlan de bhathar-bog a chaidh a chleachdadh san sgeama air a thaisbeanadh sa chlàr:
Liosta de bhathar-bog a chaidh a chleachdadh
Tiotal
Tuairisgeul
Ceangal sgaoilidh
NGINX
Reverse-proxy gus ruigsinneachd le puirt a chuingealachadh agus ùghdarras a chuir air dòigh
An-dràsta nach eil air a chleachdadh san sgeama
FileBeat
Gluasad logaichean faidhle.
logstash
Neach-cruinneachaidh logaichean.
Air a chleachdadh airson logaichean a chruinneachadh bho FileBeat, a bharrachd air a bhith a’ tional logaichean bhon ciudha RabbitMQ (airson frithealaichean a tha san DMZ.)
Logstash-toradh-clickhouse
Plugin Loagstash airson logaichean a ghluasad gu stòr-dàta ClickHouse ann an baidsean
/usr/share/logstash/bin/logstash-plugin stàladh logstash-output-clickhouse
/usr/share/logstash/bin/logstash-plugin stàlaich logstash-filter-prune
/usr/share/logstash/bin/logstash-plugin stàlaich logstash-filter-multiline
Cliog Taigh
Stòradh log
Thoir an aire. A’ tòiseachadh bhon Lùnastal 2018, nochd togalaichean rpm “àbhaisteach” airson RHEL ann an stòr Yandex, gus an urrainn dhut feuchainn rin cleachdadh. Aig àm an stàlaidh, bha sinn a’ cleachdadh phasganan a thog Altinity.
grafana
Lèirsinn log. A 'suidheachadh clàran-bùird
Redhat & Centos (64 Bit) - an tionndadh as ùire
Stòr-dàta ClickHouse airson Grafana 4.6+
Plugin airson Grafana le stòr dàta ClickHouse
logstash
Log router bho FileBeat gu ciudha RabbitMQ.
Thoir an aire. Gu mì-fhortanach, chan eil toradh dìreach aig FileBeat gu RabbitMQ, agus mar sin tha feum air ceangal eadar-mheadhanach ann an cruth Logstash
CoineanachMQ
ciudha teachdaireachd. Is e seo am bufair log anns an DMZ
Erlang Runtime (riatanach airson RabbitMQ)
Erlang ùine ruith. Riatanach airson RabbitMQ a bhith ag obair
Tha rèiteachadh an fhrithealaiche leis an stòr-dàta ClickHouse air a thaisbeanadh sa chlàr a leanas:
Tiotal
luach
thuirt
Rèiteachadh
HDD: 40GB
RAM: 8GB
Pròiseasar: Core 2 2Ghz
Feumar aire a thoirt do na molaidhean airson a bhith ag obrachadh stòr-dàta ClickHouse (
Coitcheann bathar-bog siostam
OS: Frithealaiche Red Hat Enterprise Linux (Maipo)
JRE (Java 8)
Mar a chì thu, is e stèisean-obrach àbhaisteach a tha seo.
Tha structar a 'bhùird airson logaichean a stòradh mar a leanas:
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;
Bidh sinn a’ cleachdadh sgaradh bunaiteach (a rèir mìos) agus granularity clàr-amais. Tha a h-uile raon gu ìre mhòr a’ freagairt ri inntrigidhean log IIS airson iarrtasan http logadh. Air leth, tha sinn a 'toirt fa-near gu bheil raointean fa leth ann airson utm-tags a stòradh (tha iad air am parsadh aig ìre cuir a-steach don bhòrd bhon raon sreang ceiste).
Cuideachd, chaidh grunn raointean siostam a chuir ris a’ chlàr gus fiosrachadh a stòradh mu shiostaman, co-phàirtean, frithealaichean. Faic an clàr gu h-ìosal airson tuairisgeul air na raointean sin. Ann an aon chlàr, bidh sinn a 'stòradh logaichean airson grunn shiostaman.
Tiotal
Tuairisgeul
Eisimpleir:
fld_app_name
Ainm an tagraidh / an t-siostaim
Luachan dligheach:
- site1.domain.com Làrach a-muigh 1
- site2.domain.com Làrach a-muigh 2
- internal-site1.domain.local Làrach a-staigh 1
làrach1.domain.com
fld_app_modal
Modal siostam
Luachan dligheach:
- lìn - Làrach-lìn
- svc - seirbheis làrach-lìn
- intgr - Seirbheis Lìn Amalachaidh
- bo - Rianachd (BackOffice)
-lìn
fld_website_name
Ainm na làraich ann an IIS
Faodar grunn shiostaman a chleachdadh air aon fhrithealaiche, no eadhon grunn shuidheachaidhean de aon mhodal siostam
prìomh-lìn
fld_server_name
Ainm an fhrithealaiche
lìn1.domain.com
fld_log_file_name
Slighe chun an fhaidhle log air an fhrithealaiche
C: inetpublogsLogFiles
W3SVC1u_ex190711.log
Leigidh seo leat grafaichean a thogail gu h-èifeachdach ann an Grafana. Mar eisimpleir, faic iarrtasan bho aghaidh siostam sònraichte. Tha seo coltach ris a 'chunntair làraich ann an Yandex.Metrica.
Seo beagan staitistig air cleachdadh an stòr-dàta airson dà mhìos.
An àireamh de chlàran air am briseadh sìos le siostaman agus na co-phàirtean aca
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.)
An uiread de dhàta air an diosg
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.
An ìre de dhlùthadh dàta ann an colbhan
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.
Tuairisgeul air na co-phàirtean a chaidh a chleachdadh
FileBeat. A 'gluasad logaichean faidhle
Bidh am pàirt seo a’ cumail sùil air atharrachaidhean air faidhlichean loga air diosc agus a’ dol seachad air an fhiosrachadh gu LogStash. Air a chuir a-steach air a h-uile frithealaiche far a bheil faidhlichean log air an sgrìobhadh (mar as trice IIS). Ag obair ann am modh earbaill (ie a’ gluasad dìreach na clàran a bharrachd ris an fhaidhle). Ach fa leth faodar a rèiteachadh gus faidhlichean slàn a ghluasad. Tha seo feumail nuair a dh'fheumas tu dàta a luchdachadh sìos bho mhìosan roimhe. Dìreach cuir am faidhle log ann am pasgan agus leughaidh e e gu h-iomlan.
Nuair a thèid an t-seirbheis a stad, chan eil an dàta air a ghluasad nas fhaide chun stòradh.
Tha suidheachadh eisimpleir a 'coimhead mar seo:
faidhlebeat.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. Neach-cruinneachaidh Logaichean
Tha am pàirt seo air a dhealbhadh gus inntrigidhean log fhaighinn bho FileBeat (no tro ciudha RabbitMQ), a’ parsadh agus a’ cuir a-steach batches a-steach do stòr-dàta ClickHouse.
Airson a chuir a-steach do ClickHouse, thèid am plugan Logstash-output-clickhouse a chleachdadh. Tha inneal ath-iarrtais aig plugan Logstash, ach le dùnadh cunbhalach, tha e nas fheàrr stad a chuir air an t-seirbheis fhèin. Nuair a thèid stad a chuir air, thèid teachdaireachdan a chruinneachadh ann an ciudha RabbitMQ, mar sin ma tha an stad airson ùine mhòr, tha e nas fheàrr stad a chuir air Filebeats air na frithealaichean. Ann an sgeama far nach eilear a’ cleachdadh RabbitMQ (air an lìonra ionadail, bidh Filebeat a’ cur logaichean gu Logstash gu dìreach), bidh Filebeats ag obair gu math iomchaidh agus gu tèarainte, agus mar sin dhaibhsan chan eil an toradh ri fhaighinn a’ dol seachad gun bhuilean.
Tha suidheachadh eisimpleir a 'coimhead 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ìoban.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"
taigh-cliog. Stòradh log
Tha logaichean airson a h-uile siostam air an stòradh ann an aon chlàr (faic aig toiseach an artaigil). Thathas an dùil fiosrachadh a stòradh mu iarrtasan: tha a h-uile paramadair coltach ri diofar chruthan, leithid logaichean IIS, logaichean apache agus nginx. Airson logaichean tagraidh, anns a bheil, mar eisimpleir, mearachdan, teachdaireachdan fiosrachaidh, rabhaidhean air an clàradh, thèid clàr air leth a thoirt seachad leis an structar iomchaidh (aig an ìre dealbhaidh an-dràsta).
Nuair a bhios tu a 'dealbhadh clàr, tha e glè chudromach co-dhùnadh a dhèanamh air a' phrìomh iuchair (leis an tèid an dàta a rèiteachadh aig àm stòraidh). Tha an ìre de dhlùthadh dàta agus astar ceiste an urra ri seo. Anns an eisimpleir againn, is e am prìomh rud
ORDER BY (fld_app_name, fld_app_module, logdatetime)
Is e sin, le ainm an t-siostaim, ainm co-phàirt an t-siostaim agus ceann-latha an tachartais. An toiseach, thàinig ceann-latha an tachartais an toiseach. An dèidh a ghluasad chun an àite mu dheireadh, thòisich fiosan ag obair mu dhà uair cho luath. Gus am prìomh iuchair atharrachadh feumaidh tu an clàr ath-chruthachadh agus an dàta ath-luchdachadh gus an ath-sheòrsaich ClickHouse an dàta air diosc. Is e obair throm a tha seo, agus mar sin is e deagh bheachd a th’ ann smaoineachadh tòrr mu na bu chòir a bhith air a ghabhail a-steach san iuchair seòrsa.
Bu chòir a thoirt fa-near cuideachd gu bheil an seòrsa dàta LowCardinality air nochdadh gu ìre mhath ann an dreachan o chionn ghoirid. Nuair a bhios tu ga chleachdadh, tha meud an dàta teannachaidh air a lughdachadh gu mòr airson na raointean sin aig a bheil cardinality ìosal (glè bheag de roghainnean).
Tha tionndadh 19.6 ga chleachdadh an-dràsta agus tha sinn an dùil feuchainn ri ùrachadh chun dreach as ùire. Tha feartan cho iongantach aca ri Adaptive Granularity, Skipping clàran-amais agus an codec DoubleDelta, mar eisimpleir.
Gu gnàthach, rè an stàlaidh, tha an ìre logaidh air a shuidheachadh gus lorg. Tha na logaichean air an cuairteachadh agus air an tasgadh, ach aig an aon àm leudaichidh iad suas gu gigabyte. Mura h-eil feum air, faodaidh tu an ìre rabhaidh a shuidheachadh, an uairsin tha meud an loga air a lughdachadh gu mòr. Tha an suidheachadh logaidh air a shuidheachadh anns an fhaidhle config.xml:
<!-- Possible levels: https://github.com/pocoproject/poco/blob/develop/Foundation/include/Poco/Logger. h#L105 -->
<level>warning</level>
Cuid de òrdughan feumail
Поскольку оригинальные пакеты установки собираются по 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 router bho FileBeat gu ciudha RabbitMQ
Tha am pàirt seo air a chleachdadh gus logaichean a ghluasad bho FileBeat gu ciudha RabbitMQ. Tha dà phuing an seo:
- Gu mì-fhortanach, chan eil plugan toraidh aig FileBeat airson sgrìobhadh gu dìreach gu RabbitMQ. Agus chan eil an leithid de ghnìomhachd, a’ breithneachadh leis a’ chùis air an github, air a phlanadh airson a bhuileachadh. Tha plugan ann airson Kafka, ach airson adhbhar air choireigin chan urrainn dhuinn a chleachdadh aig an taigh.
- Tha riatanasan ann airson logaichean a chruinneachadh anns an DMZ. Stèidhichte orra, feumar na logaichean a chuir ris a’ chiudha an toiseach agus an uairsin leugh LogStash na h-inntrigidhean bhon ciudha bhon taobh a-muigh.
Mar sin, is ann airson a ’chùis far a bheil frithealaichean suidhichte anns an DMZ a dh’ fheumas aon sgeama a tha beagan iom-fhillte a chleachdadh. Tha eisimpleir de rèiteachadh a 'coimhead 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
}
}
CoineanachMQ. ciudha teachdaireachd
Tha am pàirt seo air a chleachdadh gus inntrigidhean logaichean bufair anns an DMZ. Tha clàradh air a dhèanamh tro ghrunn Filebeat → LogStash. Tha leughadh air a dhèanamh bho thaobh a-muigh an DMZ tro LogStash. Nuair a bhios tu ag obair tro RabboitMQ, bidh timcheall air 4 mìle teachdaireachd gach diog air an giullachd.
Tha slighe teachdaireachd air a rèiteachadh a rèir ainm an t-siostaim, i.e. stèidhichte air dàta rèiteachaidh FileBeat. Bidh a h-uile brath a’ dol gu aon ciudha. Ma thèid an t-seirbheis ciudha a stad airson adhbhar air choireigin, cha lean seo gu call teachdaireachdan: gheibh FileBeats mearachdan ceangail agus cuiridh e stad air cur air falbh airson ùine. Agus gheibh LogStash a leughas bhon ciudha cuideachd mearachdan lìonra agus feitheamh gus an tèid an ceangal ath-nuadhachadh. Anns a 'chùis seo, cha tèid an dàta, gu dearbh, a sgrìobhadh chun stòr-dàta tuilleadh.
Tha an stiùireadh a leanas air a chleachdadh gus ciudha a chruthachadh agus a rèiteachadh:
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. Dashboards
Tha am pàirt seo air a chleachdadh gus dàta sgrùdaidh fhaicinn. Anns a ’chùis seo, feumaidh tu an stòr-dàta ClickHouse a stàladh airson plugan Grafana 4.6+. Bha againn ri beagan tweak a dhèanamh air gus èifeachdas giollachd sìoltachain SQL air an deas-bhòrd a leasachadh.
Mar eisimpleir, bidh sinn a’ cleachdadh caochladairean, agus mura h-eil iad air an suidheachadh anns an raon sìoltachain, bu mhath leinn gun a bhith a’ gineadh suidheachadh ann an WHERE of the form ( uriStem = » AGUS uriStem ! = » ). Anns a’ chùis seo, leughaidh ClickHouse an colbh uriStem. San fharsaingeachd, dh’ fheuch sinn ri diofar roghainnean agus mu dheireadh cheartaich sinn am plugan (am macro $valueIfEmpty) gus an till e 1 a thaobh luach falamh, gun luaidh air a’ cholbh fhèin.
Agus a-nis faodaidh tu a’ cheist seo a chleachdadh airson a’ 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 tha ag eadar-theangachadh don SQL seo (thoir an aire gu bheil na raointean uriStem falamh air an atharrachadh gu dìreach 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
co-dhùnadh
Tha coltas stòr-dàta ClickHouse air a thighinn gu bhith na thachartas sònraichte sa mhargaidh. Bha e duilich a shamhlachadh, gu tur an-asgaidh, gun robh sinn sa bhad armaichte le inneal cumhachdach agus practaigeach airson a bhith ag obair le dàta mòr. Gu dearbh, le feumalachdan a tha a 'sìor fhàs (mar eisimpleir, sgoltadh agus ath-riochdachadh gu iomadh seirbheisiche), bidh an sgeama a' fàs nas iom-fhillte. Ach air a 'chiad bheachdan, tha e glè thlachdmhor a bhith ag obair leis an stòr-dàta seo. Chìthear gu bheil an toradh air a dhèanamh "airson daoine."
An coimeas ri ElasticSearch, thathas a’ meas gun tèid cosgais stòradh agus giullachd logaichean a lughdachadh còig gu deich tursan. Ann am faclan eile, ma dh’ fheumadh sinn grunn innealan a stèidheachadh airson an ìre dàta a th ’ann an-dràsta, an uairsin nuair a bhios sinn a’ cleachdadh ClickHouse, tha aon inneal cumhachd ìosal gu leòr dhuinn. Tha, gu dearbh, tha innealan teannachaidh dàta air-diosg agus feartan eile aig ElasticSearch a dh’ fhaodadh caitheamh ghoireasan a lughdachadh gu mòr, ach an taca ri ClickHouse, bidh seo nas daoire.
Às aonais optimizations sònraichte sam bith air ar taobh, air na roghainnean bunaiteach, bidh luchdachadh dàta agus taghadh bhon stòr-dàta ag obair aig astar iongantach. Chan eil mòran dàta againn fhathast (mu 200 millean clàr), ach tha am frithealaiche fhèin lag. Faodaidh sinn an inneal seo a chleachdadh san àm ri teachd airson adhbharan eile nach eil co-cheangailte ri bhith a’ stòradh logaichean. Mar eisimpleir, airson mion-sgrùdadh deireadh-gu-deireadh, ann an raon tèarainteachd, ionnsachadh innealan.
Aig a 'cheann thall, beagan mu na buannachdan agus na cunntasan.
Минусы
- A luchdachadh a-nuas clàr ann am buidhnean mòra. Air an aon làimh, is e feart a tha seo, ach feumaidh tu fhathast co-phàirtean a bharrachd a chleachdadh airson clàran buffering. Chan eil an obair seo an-còmhnaidh furasta, ach tha e fhathast ri fhuasgladh. Agus bu mhath leam an sgeama a dhèanamh nas sìmplidhe.
- Bidh cuid de ghnìomhachd exotic no feartan ùra gu tric a’ briseadh ann an dreachan ùra. Tha seo ag adhbhrachadh dragh, a 'lùghdachadh a' mhiann airson ùrachadh gu dreach ùr. Mar eisimpleir, tha einnsean clàr Kafka na fheart glè fheumail a leigeas leat tachartasan Kafka a leughadh gu dìreach, gun a bhith a’ cur an gnìomh luchd-cleachdaidh. Ach a 'breithneachadh leis an àireamh de chùisean air an github, tha sinn fhathast faiceallach gun a bhith a' cleachdadh an einnsean seo ann an riochdachadh. Ach, mura dèan thu gluasadan gu h-obann air an taobh agus a 'cleachdadh a' phrìomh dhleastanas, bidh e ag obair gu seasmhach.
Плюсы
- Chan eil e nas slaodaiche.
- Ìre inntrigidh ìosal.
- Stòr fosgailte.
- Saor.
- Sgèile gu math (sgrìobadh / ath-riochdachadh a-mach às a’ bhogsa)
- Air a ghabhail a-steach sa chlàr de bhathar-bog Ruiseanach a mhol Ministrealachd a’ Chonaltraidh.
- Tha làthaireachd oifigeil taic bho Yandex.
Source: www.habr.com