Waxaan soo saareynaa isku xirka ugu habboon adduunka* si loo daawado diiwaannada

Waxaan soo saareynaa isku xirka ugu habboon adduunka* si loo daawado diiwaannada Haddii aad waligaa isticmaashay is-dhexgalka shabakada si aad u aragto diiwaannada, markaa waxaad u badan tahay inaad dareentay sida, sida caadiga ah, is-dhexgalayaashu ay yihiin kuwo dhib badan iyo (badanaa) aan aad u habboonayn oo jawaab celin ah. Qaar waad la qabsan kartaa, qaar waa gabi ahaanba aad u xun, laakiin waxay aniga iila muuqataa in sababta dhibaatooyinka oo dhan ay tahay in aan si khaldan u wajahno hawsha daawashada diiwaannada: waxaan isku dayeynaa inaan abuurno shabakad shabakad halkaas oo CLI (command line interface) si fiican ayuu u shaqeeyaa. Anigu shakhsi ahaan aad ayaan ugu qanacsanahay inaan ku shaqeeyo dabada, grep, awk iyo kuwa kale, sidaas darteed aniga ahaan aniga is-dhexgalka ugu fiican ee ku shaqeynta logyada waxay noqon doontaa wax la mid ah dabada iyo grep, laakiin sidoo kale loo isticmaali karo in lagu akhriyo qoraallada ka yimid server badan. Taasi waa, dabcan, ka akhri ClickHouse!

* sida ku cad ra'yiga shakhsi ahaaneed ee isticmaalaha habra ROCK

La kulan logscli

Ma aanan la imaan magac loogu talagalay is-dhexgalkayga, iyo, si daacad ah, waxay ku jirtaa qaabka prototype, laakiin haddii aad rabto inaad isla markiiba aragto koodhka isha, markaa waa lagu soo dhaweynayaa: https://github.com/YuriyNasretdinov/logscli (350 xariiq oo Go code la doortay).

Qaababka

Hadafkayagu waxa uu ahaa in aan sameeyo interface u eg mid ay yaqaanaan kuwa loo isticmaalo dabada/grep, taas oo ah, in la taageero waxyaalahan soo socda:

  1. Arag dhammaan diiwaannada, adiga oo aan shaandhayn.
  2. Ku dhaaf khadadka ay ku jiraan xad-hoosaad go'an (calan -F у grep).
  3. Ka tag khadadka ku habboon tibaaxaha caadiga ah (calanka -E у grep).
  4. Sida caadiga ah, daawashada waxay u socotaa siday u kala horreeyeen, maadaama qoraaladii ugu dambeeyay ay inta badan xiiseeyaan marka hore.
  5. Muuji macnaha guud ee ku xiga xariiq kasta (doorashooyinka -A, -B и -C у grep, Daabacaadda N ka hor, ka dib, iyo agagaarka xariiq kasta oo ku habboon, siday u kala horreeyaan).
  6. Arag diiwaannada soo galaya wakhtiga dhabta ah, leh ama la'aan shaandhayn (asal ahaan tail -f | grep).
  7. Interface waa in uu la jaanqaadaa less, head, tail iyo kuwa kale - sida caadiga ah, natiijooyinka waa in la soo celiyaa iyada oo aan la xaddidin tiradooda; khadadka waxaa loo daabacay sida qulqulka ilaa inta isticmaaluhu uu xiiseynayo inuu helo; calaamad SIGPIPE waa in ay aamusnaan ku joojiyaan qulqulka log, sida ay sameeyaan tail, grep iyo adeegyada kale ee UNIX.

Реализация

Waxaan u qaadan doonaa in aad mar hore si uun u taqaan sida loo geeyo ClickHouse. Haddaysan ahayn, waxaan ku talinayaa inaad tijaabiso lsd и kittenhouseMarkaasay maqaalkan ku saabsan geynta log.

