Ma tha thu a-riamh air eadar-aghaidh lìn a chleachdadh airson logaichean fhaicinn, is dòcha gu bheil thu air mothachadh mar a tha, mar riaghailt, na h-eadar-aghaidh sin duilich agus (gu tric) chan eil iad gu math goireasach agus freagairteach. Faodaidh cuid a gheibh thu cleachdte ris, tha cuid gu tur uamhasach, ach tha e coltach riumsa gur e an adhbhar airson na duilgheadasan gu lèir gu bheil sinn a’ dèiligeadh ris a ’ghnìomh a bhith a’ coimhead air logaichean gu ceàrr: bidh sinn a ’feuchainn ri eadar-aghaidh lìn a chruthachadh far am bi an CLI (eadar-aghaidh loidhne-àithne) ag obair nas fheàrr. Tha mi gu pearsanta gu math comhfhurtail ag obair le earball, grep, awk agus feadhainn eile, agus mar sin dhòmhsa bhiodh an eadar-aghaidh air leth freagarrach airson a bhith ag obair le logaichean rudeigin coltach ri earball is grep, ach a dh’ fhaodadh a bhith air a chleachdadh cuideachd airson logaichean a thàinig bho iomadh seirbheisiche a leughadh. Is e sin, gu dearbh, leugh iad bho ClickHouse!
* a rèir beachd pearsanta an neach-cleachdaidh habra
Coinnich logscli
Cha do nochd mi ainm airson an eadar-aghaidh agam, agus, a bhith onarach, tha e ann an cruth prototype, ach ma tha thu airson an còd stòr fhaicinn sa bhad, tha fàilte ort:
Feartan
B’ e an t-amas a bh’ agam eadar-aghaidh a dhèanamh a bhiodh eòlach air an fheadhainn a tha cleachdte ri earball/grep, is e sin, taic a thoirt dha na rudan a leanas:
- Thoir sùil air a h-uile log, gun sìoladh.
- Fàg loidhnichean anns a bheil fo-thalamh stèidhichte (bratach
-F
уgrep
). - Fàg loidhnichean a tha a rèir an abairt àbhaisteach (bratach
-E
уgrep
). - Gu gnàthach, tha coimhead ann an òrdugh àraid, oir mar as trice bidh ùidh anns na clàran as ùire an-toiseach.
- Seall an co-theacsa ri taobh gach loidhne (roghainnean
-A
,-B
и-C
уgrep
, clò-bhualadh N loidhnichean ro, às deidh, agus timcheall air gach loidhne maidsidh, fa leth). - Thoir sùil air logaichean a tha a’ tighinn a-steach ann an àm fìor, le no às aonais sìoladh (gu bunaiteach
tail -f | grep
). - Feumaidh an eadar-aghaidh a bhith co-chòrdail ris
less
,head
,tail
agus feadhainn eile - gu bunaiteach, bu chòir toraidhean a thilleadh gun chuingealachaidhean air an àireamh aca; tha loidhnichean air an clò-bhualadh mar shruth fhad's a tha ùidh aig an neach-cleachdaidh ann a bhith gam faighinn; comharradhSIGPIPE
bu chòir dhaibh casg a chuir air sruthadh logaichean gu sàmhach, dìreach mar a nì iadtail
,grep
agus goireasan UNIX eile.
Реализация
Gabhaidh mi ris gu bheil fios agad mu thràth air dòigh air choireigin mar a lìbhrigeas tu logaichean gu ClickHouse. Mura h-eil, tha mi a 'moladh feuchainn air
An toiseach feumaidh tu co-dhùnadh mun sgeama bunaiteach. Leis gu bheil thu mar as trice ag iarraidh logaichean fhaighinn air an òrdachadh a rèir ùine, tha e coltach gu bheil e reusanta an stòradh san dòigh sin. Ma tha mòran roinnean log ann agus gu bheil iad uile den aon sheòrsa, faodaidh tu roinn log a dhèanamh mar a’ chiad cholbh den phrìomh iuchair - leigidh seo leat aon chlàr a bhith agad an àite grunn, rud a bhios na bhuannachd mhòr nuair a cuir a-steach gu ClickHouse (air frithealaichean le draibhearan cruaidh, thathas a’ moladh dàta a chuir a-steach gun a bhith nas fhaide na ~ 1 uair san diog airson an fhrithealaiche gu lèir).
Is e sin, feumaidh sinn timcheall air an sgeama clàr a leanas:
CREATE TABLE logs(
category LowCardinality(String), -- категория логов (опционально)
time DateTime, -- время события
millis UInt16, -- миллисекунды (могут быть и микросекунды, и т.д.): рекомендуется хранить, если событий много, чтобы было легче различать события между собой
..., -- ваши собственные поля, например имя сервера, уровень логирования, и так далее
message String -- текст сообщения
) ENGINE=MergeTree()
ORDER BY (category, time, millis)
Gu mì-fhortanach, cha b’ urrainn dhomh stòran fosgailte sam bith a lorg sa bhad le logaichean reusanta a b’ urrainn dhomh a ghlacadh agus a luchdachadh sìos, agus mar sin ghabh mi seo na àite mar eisimpleir
stiùireadh airson lèirmheasan Amazon a luchdachadh suas gu ClickHouse
Cruthaichidh sinn clàr:
CREATE TABLE amazon(
review_date Date,
time DateTime DEFAULT toDateTime(toUInt32(review_date) * 86400 + rand() % 86400),
millis UInt16 DEFAULT rand() % 1000,
marketplace LowCardinality(String),
customer_id Int64,
review_id String,
product_id LowCardinality(String),
product_parent Int64,
product_title String,
product_category LowCardinality(String),
star_rating UInt8,
helpful_votes UInt32,
total_votes UInt32,
vine FixedString(1),
verified_purchase FixedString(1),
review_headline String,
review_body String
)
ENGINE=MergeTree()
ORDER BY (time, millis)
SETTINGS index_granularity=8192
Ann an stòr-dàta Amazon chan eil ann ach ceann-latha airson ath-sgrùdadh, ach chan eil dearbh àm ann, mar sin lìon sinn a-steach an dàta seo le Randon.
Cha leig thu leas na faidhlichean tsv gu lèir a luchdachadh sìos agus thu fhèin a chuingealachadh ris a’ chiad ~ 10-20 gus seata dàta meadhanach mòr fhaighinn nach gabh a-steach do 16 GB de RAM. Gus faidhlichean TSV a luchdachadh suas chleachd mi an òrdugh a leanas:
for i in *.tsv; do
echo $i;
tail -n +2 $i | pv |
clickhouse-client --input_format_allow_errors_ratio 0.5 --query='INSERT INTO amazon(marketplace,customer_id,review_id,product_id,product_parent,product_title,product_category,star_rating,helpful_votes,total_votes,vine,verified_purchase,review_headline,review_body,review_date) FORMAT TabSeparated'
done
Air diosc seasmhach àbhaisteach (is e sin HDD) ann an Google Cloud le meud 1000 GB (ghabh mi am meud seo sa mhòr-chuid gus am biodh an astar beagan nas àirde, ged is dòcha gum biodh SSD den mheud riatanach air a bhith na bu shaoire) an luchdachadh suas bha astar timcheall air ~ 75 MB / diog air 4 cores.
- Feumaidh mi glèidheadh a dhèanamh gu bheil mi ag obair aig Google, ach chleachd mi cunntas pearsanta agus chan eil gnothach aig an artaigil seo ris an obair agam aig a’ chompanaidh
Bheir mi a-mach a h-uile dealbh leis an t-seata shònraichte seo, oir is e seo a h-uile rud a bha agam ri làimh.
Seall adhartas sganadh dàta
Leis ann an ClickHouse cleachdaidh sinn làn scan air clàr le logaichean, agus faodaidh an gnìomhachd seo tòrr ùine a thoirt agus is dòcha nach toir e toradh sam bith airson ùine mhòr ma lorgar glè bheag de gheamannan, tha e ciallach a bhith comasach air na adhartas na ceiste gus am faighear a’ chiad sreathan leis an toradh. Gus seo a dhèanamh, tha paramadair anns an eadar-aghaidh HTTP a leigeas leat adhartas a chuir ann an cinn HTTP: send_progress_in_http_headers=1
. Gu mì-fhortanach, chan urrainn don leabharlann àbhaisteach Go cinn-cinn a leughadh mar a gheibhear iad, ach tha an eadar-aghaidh HTTP 1.0 (gun a bhith air a mheasgadh le 1.1!) a’ faighinn taic bho ClickHouse, gus an urrainn dhut ceangal TCP amh fhosgladh gu ClickHouse agus a chuir an sin GET /?query=... HTTP/1.0nn
agus faigh na cinn-cinn freagairt agus am bodhaig gun teicheadh no crioptachadh, agus mar sin anns a’ chùis seo chan fheum sinn eadhon an leabharlann àbhaisteach a chleachdadh.
A’ sruthadh logaichean bho ClickHouse
Tha optimization air a bhith aig ClickHouse airson ceistean le ORDER BY airson ùine gu math fada (bho 2019?), Mar sin ceist mar
SELECT time, millis, message
FROM logs
WHERE message LIKE '%something%'
ORDER BY time DESC, millis DESC
Tòisichidh e sa bhad a’ tilleadh loidhnichean aig a bheil an fho-thalamh “rudeigin” san teachdaireachd aca, gun a bhith a’ feitheamh gus an tig an scan gu crìch.
Cuideachd, bhiodh e gu math goireasach nan cuireadh ClickHouse fhèin stad air an iarrtas nuair a chaidh an ceangal ris a dhùnadh, ach chan e seo an giùlan bunaiteach. Faodar cuir dheth iarrtas fèin-ghluasadach leis an roghainn seo cancel_http_readonly_queries_on_client_close=1
.
Làimhseachadh ceart air SIGPIPE ann an Go
Nuair a nì thu, abair, an àithne some_cmd | head -n 10
, dìreach mar a tha an àithne some_cmd
stad air cur gu bàs nuair head
thoir air falbh 10 loidhnichean? Tha am freagairt sìmplidh: cuin head
a’ tighinn gu crìch, bidh a’ phìob a’ dùnadh, agus tha stdout na h-àithne some_cmd a’ tòiseachadh a’ comharrachadh, gun chumhachan, “gu àite sam bith”. Cuin some_cmd
feuchainn ri sgrìobhadh gu pìob dùinte,
Ann an Go bidh seo cuideachd a’ tachairt gu bunaiteach, ach bidh inneal-làimhseachaidh chomharran SIGPIPE cuideachd a’ clò-bhualadh “signal: SIGPIPE” no teachdaireachd coltach ris aig an deireadh, agus airson an teachdaireachd seo a ghlanadh feumaidh sinn dìreach SIGPIPE a làimhseachadh mar a tha sinn ag iarraidh, is e sin, dìreach gu sàmhach fàgail:
ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGPIPE)
go func() {
<-ch
os.Exit(0)
}()
Seall co-theacs teachdaireachd
Gu tric bidh thu airson an co-theacsa fhaicinn anns an do thachair mearachd (mar eisimpleir, dè an t-iarrtas a dh’ adhbhraich clisgeadh, no dè na duilgheadasan co-cheangailte a bha rim faicinn ron tubaist), agus ann an grep
Tha seo air a dhèanamh leis na roghainnean -A, -B, agus -C, a sheallas an àireamh de loidhnichean ainmichte às deidh, roimhe, agus timcheall air an teachdaireachd, fa leth.
Gu mì-fhortanach, cha do lorg mi dòigh furasta air an aon rud a dhèanamh ann an ClickHouse, mar sin gus an co-theacsa a thaisbeanadh, thèid iarrtas a bharrachd mar seo a chuir gu gach loidhne den toradh (tha am mion-fhiosrachadh an urra ris an t-seòrsachadh agus a bheil an co-theacsa air a shealltainn roimhe seo. no às deidh):
SELECT time,millis,review_body FROM amazon
WHERE (time = 'ВРЕМЯ_СОБЫТИЯ' AND millis < МИЛЛИСЕКУНДЫ_СОБЫТИЯ) OR (time < 'ВРЕМЯ_СОБЫТИЯ')
ORDER BY time DESC, millis DESC
LIMIT КОЛИЧЕСТВО_СТРОК_КОНТЕКСТА
SETTINGS max_threads=1
Leis gu bheil an t-iarrtas air a chuir cha mhòr sa bhad às deidh ClickHouse an loidhne fhreagarrach a thilleadh, thig e gu crìch san tasgadan agus san fharsaingeachd tha an t-iarrtas air a chuir gu bàs gu math luath agus ag ithe beagan CPU (mar as trice bidh an t-iarrtas a’ toirt timcheall air ~ 6 ms air an inneal brìgheil agam).
Seall teachdaireachdan ùra ann an àm fìor
Gus teachdaireachdan a tha a’ tighinn a-steach a nochdadh ann an (cha mhòr) fìor-ùine, bidh sinn dìreach a’ cur an gnìomh an iarrtais aon uair a h-uile diog, a’ cuimhneachadh air an clàr-ama mu dheireadh a thachair sinn roimhe.
Eisimpleirean àithne
Cò ris a tha òrdughan àbhaisteach logscli coltach ann an cleachdadh?
Ma luchdaich thu sìos an stòr-dàta Amazon air an tug mi iomradh aig toiseach an artaigil, faodaidh tu na h-òrdughan a leanas a ruith:
# Показать строки, где встречается слово walmart
$ logscli -F 'walmart' | less
# Показать самые свежие 10 строк, где встречается "terrible"
$ logscli -F terrible -limit 10
# То же самое без -limit:
$ logscli -F terrible | head -n 10
# Показать все строки, подходящие под /times [0-9]/, написанные для vine и у которых высокий рейтинг
$ logscli -E 'times [0-9]' -where="vine='Y' AND star_rating>4" | less
# Показать все строки со словом "panic" и 3 строки контекста вокруг
$ logscli -F 'panic' -C 3 | less
# Непрерывно показывать новые строки со словом "5-star"
$ logscli -F '5-star' -tailf
iomraidhean
Tha an còd goireis (às aonais sgrìobhainnean) ri fhaighinn air github aig
Source: www.habr.com