Ke hoʻomohala nei mākou i ke kikowaena kūpono loa ma ka honua * no ka nānā ʻana i nā lāʻau

Ke hoʻomohala nei mākou i ke kikowaena kūpono loa ma ka honua * no ka nānā ʻana i nā lāʻau Inā ua hoʻohana mua ʻoe i nā loulou pūnaewele e nānā i nā lāʻau, a laila ua ʻike paha ʻoe pehea, ma ke ʻano he kānāwai, paʻakikī kēia mau pilina a (pinepine) ʻaʻole kūpono a pane. Hiki iā ʻoe ke hoʻomaʻamaʻa i kekahi, weliweli loa kekahi, akā i koʻu manaʻo ʻo ke kumu o nā pilikia āpau ke hoʻokokoke nei mākou i ka hana o ka nānā ʻana i nā lāʻau me ka hewa ʻole: hoʻāʻo mākou e hana i kahi kikowaena pūnaewele kahi o ka CLI (ka laina kauoha). hana maikaʻi. ʻO wau iho ʻoluʻolu loa i ka hana ʻana me ka huelo, grep, awk a me nā mea ʻē aʻe, a no laila noʻu ʻo ke kikowaena kūpono no ka hana ʻana me nā lāʻau e like me ka huelo a me ka grep, akā hiki ke hoʻohana ʻia e heluhelu i nā lāʻau i hele mai mai nā kikowaena he nui. ʻO ia, ʻoiaʻiʻo, heluhelu iā lākou mai ClickHouse!

*e like me ka manaʻo pilikino o ka mea hoʻohana habra kou ROCK

Hui logscli

ʻAʻole wau i hele mai me kahi inoa no kaʻu interface, a, ʻoiaʻiʻo, aia ia ma ke ʻano o kahi prototype, akā inā makemake ʻoe e ʻike koke i ke kumu kumu, a laila ʻoluʻolu ʻoe: https://github.com/YuriyNasretdinov/logscli (350 laina o ke code Go i koho ʻia).

Nā Kūlana

ʻO kaʻu pahuhopu, ʻo ia ka hana ʻana i kahi interface i ʻike ʻia e ka poʻe i maʻa i ka huelo/grep, ʻo ia hoʻi, ke kākoʻo i kēia mau mea:

  1. Nānā i nā lāʻau a pau, me ka kānana ʻole.
  2. E waiho i nā laina i loaʻa kahi substring paʻa (flag -F у grep).
  3. E waiho i nā laina e pili ana i ka ʻōlelo maʻamau (flag -E у grep).
  4. ʻO ka mea paʻamau, ʻo ka nānā ʻana ma ke ʻano o ka manawa hoʻololi, no ka mea, ʻo nā moʻolelo hou loa ka mea makemake mua.
  5. Hōʻike i ka pōʻaiapili ma hope o kēlā me kēia laina (koho -A, -B и -C у grep, paʻi ʻana i nā laina N ma mua, ma hope, a puni kēlā me kēia laina pili, kēlā me kēia).
  6. E nānā i nā lāʻau e hiki mai ana i ka manawa maoli, me ka kānana ʻole a i ʻole tail -f | grep).
  7. Pono e kūpono ka interface me less, head, tail a me nā mea ʻē aʻe - ma ke ʻano maʻamau, pono e hoʻihoʻi ʻia nā hopena me ka ʻole o ka palena o kā lākou helu; paʻi ʻia nā laina ma ke ʻano he kahawai inā makemake ka mea hoʻohana e loaʻa iā lākou; hōʻailona SIGPIPE pono e hoʻopau mālie i ka hoʻoheheʻe log, e like me kā lākou hana tail, grep a me nā pono UNIX ʻē aʻe.

Ka hoʻokō

Manaʻo wau ua ʻike mua ʻoe i ka hāʻawi ʻana i nā lāʻau i ClickHouse. Inā ʻaʻole, paipai wau e hoʻāʻo lsd и hale puaʻa, a me kēia ʻatikala e pili ana i ka lawe ʻana i ka lāʻau.

