เบžเบงเบเป€เบฎเบปเบฒเบเบณเบฅเบฑเบ‡เบžเบฑเบ”เบ—เบฐเบ™เบฒเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ—เบตเปˆเบชเบฐเบ”เบงเบเบ—เบตเปˆเบชเบธเบ”เปƒเบ™เป‚เบฅเบ* เบชเบณเบฅเบฑเบšเบเบฒเบ™เป€เบšเบดเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ

เบžเบงเบเป€เบฎเบปเบฒเบเบณเบฅเบฑเบ‡เบžเบฑเบ”เบ—เบฐเบ™เบฒเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ—เบตเปˆเบชเบฐเบ”เบงเบเบ—เบตเปˆเบชเบธเบ”เปƒเบ™เป‚เบฅเบ* เบชเบณเบฅเบฑเบšเบเบฒเบ™เป€เบšเบดเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบ„เบตเบเปƒเบŠเป‰เบญเบดเบ™เป€เบ•เบตเป€เบŸเบ”เป€เบงเบฑเบšเป€เบžเบทเปˆเบญเป€เบšเบดเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบงเบดเบ—เบตเบเบฒเบ™, เบ•เบฒเบกเบเบปเบ”เบฅเบฐเบšเบฝเบš, เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบซเบเบธเป‰เบ‡เบเบฒเบเปเบฅเบฐ (เป€เบฅเบทเป‰เบญเบเป†) เบšเปเปˆเบชเบฐเบ”เบงเบเปเบฅเบฐเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบซเบผเบฒเบ. เบšเบฒเบ‡เบ„เบปเบ™เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบ„เบธเป‰เบ™เป€เบ„เบตเบ, เบšเบฒเบ‡เบ„เบปเบ™เบเปเปˆเบ‚เบตเป‰เบฎเป‰เบฒเบเปเบ—เป‰เป†, เปเบ•เปˆเบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ‚เป‰เบญเบเบงเปˆเบฒเป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เบšเบฑเบ™เบซเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบ‚เบปเป‰เบฒเบซเบฒเบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡: เบžเบงเบเป€เบฎเบปเบฒเบžเบฐเบเบฒเบเบฒเบกเบชเป‰เบฒเบ‡เป€เบงเบฑเบšเบ—เบตเปˆ CLI (เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเป€เบชเบฑเป‰เบ™เบ„เปเบฒเบชเบฑเปˆเบ‡) เป€เบฎเบฑเบ”เบงเบฝเบเบ”เบตเบ‚เบถเป‰เบ™. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบชเปˆเบงเบ™เบšเบธเบเบ„เบปเบ™เบกเบตเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบเบชเบฐเบšเบฒเบเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš tail, grep, awk เปเบฅเบฐเบญเบทเปˆเบ™เป†, เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบญเบ, เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบšเบฑเบ™เบ—เบถเบเบˆเบฐเป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบš tail เปเบฅเบฐ grep, เปเบ•เปˆเบกเบฑเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบญเปˆเบฒเบ™เบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบกเบฒเบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบ. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เปเบ™เปˆเบ™เบญเบ™, เบญเปˆเบฒเบ™เบžเบงเบเป€เบ‚เบปเบฒเบˆเบฒเบ ClickHouse!

* เบญเบตเบ‡เบ•เบฒเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบชเปˆเบงเบ™เบ•เบปเบงเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰ habra เป€เบˆเบปเป‰เบฒROCK

เบžเบปเบšเบเบฑเบš logscli

เบ‚เป‰เบญเบเบšเปเปˆเป„เบ”เป‰เบกเบฒเบเบฑเบšเบŠเบทเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ‚เบญเบ‡เบ‚เป‰เบญเบ, เปเบฅเบฐ, เบ”เป‰เบงเบเบ„เบงเบฒเบกเบŠเบทเปˆเบชเบฑเบ”, เบกเบฑเบ™เบกเบตเบขเบนเปˆเปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบ•เบปเป‰เบ™เปเบšเบš, เปเบ•เปˆเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ—เบฑเบ™เบ—เบต, เบ—เปˆเบฒเบ™เบเบดเบ™เบ”เบตเบ•เป‰เบญเบ™เบฎเบฑเบš: https://github.com/YuriyNasretdinov/logscli (350 เปเบ–เบงเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ” Go เบ—เบตเปˆเป€เบฅเบทเบญเบ).

เบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ”

เป€เบ›เบปเป‰เบฒโ€‹เบซเบกเบฒเบโ€‹เบ‚เบญเบ‡โ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เปเบกเปˆเบ™โ€‹เป€เบžเบทเปˆเบญโ€‹เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰โ€‹เบเบฒเบ™โ€‹เป‚เบ•เป‰โ€‹เบ•เบญเบšโ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เป€เบšเบดเปˆเบ‡โ€‹เบ„เบทโ€‹เบงเปˆเบฒโ€‹เบ„เบธเป‰เบ™โ€‹เป€เบ„เบตเบโ€‹เบเบฑเบšโ€‹เบœเบนเป‰โ€‹เบ—เบตเปˆโ€‹เบ–เบทเบโ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เป€เบžเบทเปˆเบญ tail / grepโ€‹, เบ™เบฑเป‰เบ™โ€‹เปเบกเปˆเบ™โ€‹, เบชเบฐโ€‹เบซเบ™เบฑเบšโ€‹เบชเบฐโ€‹เบซเบ™เบนเบ™โ€‹เบชเบดเปˆเบ‡โ€‹เบ”เบฑเปˆเบ‡โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹:

  1. เป€เบšเบดเปˆเบ‡เบšเบฑเบ™เบ—เบถเบเบ—เบฑเบ‡เปเบปเบ”, เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡.
  2. เบ›เปˆเบญเบเปƒเบซเป‰เปเบ–เบงเบ—เบตเปˆเบกเบตเบชเบฒเบเบเปˆเบญเบเบ„เบปเบ‡เบ—เบตเปˆ (เบ—เบธเบ‡ -F ัƒ grep).
  3. เบญเบญเบเบˆเบฒเบเป€เบชเบฑเป‰เบ™เบ—เบตเปˆเบเบปเบ‡เบเบฑเบšเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบœเบปเบ™เบ›เบปเบเบเบฐเบ•เบด (เบ—เบธเบ‡ -E ัƒ grep).
  4. เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบขเบนเปˆเปƒเบ™เบฅเปเบฒเบ”เบฑเบšเป€เบซเบ”เบเบฒเบ™เปเบšเบšเบ›เบตเป‰เบ™เบเบฑเบšเบเบฑเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เบกเบฑเบเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบเปˆเบญเบ™.
  5. เบชเบฐเปเบ”เบ‡เบšเปเบฅเบดเบšเบปเบ”เบ–เบฑเบ”เบˆเบฒเบเปเบ•เปˆเบฅเบฐเปเบ–เบง (เบ•เบปเบงเป€เบฅเบทเบญเบ -A, -B ะธ -C ัƒ grep, เบเบฒเบ™เบžเบดเบก N เป€เบชเบฑเป‰เบ™เบเปˆเบญเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบ, เปเบฅเบฐเบ›เบฐเบกเบฒเบ™เปเบ•เปˆเบฅเบฐเป€เบชเบฑเป‰เบ™เบ—เบตเปˆเบเบปเบ‡เบเบฑเบ™, เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš).
  6. เป€เบšเบดเปˆเบ‡เบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบกเบฒเปƒเบ™เป€เบงเบฅเบฒเบˆเบดเบ‡, เบกเบตเบซเบผเบทเบšเปเปˆเบกเบตเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡ (เป‚เบ”เบเบˆเปเบฒเป€เบ›เบฑเบ™ tail -f | grep).
  7. เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ•เป‰เบญเบ‡เป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบš less, head, tail เปเบฅเบฐเบญเบทเปˆเบ™เป† - เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบ™เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบเบšเปเปˆเบกเบตเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบเปˆเบฝเบงเบเบฑเบšเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ; เบชเบฒเบเบ–เบทเบเบžเบดเบกเบญเบญเบเป€เบ›เบฑเบ™เบชเบฒเบเบ™เป‰เปเบฒเบ•เบฒเบšเปƒเบ”เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบžเบงเบเบกเบฑเบ™; เบชเบฑเบ™เบเบฒเบ™ SIGPIPE เบ„เบงเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”เบšเบฑเบ™เบ—เบถเบเบขเปˆเบฒเบ‡เบ‡เบฝเบšเป†, เบ„เบทเบเบฑเบ™เบเบฑเบšเบžเบงเบเป€เบ‚เบปเบฒ tail, grep เปเบฅเบฐเบญเบธเบ›เบฐเบเบญเบ™เบญเบทเปˆเบ™เป†เบ‚เบญเบ‡ UNIX.