Marka hore waxaad u baahan tahay inaad go'aansato nidaamka aasaasiga ah. Maadaama aad inta badan rabto in aad hesho logyada lagu soocay wakhtiga, waxa ay u muuqataa macquul in sidaas lagu kaydiyo. Haddii ay jiraan qaybo badan oo log ah oo ay dhammaantood yihiin isku nooc, markaa waxaad samayn kartaa qaybta log sida tiirka koowaad ee furaha aasaasiga ah - tani waxay kuu ogolaaneysaa inaad haysato hal miis halkii aad ka heli lahayd dhowr, taas oo noqon doonta mid weyn marka lagu daro. Gelida ClickHouse (kumbuyuutarrada leh darawallada adag, waxaa lagula talinayaa inaad geliso xogta wax aan ka badnayn ~ 1 jeer ilbiriqsi kasta serverka oo dhan).

Taasi waa, waxaan u baahanahay qiyaastii nidaamka miiska soo socda:

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

Nasiib darro, isla markiiba ma helin ilo furan oo leh qoraallo macquul ah oo aan soo qabsan karo oo aan soo dejin karo, markaa taas beddelkeeda waxaan u qaatay tusaale ahaan. dib u eegista alaabta Amazon ka hor 2015. Dabcan, qaabdhismeedkoodu maaha mid la mid ah kan qoraallada qoraalka ah, laakiin ujeeddooyin sawireed tani muhiim maaha.

Tilmaamaha loogu talagalay soo dejinta Amazon dib u eegista ClickHouse

Aan samayno miis:

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

In the Amazon dataset waxaa jira taariikh kaliya oo dib u eegis ah, laakiin ma jirto waqti sax ah, markaa aan ku buuxinno xogtan randon.

Uma baahnid inaad soo dejiso dhammaan faylalka tsv oo aad ku xaddido kan ugu horreeya ~10-20 si aad u hesho xog aad u ballaaran oo aan ku habboonayn 16 GB ee RAM. Si aan u soo geliyo faylasha TSV waxaan adeegsaday amarka soo socda:

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

Disk-ga caadiga ah ee joogtada ah (oo ah HDD) ee Google Cloud oo cabbirkiisu yahay 1000 GB ( cabbirkan waxaan u qaatay inta badan si xawaaruhu xoogaa sare ugu kaco, inkasta oo laga yaabo in SSD cabbirkii loo baahnaa uu ka jaban lahaa Xawaaruhu wuxuu ahaa qiyaastii ~ 75 MB/sek on 4 cores.

  • Waa inaan sameeyaa boos celin ah inaan ka shaqeeyo Google, laakiin waxaan isticmaalay akoon shakhsi ah, maqaalkani shaqo kuma laha shaqadayda shirkadda

Waxaan soo saari doonaa dhammaan sawirada xogtan gaarka ah, maadaama ay tani tahay waxa kaliya ee aan gacanta ku hayo.

Muuji horumarka iskaanka xogta

Maaddaama gudaha ClickHouse aan ku isticmaali doono sawir buuxa oo miiska saaran oo ay ku jiraan log, qalliinkaani wuxuu qaadan karaa waqti aad u badan waxaana laga yaabaa inuusan wax natiijo ah soo saarin muddo dheer haddii dhowr kulan la helo, waxaa lagu talinayaa in la muujiyo horumarka weydiinta ilaa safafka ugu horreeya ee natiijada la helayo. Si tan loo sameeyo, waxaa jira halbeeg ku dhex jira interface HTTP kaas oo kuu ogolaanaya inaad horumar u dirto madaxyada HTTP: send_progress_in_http_headers=1. Nasiib darro, maktabadda caadiga ah ee Go ma akhrin karto madax sida loo helay, laakiin HTTP 1.0 interface (aan lagu khaldin 1.1!) Waxaa taageera ClickHouse, si aad u furto xiriir TCP cayriin ClickHouse oo u dir halkaas GET /?query=... HTTP/1.0nn oo hel madaxyada jawaabta iyo jidhka iyada oo aan wax baxsan ama qarsoodi ah, markaa kiiskan xitaa uma baahnid isticmaalka maktabadda caadiga ah.

Diiwaanada qulqulka ee ClickHouse

ClickHouse waxa ay haysay wanaajinta su'aalaha ORDER BY muddo aad u dheer (ilaa 2019?), marka su'aal la mid ah

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

Isla markiiba waxay bilaabi doontaa soo celinta khadadka leh xarafka-hoosaadka "wax" fariintooda, iyada oo aan la sugin in sawirku dhammeeyo.

Sidoo kale, aad bay u habboonaan lahayd haddii ClickHouse lafteedu ay joojiso codsiga markii xidhiidhka la xidhay, laakiin tani maaha habdhaqanka caadiga ah. Baabi'inta tooska ah ee codsiga waa la dami karaa iyadoo la isticmaalayo ikhtiyaarka cancel_http_readonly_queries_on_client_close=1.

Sida saxda ah ula tacaalida SIGPIPE gudaha Go

Markaad fulinayso, dheh, amarka some_cmd | head -n 10, sida saxda ah amarka some_cmd joojinta dilka marka head laga jaray 10 sadar? Jawaabtu waa sahlan tahay: goorma head dhamaado, tuubada ayaa xirta, iyo stdout ee amarka some_cmd wuxuu bilaabaa inuu tilmaamo, shuruud ahaan, "meel la'aan". Goorma some_cmd isku dayo inuu u qoro tuubo xiran, waxay helaysaa calaamada SIGPIPE, kaas oo si aamusnaan ah u joojiya barnaamijka.

Gudaha Go tani waxay sidoo kale u dhacdaa si toos ah, laakiin maamulaha calaamadaha SIGPIPE wuxuu sidoo kale daabacaa "signal: SIGPIPE" ama fariin la mid ah dhamaadka, iyo si aan u nadiifin fariintan waxaan u baahanahay oo kaliya inaan u maamulno SIGPIPE nafteena sida aan rabno, taas oo ah, kaliya aamusnaan. ka bax:

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

Muuji fariinta macnaha guud

Badana waxa aad rabtaa in aad aragto macnaha guud ee khaladku ka dhacay (tusaale, codsigaas oo keenay argagax, ama dhibaatooyinka la xidhiidha shilka ka hor) grep Tan waxaa lagu sameeyaa iyadoo la adeegsanayo -A, -B, iyo -C, kuwaas oo muujinaya tirada la cayimay ee khadadka ka dib, ka hor, iyo agagaarka fariinta, siday u kala horreeyaan.

Nasiib darro, ma helin hab sahlan oo lagu sameeyo ClickHouse, si loo muujiyo macnaha guud, codsi dheeri ah oo kan oo kale ah ayaa loo diraa sadar kasta oo natiijada ah (faahfaahintu waxay ku xiran tahay kala-soocidda iyo haddii macnaha guud la muujiyay ka hor. ama ka dib):

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

Maadaama codsiga la soo diro isla markiiba ka dib markii ClickHouse uu soo celiyo khadka u dhigma, wuxuu ku dhamaanayaa kaydka iyo guud ahaan codsiga si dhakhso ah ayaa loo fuliyaa wuxuuna cunaa CPU yar (sida caadiga ah codsigu wuxuu qaataa qiyaastii ~ 6 ms mashiinka farsamada gacanta).

Muuji fariimaha cusub wakhtiga dhabta ah

Si aan u muujino fariimaha soo socda (ku dhawaad) wakhtiga dhabta ah, waxa aanu si fudud u fulinaa codsiga hal mar dhawrkii ilbiriqsiba, anagoo xasuusanayna shaambada wakhtiga ugu danbaysay ee aanu hore ula kulanay.

Tusaalooyinka amarka

Sidee buu u eg yahay amarada logscli ee caadiga ah?

Haddii aad soo dejisay kaydka xogta Amazon ee aan ku sheegay bilawgii maqaalka, waxaad socodsiin kartaa amarada soo socda:

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

tixraacyada

Koodhka utility (la'aan dukumeenti) ayaa laga heli karaa github at https://github.com/YuriyNasretdinov/logscli. Waan ku farxi lahaa inaan maqlo fikradahaaga ku saabsan fikradayda ku saabsan isdhexgalka konsole ee daawashada diiwaannada ku saleysan ClickHouse.

Source: www.habr.com

Add a comment