Pono mua ʻoe e hoʻoholo i ka papahana kumu. No ka mea makemake mau ʻoe e loaʻa nā lāʻau i hoʻokaʻawale ʻia e ka manawa, manaʻo pono ke mālama iā lākou i kēlā ala. Inā he nui nā ʻano lāʻau a he ʻano like lākou a pau, a laila hiki iā ʻoe ke hana i kahi ʻano lāʻau e like me ke kolamu mua o ke kī nui - e ʻae kēia iā ʻoe e loaʻa i hoʻokahi papaʻaina ma mua o nā mea he nui, a he mea nui ia i ka wā e hoʻokomo i loko o ClickHouse (ma nā kikowaena me nā paʻakikī paʻakikī, ua ʻōlelo ʻia e hoʻokomo i ka ʻikepili ma mua o ~1 manawa i kēlā me kēia kekona. no ke kikowaena holoʻokoʻa).

ʻO ia hoʻi, pono mākou e pili ana i ka papahana papaʻaina:

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

ʻO ka mea pōʻino, ʻaʻole hiki iaʻu ke loaʻa koke i nā kumu wehe me nā lāʻau maoli i hiki iaʻu ke hopu a hoʻoiho, no laila ua lawe au i kēia ma ke ʻano he laʻana. nā loiloi o nā huahana mai Amazon a hiki i 2015. ʻO kaʻoiaʻiʻo, ʻaʻole like ko lākou ʻano me ko nā loina kikokikona, akā no nā kumu hoʻohālike ʻaʻole ia he mea nui.

nā kuhikuhi no ka hoʻouka ʻana i nā loiloi Amazon i ClickHouse

E hana kākou i papaʻaina:

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

Ma ka papa helu Amazon he lā wale nō no ka loiloi, akā ʻaʻohe manawa kūpono, no laila e hoʻopiha i kēia ʻikepili me kahi randon.

ʻAʻole pono ʻoe e hoʻoiho i nā faila tsv āpau a kaupalena iā ʻoe iho i ka mua ~ 10-20 i mea e loaʻa ai kahi pūʻulu nui o ka ʻikepili i kūpono ʻole i ka 16 GB o RAM. No ka hoʻouka ʻana i nā faila TSV ua hoʻohana au i kēia kauoha:

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

Ma kahi Disk Persistent maʻamau (ʻo ia ka HDD) ma Google Cloud me ka nui o 1000 GB (Ua lawe au i kēia nui i mea ʻoi aku ka kiʻekiʻe o ka wikiwiki, ʻoiai ʻoi aku ka liʻiliʻi o ka SSD o ka nui i makemake ʻia) ka hoʻouka ʻana. ʻO ka wikiwiki ma kahi o ~ 75 MB/sec ma 4 cores.

  • Pono wau e hoʻopaʻa i kaʻu hana ma Google, akā ua hoʻohana au i kahi moʻokāki pilikino a ʻaʻohe pili kēia ʻatikala me kaʻu hana ma ka hui.

E hana wau i nā kiʻi a pau me kēia ʻikepili kikoʻī, ʻoiai ʻo ia wale nō kaʻu i ka lima.

Hōʻike i ka holomua ʻimi ʻikepili

No ka mea ma ClickHouse e hoʻohana mākou i kahi scan piha ma ka papa me nā lāʻau, a hiki i kēia hana ke lawe i kahi manawa nui a ʻaʻole hiki ke hoʻopuka i nā hopena no ka manawa lōʻihi inā loaʻa nā pāʻani liʻiliʻi, pono e hiki ke hōʻike i ka ka holomua o ka nīnau a hiki i ka loaʻa ʻana o nā lālani mua me ka hopena. No ka hana ʻana i kēia, aia kahi ʻāpana i ka interface HTTP e hiki ai iā ʻoe ke hoʻouna i ka holomua ma nā poʻomanaʻo HTTP: send_progress_in_http_headers=1. ʻO ka mea pōʻino, ʻaʻole hiki i ka waihona Go maʻamau ke heluhelu i nā poʻomanaʻo e like me ka loaʻa ʻana iā lākou, akā ʻo ka HTTP 1.0 interface (ʻaʻole e huikau me 1.1!) Ua kākoʻo ʻia e ClickHouse, no laila hiki iā ʻoe ke wehe i kahi pilina TCP maka i ClickHouse a hoʻouna iā ia ma laila GET /?query=... HTTP/1.0nn a loaʻa nā pane pane a me ke kino me ka ʻole o ka pakele a i ʻole hoʻopunipuni, no laila ʻaʻole pono mākou e hoʻohana i ka waihona maʻamau.

Ke hoʻoheheʻe nei i nā moʻolelo mai ClickHouse

Ua loaʻa iā ClickHouse ka loiloi no nā nīnau me ORDER BY no kahi manawa lōʻihi (mai 2019?), no laila he nīnau e like me

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