ะ ะตะฐะปะธะทะฐั†ะธั

เบ‚เป‰เบญเบเบˆเบฐเบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเป€เบˆเบปเป‰เบฒเบฎเบนเป‰เบงเบดเบ—เบตเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบเป„เบ›เบซเบฒ ClickHouse เปเบฅเป‰เบง. เบ–เป‰เบฒเบšเปเปˆ, เบ‚เป‰เบญเบเบ‚เปเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบฅเบญเบ‡เบกเบฑเบ™ lsd ะธ เป€เบฎเบทเบญเบ™เบฅเบนเบเปเบกเบงเปเบฅเบฐ เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ.

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบ—เปˆเบฒเบ™ เบˆเบณ เป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบเปˆเบฝเบงเบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบฎเบฑเบšเบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบˆเบฑเบ”เบฎเบฝเบ‡เบ•เบฒเบกเป€เบงเบฅเบฒ, เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบชเบปเบกเป€เบซเบ”เบชเบปเบกเบœเบปเบ™เบ—เบตเปˆเบˆเบฐเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบžเบงเบเบกเบฑเบ™เบ”เป‰เบงเบเบงเบดเบ—เบตเบ™เบฑเป‰เบ™. เบ–เป‰เบฒเบกเบตเบซเบฅเบฒเบเบ›เบฐเป€เบžเบ”เบšเบฑเบ™เบ—เบถเบเปเบฅเบฐเบžเบงเบเบกเบฑเบ™เป€เบ›เบฑเบ™เบ›เบฐเป€เบžเบ”เบ”เบฝเบงเบเบฑเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบ›เบฐเป€เบžเบ”เบšเบฑเบ™เบ—เบถเบเป€เบ›เบฑเบ™เบ„เปเบฅเปเบฒเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ•เบปเป‰เบ™เบ•เป - เบ™เบตเป‰เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบกเบตเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบ™เบถเปˆเบ‡เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบซเบผเบฒเบ, เป€เบŠเบดเปˆเบ‡เบˆเบฐเป€เบ›เบฑเบ™เบšเบงเบเปƒเบซเบเปˆเป€เบกเบทเปˆเบญ. เบเบฒเบ™เปƒเบชเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ ClickHouse (เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบตเปˆเบกเบตเบฎเบฒเบ”เป„เบ”, เบกเบฑเบ™เปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เปƒเบชเปˆเบ‚เปเป‰เบกเบนเบ™เบšเปเปˆเป€เบเบตเบ™ ~ 1 เป€เบ—เบทเปˆเบญเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต. เบชเปเบฒเบฅเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”).

เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เบฐเบกเบฒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

CREATE TABLE logs(
    category LowCardinality(String), -- ะบะฐั‚ะตะณะพั€ะธั ะปะพะณะพะฒ (ะพะฟั†ะธะพะฝะฐะปัŒะฝะพ)
    time DateTime, -- ะฒั€ะตะผั ัะพะฑั‹ั‚ะธั
    millis UInt16, -- ะผะธะปะปะธัะตะบัƒะฝะดั‹ (ะผะพะณัƒั‚ ะฑั‹ั‚ัŒ ะธ ะผะธะบั€ะพัะตะบัƒะฝะดั‹, ะธ ั‚.ะด.): ั€ะตะบะพะผะตะฝะดัƒะตั‚ัั ั…ั€ะฐะฝะธั‚ัŒ, ะตัะปะธ ัะพะฑั‹ั‚ะธะน ะผะฝะพะณะพ, ั‡ั‚ะพะฑั‹ ะฑั‹ะปะพ ะปะตะณั‡ะต ั€ะฐะทะปะธั‡ะฐั‚ัŒ ัะพะฑั‹ั‚ะธั ะผะตะถะดัƒ ัะพะฑะพะน
    ..., -- ะฒะฐัˆะธ ัะพะฑัั‚ะฒะตะฝะฝั‹ะต ะฟะพะปั, ะฝะฐะฟั€ะธะผะตั€ ะธะผั ัะตั€ะฒะตั€ะฐ, ัƒั€ะพะฒะตะฝัŒ ะปะพะณะธั€ะพะฒะฐะฝะธั, ะธ ั‚ะฐะบ ะดะฐะปะตะต
    message String -- ั‚ะตะบัั‚ ัะพะพะฑั‰ะตะฝะธั
) ENGINE=MergeTree()
ORDER BY (category, time, millis)

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบ‚เป‰เบญเบเบšเปเปˆเบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”เบ—เบตเปˆเบกเบตเบšเบฑเบ™เบ—เบถเบเบ•เบปเบงเบˆเบดเบ‡เบ—เบตเปˆเบ‚เป‰เบญเบเบชเบฒเบกเบฒเบ”เบˆเบฑเบšเปเบฅเบฐเบ”เบฒเบงเป‚เบซเบฅเบ”เป„เบ”เป‰, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเบˆเบถเปˆเบ‡เป€เบญเบปเบฒเบญเบฑเบ™เบ™เบตเป‰เบกเบฒเป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡. เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ‚เบญเบ‡เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบˆเบฒเบ Amazon เบˆเบปเบ™เบเปˆเบงเบฒ 2015. เปเบ™เปˆเบ™เบญเบ™, เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเบกเบฑเบ™เบšเปเปˆเบ„เบทเบเบฑเบšเบšเบฑเบ™เบ—เบถเบเบ‚เปเป‰เบ„เบงเบฒเบก, เปเบ•เปˆเป€เบžเบทเปˆเบญเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™.

เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบฑเบšเป‚เบซเบฅเบ”เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™ Amazon เบเบฑเบš ClickHouse

เบกเบฒเบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡:

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

เปƒเบ™เบŠเบธเบ”เบ‚เปเป‰เบกเบนเบ™ Amazon เบกเบตเบžเบฝเบ‡เปเบ•เปˆเบงเบฑเบ™เบ—เบตเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™, เปเบ•เปˆเบšเปเปˆเบกเบตเป€เบงเบฅเบฒเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™, เบชเบฐเบ™เบฑเป‰เบ™เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰เบ”เป‰เบงเบ randon.

เบ—เปˆเบฒเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ”เบฒเบงเป‚เบซเบฅเบ”เป„เบŸเบฅเปŒ tsv เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบฅเบฐเบˆเปเบฒเบเบฑเบ”เบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡เบขเบนเปˆเบ—เบตเปˆ ~ 10-20 เบ—เปเบฒเบญเบดเบ”เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบŠเบธเบ”เบ‚เปเป‰เบกเบนเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบžเปเบชเบปเบกเบ„เบงเบ™เบ—เบตเปˆเบˆเบฐเบšเปเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบš 16 GB เบ‚เบญเบ‡ RAM. เป€เบžเบทเปˆเบญเบญเบฑเบšเป‚เบซเบฅเบ”เป„เบŸเบฅเปŒ TSV เบ‚เป‰เบญเบเปƒเบŠเป‰เบ„เปเบฒเบชเบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

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 Persistent เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™ (เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™ HDD) เปƒเบ™ Google Cloud เบ—เบตเปˆเบกเบตเบ‚เบฐเบซเบ™เบฒเบ” 1000 GB (เบ‚เป‰เบญเบเป€เบญเบปเบฒเบ‚เบฐเบซเบ™เบฒเบ”เบ™เบตเป‰เบชเปˆเบงเบ™เปƒเบซเบเปˆเป€เบžเบทเปˆเบญเปƒเบซเป‰เบ„เบงเบฒเบกเป„เบงเบชเบนเบ‡เบเบงเปˆเบฒเป€เบฅเบฑเบเบ™เป‰เบญเบ, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเบฒเบ‡เบ—เบต SSD เบ‚เบญเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบˆเบฐเบกเบตเบฅเบฒเบ„เบฒเบ–เบทเบเบเบงเปˆเบฒ) เบเบฒเบ™เบญเบฑเบšเป‚เบซเบฅเบ” เบ„เบงเบฒเบกเป„เบงเปเบกเปˆเบ™เบ›เบฐเบกเบฒเบ™ ~ 75 MB / เบงเบดเบ™เบฒเบ—เบตเปƒเบ™ 4 เปเบเบ™.

  • เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบเบฒเบ™เบˆเบญเบ‡เบ—เบตเปˆเบ‚เป‰เบญเบเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆ Google, เปเบ•เปˆเบ‚เป‰เบญเบเปƒเบŠเป‰เบšเบฑเบ™เบŠเบตเบชเปˆเบงเบ™เบ•เบปเบงเปเบฅเบฐเบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบ‚เป‰เบญเบเบขเบนเปˆเบšเปเบฅเบดเบชเบฑเบ”.

เบ‚เป‰เบญเบเบˆเบฐเบœเบฐเบฅเบดเบ”เบฎเบนเบšเปเบ•เป‰เบกเบ—เบฑเบ‡เปเบปเบ”เบ”เป‰เบงเบเบŠเบธเบ”เบ‚เปเป‰เบกเบนเบ™เบชเบฐเป€เบžเบฒเบฐเบ™เบตเป‰, เป€เบžเบฒเบฐเบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบ—เบฑเบ‡เปเบปเบ”เบ—เบตเปˆเบ‚เป‰เบญเบเบกเบตเบขเบนเปˆเปƒเบ™เบกเบท.

เบชเบฐเปเบ”เบ‡เบ„เบงเบฒเบกเบ„เบทเบšเปœเป‰เบฒเบเบฒเบ™เบชเบฐเปเบเบ™เบ‚เปเป‰เบกเบนเบ™

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเปƒเบ™ ClickHouse เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰เบเบฒเบ™เบชเบฐเปเบเบ™เป€เบ•เบฑเบกเบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบตเบšเบฑเบ™เบ—เบถเบ, เปเบฅเบฐเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป€เบงเบฅเบฒเบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบเปเบฅเบฐเบญเบฒเบ”เบˆเบฐเบšเปเปˆเบกเบตเบœเบปเบ™เปƒเบ”เป†เบชเปเบฒเบฅเบฑเบšเป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™เบ–เป‰เบฒเบžเบปเบšเบชเบญเบ‡เบชเบฒเบกเบ„เปเบฒ, เปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบชเบฒเบกเบฒเบ”เบชเบฐเปเบ”เบ‡เบœเบปเบ™เป„เบ”เป‰. เบ„เบงเบฒเบกเบ„เบทเบšเบซเบ™เป‰เบฒเบ‚เบญเบ‡เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบˆเบปเบ™เบเปˆเบงเบฒเปเบ–เบงเบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบกเบตเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบกเปˆเบ™เป„เบ”เป‰เบฎเบฑเบš. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบกเบตเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš HTTP เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบปเปˆเบ‡เบ„เบงเบฒเบกเบ„เบทเบšเบซเบ™เป‰เบฒเปƒเบ™เบชเปˆเบงเบ™เบซเบปเบง HTTP: send_progress_in_http_headers=1. เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” Go เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™ headers เบเป‰เบญเบ™เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเป„เบ”เป‰เบฎเบฑเบš, เปเบ•เปˆ HTTP 1.0 interface (เบšเปเปˆเบ„เบงเบ™เบชเบฑเบšเบชเบปเบ™เบเบฑเบš 1.1!) เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป‚เบ”เบ ClickHouse, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบตเบ”เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ TCP เบ”เบดเบšเบเบฑเบš ClickHouse เปเบฅเบฐเบชเบปเปˆเบ‡เป„เบ›เบ—เบตเปˆเบ™เบฑเป‰เบ™. GET /?query=... HTTP/1.0nn เปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเบชเปˆเบงเบ™เบซเบปเบงเบเบฒเบ™เบ•เบญเบšเบชเบฐ เปœเบญเบ‡ เปเบฅเบฐเบฎเปˆเบฒเบ‡เบเบฒเบเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบซเบฅเบปเบšเบซเบ™เบตเบซเบผเบทเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™.

เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”เบˆเบฒเบ ClickHouse

ClickHouse เบกเบตเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบเบฑเบš ORDER BY เบชเปเบฒเบฅเบฑเบšเป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™ (เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆ 2019?), เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเป€เบŠเบฑเปˆเบ™:

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

เบกเบฑเบ™เบ—เบฑเบ™เบ—เบตเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฑเบšเบ„เบทเบ™เบชเบฒเบเบ—เบตเปˆเบกเบต substring "เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡" เปƒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ, เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบฅเปเบ–เป‰เบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฐเปเบเบ™เบชเปเบฒเป€เบฅเบฑเบ”เบฎเบนเบš.

เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰, เบกเบฑเบ™เบˆเบฐเบชเบฐเบ”เบงเบเบซเบผเบฒเบเบ–เป‰เบฒ ClickHouse เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบเบปเบเป€เบฅเบตเบเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเป€เบกเบทเปˆเบญเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบกเบฑเบ™เบ–เบทเบเบ›เบดเบ”, เปเบ•เปˆเบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบžเบถเบ”เบ•เบดเบเปเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เบเบฒเบ™เบเบปเบเป€เบฅเบตเบเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบชเบฒเบกเบฒเบ”เบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเป€เบฅเบทเบญเบ cancel_http_readonly_queries_on_client_close=1.

เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™ SIGPIPE เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™ Go

เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เป€เบงเบปเป‰เบฒเบงเปˆเบฒ, เบ„เปเบฒเบชเบฑเปˆเบ‡ some_cmd | head -n 10, เปเบ—เป‰เบงเบดเบ—เบตเบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡ some_cmd เบขเบธเบ”เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบกเบทเปˆเบญ head เบฅเบปเบš 10 เปเบ–เบง? เบ„เปเบฒเบ•เบญเบšเปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบ: เป€เบกเบทเปˆเบญ head เบชเบดเป‰เบ™เบชเบธเบ”, เบ—เปเปˆเบ›เบดเบ”, เปเบฅเบฐ stdout เบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡ some_cmd เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบตเปˆเบˆเบฐเบŠเบตเป‰, เบ•เบฒเบกเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚, "เป„เบ›เปƒเบช". เป€เบกเบทเปˆเบญโ€‹เปƒเบ”โ€‹ some_cmd เบžเบฐเบเบฒเบเบฒเบกเบ‚เบฝเบ™เปƒเบชเปˆเบ—เปเปˆเบ›เบดเบ”, เบกเบฑเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบชเบฑเบ™โ€‹เบเบฒเบ™ SIGPIPEโ€‹, เป€เบŠเบดเปˆเบ‡ silently terminates เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เป€เบฅเบตเปˆเบกโ€‹เบ•เบปเป‰เบ™โ€‹.

เปƒเบ™ Go เบ™เบตเป‰เบเบฑเบ‡เป€เบเบตเบ”เบ‚เบทเป‰เบ™เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เปเบ•เปˆเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบชเบฑเบ™เบเบฒเบ™ SIGPIPE เบเบฑเบ‡เบžเบดเบก "เบชเบฑเบ™เบเบฒเบ™: SIGPIPE" เบซเบผเบทเบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™ SIGPIPE เบ•เบปเบงเป€เบญเบ‡เปƒเบ™เปเบšเบšเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบžเบฝเบ‡เปเบ•เปˆเบ‡เบฝเบšเป†. เบญเบญเบ:

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

เบชเบฐเปเบ”เบ‡เบšเปเบฅเบดเบšเบปเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก

เป€เบฅเบทเป‰เบญเบเป†เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบชเบฐเบžเบฒเบšเบเบฒเบ™เบ—เบตเปˆเป€เบเบตเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบšเบฒเบ‡เบขเปˆเบฒเบ‡ (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ—เบตเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบ„เบงเบฒเบกเบ•เบทเปˆเบ™เบ•เบปเบเปƒเบˆ, เบซเบผเบทเบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบ—เบตเปˆเป€เบซเบฑเบ™เป„เบ”เป‰เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบเบตเบ”เบญเบธเบ›เบฐเบ•เบดเป€เบซเบ”), เปเบฅเบฐเปƒเบ™ grep เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเป€เบฅเบทเบญเบ -A, -B, เปเบฅเบฐ -C, เป€เบŠเบดเปˆเบ‡เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบˆเปเบฒเบ™เบงเบ™เป€เบชเบฑเป‰เบ™เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เบซเบผเบฑเบ‡เบˆเบฒเบ, เบเปˆเบญเบ™, เปเบฅเบฐเบ›เบฐเบกเบฒเบ™เบ‚เปเป‰เบ„เบงเบฒเบก, เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš.

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบ‚เป‰เบญเบเบšเปเปˆเบžเบปเบšเบงเบดเบ—เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เปƒเบ™ ClickHouse, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เบชเบฐเบžเบฒเบšเบเบฒเบ™, เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเป€เบŠเบฑเปˆเบ™เบ™เบตเป‰เบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒเปเบ•เปˆเบฅเบฐเป€เบชเบฑเป‰เบ™เบ‚เบญเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš (เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบฅเบฝเบ‡เปเบฅเบฐเบงเปˆเบฒเบชเบฐเบžเบฒเบšเบเบฒเบ™เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบเปˆเบญเบ™. เบซเบผเบทเบซเบผเบฑเบ‡):

SELECT time,millis,review_body FROM amazon
WHERE (time = 'ะ’ะ ะ•ะœะฏ_ะกะžะ‘ะซะขะ˜ะฏ' AND millis < ะœะ˜ะ›ะ›ะ˜ะกะ•ะšะฃะะ”ะซ_ะกะžะ‘ะซะขะ˜ะฏ) OR (time < 'ะ’ะ ะ•ะœะฏ_ะกะžะ‘ะซะขะ˜ะฏ')
ORDER BY time DESC, millis DESC
LIMIT ะšะžะ›ะ˜ะงะ•ะกะขะ’ะž_ะกะขะ ะžะš_ะšะžะะขะ•ะšะกะขะ
SETTINGS max_threads=1

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ–เบทเบเบชเบปเปˆเบ‡เป€เบเบทเบญเบšเบ—เบฑเบ™เบ—เบตเบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆ ClickHouse เบชเบปเปˆเบ‡เบ„เบทเบ™เบชเบฒเบเบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™, เบกเบฑเบ™เบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡เปƒเบ™ cache เปเบฅเบฐเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบงเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบขเปˆเบฒเบ‡เป„เบงเบงเบฒเปเบฅเบฐเปƒเบŠเป‰ CPU เป€เบฅเบฑเบเบ™เป‰เบญเบ (เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบŠเป‰เป€เบงเบฅเบฒเบ›เบฐเบกเบฒเบ™ ~ 6 ms เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡ virtual เบ‚เบญเบ‡เบ‚เป‰เบญเบ).

เบชเบฐเปเบ”เบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเปเปˆเปƒเบ™เป€เบงเบฅเบฒเบˆเบดเบ‡

เป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบกเบฒเปƒเบ™ (เป€เบเบทเบญเบš) เป€เบงเบฅเบฒเบˆเบดเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ—เบธเบเป†เบชเบญเบ‡เบชเบฒเบกเบงเบดเบ™เบฒเบ—เบต, เบˆเบทเปˆเบˆเปเบฒเป€เบงเบฅเบฒเบชเบธเบ”เบ—เป‰เบฒเบเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบžเบปเบšเบเปˆเบญเบ™.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡

เบ„เปเบฒเบชเบฑเปˆเบ‡ logscli เบ›เบปเบเบเบฐเบ•เบดเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเปเบ™เบงเปƒเบ”เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”?

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ”เบฒเบงเป‚เบซเบฅเบ”เบŠเบธเบ”เบ‚เปเป‰เบกเบนเบ™ Amazon เบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบเปˆเบฒเบงเป€เบ–เบดเบ‡เปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบก, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

# ะŸะพะบะฐะทะฐั‚ัŒ ัั‚ั€ะพะบะธ, ะณะดะต ะฒัั‚ั€ะตั‡ะฐะตั‚ัั ัะปะพะฒะพ 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

เป€เบญเบเบฐเบชเบฒเบ™

เบฅเบฐเบซเบฑเบ”เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ” (เป‚เบ”เบเบšเปเปˆเบกเบตเป€เบญเบเบฐเบชเบฒเบ™) เปเบกเปˆเบ™เบกเบตเบขเบนเปˆเปƒเบ™ github เบ—เบตเปˆ https://github.com/YuriyNasretdinov/logscli. เบ‚เป‰เบญเบเบˆเบฐเบ”เบตเปƒเบˆเบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบเบดเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš console เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบšเบดเปˆเบ‡เบšเบฑเบ™เบ—เบถเบเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ ClickHouse.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™