Re ntse re nts'etsapele sehokelo se bonolo ka ho fetesisa lefatšeng* bakeng sa ho shebella likutu

Re ntse re nts'etsapele sehokelo se bonolo ka ho fetesisa lefatšeng* bakeng sa ho shebella likutu Haeba u kile ua sebelisa marang-rang a marang-rang ho sheba li-log, mohlomong u hlokometse hore na, ka molao, li-interfaces tsena li boima hakae 'me (hangata) ha li bonolo haholo ebile ha li arabele. Tse ling tseo u ka li tloaelang, tse ling li tšabeha ka ho feletseng, empa ho 'na ho bonahala eka lebaka la mathata ohle ke hore re atamela mosebetsi oa ho sheba lifate ka tsela e fosahetseng: re leka ho theha sebopeho sa websaete moo CLI (command line interface) e sebetsa hantle. 'Na ka bonna ke phutholohile haholo ho sebetsa le mohatla, grep, awk le ba bang, ka hona ho 'na sebopeho se loketseng sa ho sebetsa ka li-log e ka ba ntho e tšoanang le mohatla le grep, empa e ka boela ea sebelisoa ho bala lifate tse tsoang ho li-server tse ngata. Ke hore, ehlile, li bale ho tsoa ho ClickHouse!

*ho ea ka maikutlo a motho ea sebelisang habra LEFOKO LA hao

Kopana le logscli

Ha kea tla ka lebitso la sebopeho sa ka, 'me, ho bua 'nete, le teng ka sebopeho sa mohlala, empa haeba u batla ho bona khoutu ea mohloli hanghang, ua amoheleha: https://github.com/YuriyNasretdinov/logscli (350 mela e khethiloeng Go khoutu).

Likarolo

Sepheo sa ka e ne e le ho etsa sebopeho se neng se tla bonahala se tloaelehile ho ba tloaetseng ho mohatla / grep, ke hore, ho tšehetsa lintho tse latelang:

  1. Sheba lintlha tsohle, ntle le ho sefa.
  2. Tlohela mela e nang le mohala o tsitsitseng (folakha -F у grep).
  3. Tlohela mela e lumellanang le polelo e tloaelehileng (folakha -E у grep).
  4. Ka tloaelo, ho shebella ho latela tatellano ea morao-rao, kaha litlaleho tsa morao-rao hangata ke tsona tse khahlang pele.
  5. Hlahisa moelelo haufi le mola o mong le o mong (likhetho -A, -B и -C у grep, e hatisang mela ea N pele, ka morao, le ho potoloha mola o mong le o mong o bapisang, ka ho latellana).
  6. Sheba lits'oants'o tse kenang ka nako ea 'nete, ka ho sefa kapa ntle le ho sefa (ha e le hantle tail -f | grep).
  7. Sehokelo se tlameha ho lumellana le less, head, tail le ba bang - ka ho feletseng, liphetho li lokela ho khutlisetsoa ntle le lithibelo palo ea tsona; mela e hatisoa e le molatsoana ha feela mosebedisi a thahasella ho e amohela; sesupo SIGPIPE e lokela ho sitisa ho phalla ha log ka khutso, joalo ka ha ba etsa tail, grep le lisebelisoa tse ling tsa UNIX.

Ts'ebetsong

Ke tla nka hore ka tsela e itseng u se u ntse u tseba ho isa lits'oants'o ho ClickHouse. Haeba ha ho joalo, ke khothaletsa ho e leka LSD и ntlo ea katse, hammoho le sengoloa sena se mabapi le phano ea marang-rang.

Pele u lokela ho etsa qeto ka morero oa motheo. Kaha hangata u batla ho amohela likutu tse hlophisitsoeng ho ea ka nako, ho bonahala ho utloahala ho li boloka joalo. Haeba ho na le mekhahlelo e mengata ea li-log 'me kaofela e le tsa mofuta o le mong, joale u ka etsa sehlopha sa log e le kholomo ea pele ea senotlolo sa mantlha - sena se tla u lumella ho ba le tafole e le' ngoe ho e-na le tse 'maloa, e tla ba kholo e kholo ha ho kenya ho ClickHouse (ho li-server tse nang le li-hard drive, ho kgothaletswa ho kenya data ho feta ~ makhetlo a 1 motsotsoana bakeng sa seva kaofela).

Ke hore, re hloka hoo e batlang e le moralo o latelang oa tafole:

CREATE TABLE logs(
    category LowCardinality(String), -- категория логов (опционально)
    time DateTime, -- время события
    millis UInt16, -- миллисекунды (могут быть и микросекунды, и т.д.): рекомендуется хранить, если событий много, чтобы было легче различать события между собой
    ..., -- ваши собственные поля, например имя сервера, уровень логирования, и так далее
    message String -- текст сообщения
) ENGINE=MergeTree()
ORDER BY (category, time, millis)

Ka bomalimabe, ha kea ka ka fumana hanghang mehloli efe kapa efe e bulehileng e nang le lintlha tsa nnete tseo nka li nkang le ho li khoasolla, kahoo ke nkile sena joalo ka mohlala. maikutlo a lihlahisoa tse tsoang Amazon pele ho 2015. Ha e le hantle, sebopeho sa bona ha se tšoane hantle le sa litokomane tsa mongolo, empa bakeng sa merero ea papiso sena ha se bohlokoa.

litaelo tsa ho kenya litlhahlobo tsa Amazon ho ClickHouse

Ha re theheng tafole:

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

Setsing sa data sa Amazon ho na le letsatsi feela la tlhahlobo, empa ha ho na nako e tobileng, kahoo a re ke re tlatse data ena ka randon.

Ha ua tlameha ho khoasolla lifaele tsohle tsa tsv mme u ipehele moeli ho ea pele ~ 10-20 e le hore u fumane sete e kholo ea data e ke keng ea lekana 16 GB ea RAM. Ho kenya lifaele tsa TSV ke sebelisitse taelo e latelang:

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

Ho Persistent Disk e tloaelehileng (e leng HDD) ho Google Cloud e nang le boholo ba 1000 GB (ke ile ka nka boholo bona haholo-holo e le hore lebelo le phahame hanyenyane, le hoja mohlomong SSD ea boholo bo hlokahalang e ka be e theko e tlaase) ho kenya. lebelo le ne le ka ba ~ 75 MB/sec ho li-cores tse 4.

  • Ke tlameha ho etsa pehelo ea hore ke sebetsa ho Google, empa ke sebelisitse ak'haonte ea hau mme sengoloa sena ha se amane letho le mosebetsi oa ka k'hamphaning.

Ke tla hlahisa lipapiso tsohle ka dataset ena, kaha ke eona feela eo ke neng ke e-na le eona.

Bontša tsoelo-pele ea ho hlahloba lintlha

Kaha ho ClickHouse re tla sebelisa scan e feletseng tafoleng e nang le li-logs, 'me ts'ebetso ena e ka nka nako e ngata' me e ka 'na ea se ke ea hlahisa liphello ka nako e telele haeba ho fumanoa lipapali tse seng kae, ho bohlokoa hore u khone ho bontša tsoelo-pele ea potso ho fihlela mela ea pele e nang le sephetho e amoheloa. Ho etsa sena, ho na le parameter sehokelong sa HTTP se u lumellang hore u romelle tsoelo-pele ho lihlooho tsa HTTP: send_progress_in_http_headers=1. Ka bomalimabe, laebrari e tloaelehileng ea Go ha e khone ho bala lihlooho ha li amoheloa, empa sebopeho sa HTTP 1.0 (ha sea lokela ho ferekanngoa le 1.1!) se tšehetsoa ke ClickHouse, kahoo u ka bula khokahanyo e tala ea TCP ho ClickHouse le ho e romela moo. GET /?query=... HTTP/1.0nn 'me u fumane lihlooho tsa karabo le' mele ntle le ho phonyoha kapa ho ngoloa, kahoo tabeng ena ha ho hlokahale hore re sebelise laebrari e tloaelehileng.

Ho phallela ho tsoa ho ClickHouse

ClickHouse e bile le optimization bakeng sa lipotso ka ORDER BY ka nako e telele (ho tloha ka 2019?), kahoo potso e kang

SELECT time, millis, message
FROM logs
WHERE message LIKE '%something%'
ORDER BY time DESC, millis DESC

Hang-hang e tla qala ho khutlisa mela e nang le "ntho" e nyenyane molaetseng oa eona, ntle le ho emela hore scan ninete e felile.

Hape, ho ka ba bonolo haholo haeba ClickHouse ka boeona e hlakola kopo ha khokahano ho eona e koetsoe, empa sena ha se boitšoaro bo sa feleng. Ho hlakola kopo ka bohona ho ka nolofalloa ho sebelisoa khetho cancel_http_readonly_queries_on_client_close=1.

Ts'ebetso e nepahetseng ea SIGPIPE ho Go

Ha o phethahatsa, e re, taelo some_cmd | head -n 10, hantle kamoo taelo some_cmd e emisa ho phethahatsa ha head e ntšitse mela e 10? Karabo e bonolo: neng head e qetella, phala e koala, 'me stdout ea some_cmd taelo e qala ho supa, ka maemo, "ho se hokae". Neng some_cmd leka ho ngolla phala e koetsoeng, e amohela lets'oao la SIGPIPE, le emisang lenaneo ka khutso ka mokhoa o ikhethileng.

Ho Go sena le sona se etsahala ka boiketsetso, empa sesebelisoa sa matšoao sa SIGPIPE se boetse se hatisa "signal: SIGPIPE" kapa molaetsa o ts'oanang qetellong, mme ho hlakola molaetsa ona re hloka feela ho sebetsana le SIGPIPE ka tsela eo re batlang, ke hore, ka khutso feela. Etsoa:

ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGPIPE)
go func() {
    <-ch
    os.Exit(0)
}()

Hlahisa moelelo oa molaetsa

Hangata u batla ho bona maemo ao phoso e 'ngoe e etsahetseng ho ona (mohlala, ke kopo efe e bakileng ts'oenyeho, kapa mathata a amanang le ona a neng a bonahala pele ho ho oa), le ho grep Sena se etsoa ho sebelisoa likhetho tsa -A, -B, le -C, tse bonts'ang palo e boletsoeng ea mela kamora, pele, le ho potoloha molaetsa, ka ho latellana.

Ka bomalimabe, ha ke so fumane mokhoa o bonolo oa ho etsa se tšoanang ho ClickHouse, kahoo ho bonts'a moelelo oa taba, kopo e eketsehileng e kang ena e romelloa moleng o mong le o mong oa sephetho (lintlha li itšetlehile ka ho hlophisoa le hore na moelelo o bontšitsoe pele. kapa ka morao):

SELECT time,millis,review_body FROM amazon
WHERE (time = 'ВРЕМЯ_СОБЫТИЯ' AND millis < МИЛЛИСЕКУНДЫ_СОБЫТИЯ) OR (time < 'ВРЕМЯ_СОБЫТИЯ')
ORDER BY time DESC, millis DESC
LIMIT КОЛИЧЕСТВО_СТРОК_КОНТЕКСТА
SETTINGS max_threads=1

Kaha kopo e rometsoe hang hang ka mor'a hore ClickHouse e khutlisetse mohala o tsamaisanang le eona, e qetella e le ka har'a cache mme ka kakaretso kopo e etsoa kapele mme e ja CPU e nyane (hangata kopo e nka ~ 6 ms mochining oa ka o hlakileng).

Hlahisa melaetsa e mecha ka nako ea sebele

E le ho hlahisa melaetsa e kenang ka (hoo e batlang e le) ka nako ea sebele, re etsa kopo hang ka mor'a metsotsoana e meng le e meng, re hopola setempe sa ho qetela seo re kopaneng le sona pele.

Mehlala ea litaelo

Litaelo tse tloaelehileng tsa logscli li shebahala joang ts'ebetsong?

Haeba u khoasolla dataset ea Amazon eo ke e boletseng qalong ea sengoloa, u ka tsamaisa litaelo tse latelang:

# Показать строки, где встречается слово 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

litšupiso

Khoutu ea ts'ebeliso (ntle le litokomane) e fumaneha ho github ho https://github.com/YuriyNasretdinov/logscli. Nka thabela ho utloa maikutlo a hau mabapi le mohopolo oa ka bakeng sa sehokelo sa khomphutha bakeng sa ho shebella likutu tse thehiloeng ho ClickHouse.

Source: www.habr.com

Eketsa ka tlhaloso