E hoʻomaka koke ia e hoʻihoʻi i nā laina i loaʻa ka substring "mea" i kā lākou leka, me ke kali ʻole i ka pau ʻana o ka scan.

Eia kekahi, ʻoi aku ka maʻalahi inā hoʻopau ʻo ClickHouse i ka noi i ka wā i pani ʻia ai ka pili ʻana iā ia, akā ʻaʻole kēia ka hana paʻamau. Hiki ke hoʻopau ʻia ka hoʻopau ʻana i ka noi me ka hoʻohana ʻana i ke koho cancel_http_readonly_queries_on_client_close=1.

Ka lawelawe pono ʻana o SIGPIPE ma Go

Ke hoʻokō ʻoe, e ʻōlelo, ke kauoha some_cmd | head -n 10, pehea ke kauoha some_cmd hooki i ka hooko ana i ka wa head unuhi i 10 laina? He maʻalahi ka pane: i ka manawa head hoʻopau, pani ka paipu, a hoʻomaka ka stdout o ke kauoha some_cmd e kuhikuhi, kūlana, "i kahi ʻole". I ka manawa some_cmd ho'āʻo e kākau i kahi paipu paʻa, loaʻa iā ia kahi hōʻailona SIGPIPE, ka mea e hoʻopau mālie i ka papahana ma ka paʻamau.

Ma Go e hana ʻia kēia ma ke ʻano maʻamau, akā paʻi pū ka mea lawe hōʻailona SIGPIPE i ka "hōʻailona: SIGPIPE" a i ʻole kahi leka like ma ka hopena, a no ka hoʻomaʻemaʻe ʻana i kēia memo pono mākou e mālama iā SIGPIPE iā mākou iho e like me kā mākou makemake, ʻo ia hoʻi, me ka leo leo. puka:

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

Hōʻike i ka pōʻaiapili memo

Makemake pinepine ʻoe e ʻike i ka pōʻaiapili i loaʻa ai kekahi hewa (no ka laʻana, ʻo ke noi i hoʻomaka ai ka hopohopo, a i ʻole nā ​​​​pilikia pili i ʻike ʻia ma mua o ka hāʻule ʻana), a ma grep Hana ʻia kēia me ka hoʻohana ʻana i nā koho -A, -B, a me -C, e hōʻike ana i ka helu o nā laina i ʻōlelo ʻia ma hope, ma mua, a puni ka memo.

ʻO ka mea pōʻino, ʻaʻole i loaʻa iaʻu kahi ala maʻalahi e hana like i ka ClickHouse, no laila e hōʻike i ka pōʻaiapili, hoʻouna ʻia kahi noi hou e like me kēia i kēlā me kēia laina o ka hopena (ʻo nā kikoʻī e pili ana i ka hoʻokaʻawale ʻana a inā hōʻike ʻia ka pōʻaiapili ma mua. a ma hope paha):

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

Ma muli o ka hoʻouna koke ʻia ʻana o ka noi ma hope o ka hoʻihoʻi ʻana o ClickHouse i ka laina e pili ana, hoʻopau ia i loko o ka cache a ma ke ʻano holoʻokoʻa e hoʻokō koke ʻia ka noi a hoʻopau i kahi CPU liʻiliʻi (maʻa mau ke noi ma kahi o ~6 ms ma kaʻu mīkini virtual).

Hōʻike i nā memo hou i ka manawa maoli

I mea e hōʻike ai i nā memo e hiki mai ana i ka manawa maoli (kokoke), hoʻokō wale mākou i ka noi i kēlā me kēia mau kekona, me ka hoʻomanaʻo ʻana i ka manawa hope a mākou i hālāwai ai ma mua.

Nā laʻana kauoha

He aha ke ʻano o nā kauoha logscli maʻamau i ka hana?

Inā ʻoe i hoʻoiho i ka ʻikepili Amazon aʻu i ʻōlelo ai ma ka hoʻomaka ʻana o ka ʻatikala, hiki iā ʻoe ke holo i kēia mau kauoha:

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

kūmole

Loaʻa ka code utility (me ka ʻole o nā palapala) ma github ma https://github.com/YuriyNasretdinov/logscli. E hauʻoli wau i ka lohe ʻana i kou manaʻo i koʻu manaʻo no kahi console interface no ka nānā ʻana i nā lāʻau ma luna o ClickHouse.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka