Upgrade to PRO for Only $50/YearâLimited-Time Offer! ð¥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Write an embedded time-series database in Go
Search
nakabonne
November 13, 2021
Programming
1
710
Write an embedded time-series database in Go
nakabonne
November 13, 2021
Tweet
Share
More Decks by nakabonne
See All by nakabonne
Want to quickly put dbg! into external crates?
nakabonne
0
42
ã¢ãžã¥ãŒã«ã®æ·±ãã«ã€ã㊠/ depth of module
nakabonne
0
150
Web API Ã Clean Architecture / CleanArchitecture Go
nakabonne
3
18k
Other Decks in Programming
See All in Programming
Pythonã§ã¯ããããªãŒãã³ããŒã¿åæãæžç±ã®ç޹ä»ãšæžç±ã§ç޹ä»ããããªãã£ãäºäŸã®ç޹ä»ã
welliving
2
570
GISãšã³ãžãã¢ããèŠãLINKSããŒã¿
nokonoko1203
0
180
ã¡ã«ã«ãªã®ãªãŒãããªãã£ããŒã ãåãçµããAIæä»£ã®ã¹ã±ãŒã©ãã«ãªå質æå
cloverrose
2
360
ã¯ã©ãŠãã«äŸåããªãS3ã䜿ã£ãéçºè¡
simesaba80
0
160
Navigating Dependency Injection with Metro
l2hyunwoo
1
180
[AtCoder Conference 2025] LLMã䜿ã£ãæ¥åAHCã®äžâŒ¿ãªè§£ãâœ
terryu16
5
710
tparseã§go testã®åºåãèŠããããã
utgwkk
2
280
gunshi
kazupon
1
110
Java 25, Nuevas caracterÃsticas
czelabueno
0
110
Jetpack XR SDKããçŽè§£ãAndroid XRéçºãšæè¡éžå®ã®ãã³ã / about-androidxr-and-jetpack-xr-sdk
drumath2237
1
190
ELYZA_Findy AI Engineering Summitç»å£è³æ_AIã³ãŒãã£ã³ã°æä»£ã«ãã¡ãããšãããããš_toB LLMãããã¯ãéçºèå°è£_20251216
elyza
2
590
Findy AI+ã®éçºãéçšã«ãããMCP掻çšäºäŸ
starfish719
0
1.7k
Featured
See All Featured
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
330
Navigating Team Friction
lara
191
16k
Producing Creativity
orderedlist
PRO
348
40k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.4k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.1k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
90
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
310
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
0
250
Faster Mobile Websites
deanohume
310
31k
WENDY [Excerpt]
tessaabrams
8
35k
Transcript
Write an embedded time-series database in Go @GoCon 2021 Autumn
Ryo Nakao (@nakabonne)
èªå·±çŽ¹ä» â¢ äžå°Ÿ æ¶Œ (@nakabonne) â¢ æ ªåŒäŒç€Ÿãµã€ããŒãšãŒãžã§ã³ã ⢠PipeCD ãã«ã¿ã€ã éçº
Agenda ⢠æç³»åããŒã¿ã®ç¹åŸŽ ⢠tstorageã®èšèš ⢠Goã§ã®å®è£ ã«ã€ããŠ
Write an embedded time-series database in Go Ryo Nakao (@nakabonne)
Write an embedded time-series database in Go Ryo Nakao (@nakabonne)
Embedded database ⢠ã©ã€ãã©ãªãšããŠæäŸãããŠããåã蟌ã¿å¯èœãªããŒã¿ããŒã¹ ⢠æåãªãã®ã§LevelDBãRocksDBãªã©ããã
ã¢ãããŒã·ã§ã³ 00
è² è·ãã¹ãããŒã«ã®ã¡ã¢ãªããã©ãŒãã³ã¹äœäž
è² è·ãã¹ãããŒã«ã®ã¡ã¢ãªããã©ãŒãã³ã¹äœäž â¢ èšæž¬çµæãSliceã«appendããŠããã ãã ã£ã ⢠ãã£ã¹ã¯ã掻çšããã¹ãã¬ãŒãžãšã³ãžã³ã欲ãã ⢠GoèšèªããEmbedded databaseãšããŠå©çšã§ãããã®ãç¡ã ⢠â
äœããããªã
tstorage
æç³»åããŒã¿ã®ç¹åŸŽ 01
æç³»åããŒã¿ ⢠ã¿ã€ã ã¹ã¿ã³ãé ã«äžŠãã å€ïŒããŒã¿ ãã€ã³ããšåŒã¶ïŒã®éãŸã ⢠æéã®çµéãšãšãã«ããŒã¿ãã©ãå€å ããããèŠãããã«äœ¿ããã ⢠e.g. ã·ã¹ãã ã¡ããªã¯ã¹ãæ ªäŸ¡ããŒã¿
æç³»åããŒã¿ã®ç¹åŸŽïŒäžéšïŒ ⢠ããŒã¿éãèšå€§ ⢠çŽè¿ã®ããŒã¿ãèªã¿åºã ⢠æéæå®ããŠäžæ¬ã§èªã¿åºã
ããŒã¿éãèšå€§ ⢠äžå®ééããã«ãæ°žç¶çã«ããŒã¿ãåã蟌ãŸãã ⢠ããŒã¿éã¯ç·åœ¢çã«å¢ããŠãã
çŽè¿ã®ããŒã¿ãèªã¿åºã çŽè¿ã®ããŒã¿ã®æšç§»ã芳å¯ããããã«äœ¿ãããããšãå€ã
æéãæå®ããŠäžæ¬ã§èªã¿åºã æéã®çµéãšå ±ã«ã©ãå€åãããã芳å¯ããããã«äœ¿ããã
éãæžã㊠éãèªã¿ãã ãããã£ãç¹åŸŽãããäžã§ ãªãã¹ãå€ãã®ã±ãŒã¹ã§
ã§ããã ãDRAMã䜿ãã
ããŒã¿ã¢ãã« 02
⢠ã¿ã€ã ã¹ã¿ã³ãã§ããŒã㣠ã·ã§ãã³ã° ⢠å®å šã«ç¬ç«ããå°ããªDBã 远å ããŠãã ⢠æè¿ã®ããŒã¿ã¯ããŒãäž â¢ ã»ãšãã©ã®ã±ãŒã¹ã§èªã¿åº
ããé«é
⢠ïŒåæ²ïŒèªã¿åºãæã¯ç¯å² æå®ããŠäžæ¬ã§èªã¿åºã ⢠ã¿ã€ã ã¹ã¿ã³ããè¿ãã㌠ã¿ãéãŸã£ãŠããã®ã§ã空 éç屿æ§ãé«ãã
Memory Partitionãš Disk Partition ã«åãã ãšãããã
å®è£ ~ Memory Partition 03
Memory Partition ⢠ã€ã³ã¡ã¢ãªDB ⢠ããŒã¿ãã¹ãé²ãããã« Write Ahead Logã«æžã 蟌ã
Logical structure ~ Memory Partition
Logical structure ~ Memory Partition ãšã«ãããããžã®æžã蟌㿠&èªã¿èŸŒã¿ã é床ããã©ãŒãã³ã¹ã«çŽçµãã
How to represent data points ⢠Sliceã¯åºåºé åã«åºã¥ããŠãã ⢠èŠçŽ æ°ãcapacityãè¶ ãããšèªåçã«åºåºé åã®ã¡ã¢ãªã³ããŒã çºç
⢠ééãªãããŒã¿ãåã蟌ãŸããã±ãŒã¹ã§ã¯çè«çã«ã¯èŠçŽ ã®è¿œå ãO(1)ã§è¡ããLinked-listããŒã¹ã®ããŒã¿æ§é ãè¯ããã
Benchmarks ~ Slice vs Linked-list
Benchmarks ~ Slice vs Linked-list äœåºŠå®è¡ããŠãæéèšç®éã®é¢ã§ã¯Sliceã®ã»ããå ãã«åå©
Benchmarks ~ Slice vs Linked-list åºåºé åã¯RAMäžã®é£ãåã£ãå Žæã«äžŠãã§ããããã ãã£ãã·ã¥ã®ç©ºéç屿æ§ãå¹ã
https://groups.google.com/g/golang-nuts/c/mPKCoYNwsoU/m/OSVy4gbCWwMJ
éãæžãã®ã¯ãããã©... ⢠ã¡ã¢ãªããŒãã£ã·ã§ã³ã¯æ®çºæ§ã¹ãã¬ãŒãžäžã§åäœ â¢ çªç¶ã®ã¯ã©ãã·ã¥ã«å¯Ÿå¿ããã
Write Ahead Log (WAL) ⢠æžã蟌ã¿ã«å è¡ããŠæäœãã°ããã£ã¹ã¯ãžæžã蟌ã ⢠ãªã«ããªå¯èœãªåœ¢åŒã§ããªãã¹ãå°ãããšã³ã³ãŒã
WAL format op: ãªãã¬ãŒã·ã§ã³ã¿ã€ã (Insert, Delete, etc) len metric: åŸç¶ããã¡ããªãã¯åæååã®é·ã
metric: ã¡ããªãã¯å timestamp: æå€§64ãããã®æŽæ°å€åUNIXã¿ã€ã ã¹ã¿ã³ã value: æå€§64ãããã®æµ®åå°æ°ç¹åã®å€
WAL format op: ãªãã¬ãŒã·ã§ã³ã¿ã€ã (Insert, Delete, etc) len metric: åŸç¶ããã¡ããªãã¯åæååã®é·ã
metric: ã¡ããªãã¯å timestamp: æå€§64ãããã®æŽæ°å€åUNIXã¿ã€ã ã¹ã¿ã³ã value: æå€§64ãããã®æµ®åå°æ°ç¹åã®å€
Varints (Variable integers) ⢠Protocol Buï¬erãå éšã§äœ¿çšããŠããå¯å€é·ãšã³ã³ãŒãã£ã³ ã°ææ³ â¢ æ°å€ã®å€§ããã«å¿ããŠæ¶è²»ãµã€ãºãå€ãã â¢
Goã§ã¯ binary.PutVarint ãæ åœ
äŸ) 10ã64ãããæŽæ°å€åãšããŠåºå®é·ãšã³ã³ãŒãããå Žå â å¿ ã8ãã€ãïŒ64ãããïŒæ¶è²»ããŠããŸã
äŸ) Varintsã§å¯å€é·ãšã³ã³ãŒãããå Žå â 1ãã€ãïŒ8ãããïŒã§åãŸã
é©åãªäœçœ®ã§èªã¿åºããçµäº ã©ã®ããã«çµäºäœçœ®ãç¹å®ããŠããã®ãïŒ
Varints ã®ä»çµã¿ å é ãããã0ã§ããã°ãã®ãã€ãã§èªã¿åºãã忢ãã
Varints (Variable integers) æ°å€åã®å€ã«é¢ããŠã¯ãã®ããã« Varints ãçšããŠæžã蟌ãã§ãã
å®è£ ~ Disk Partition 04
Disk Partition ⢠ãªã³ãã£ã¹ã¯DB ⢠1ã€ã®ãã¡ã€ã«ã«æžã蟌㟠ãã
File format ⢠æç³»åããŒã¿ã¯äžå€ã§ãç¯å²æå® ããŠäžæ¬ã§èªã¿èŸŒãã±ãŒã¹ãã»ãš ã㩠⢠Metric æ¯ã«ããŒã¿ãã€ã³ãããŸãš ããŠå§çž®ããããšã§å±ææ§â
⢠mmapã«ãã£ãŠééçã«ãã£ã ã·ã¥
Memory-mapped data ⢠ãããããããã¡ã€ã«ã¯ []byte ãšããŠã¢ã¯ã»ã¹å¯èœ ⢠ãªãããã®ã€ã³ããã¯ã¹æ§é ããªããšéå¹ç
Metadata file ⢠ããŒãã£ã·ã§ã³æ¯ã«json圢åŒã® ã¡ã¿ããŒã¿ãã¡ã€ã« ⢠ã¡ããªãã¯æ¯ã®ãã¡ã€ã«å ã〠ããªãã»ããããµã€ãºãä¿åã ããŠãã â¢
ããŒãã«ä¹ãã®ã¯ãã®ã¡ã¿ã㌠ã¿ã®ã¿
ããããã㚠⢠æžãèŸŒã¿æã®ãªãã»ããã® ä¿å ⢠èªã¿åºãæã®ãªãã»ããã® æå® ⢠ããããåãã€ã³ã¿ãã§ãŒ ã¹ã§è¡ããã
⢠Goã§ã¯ããã§io.SeekerãæŽ» èº
io.Seeker ⢠次ã«èªã¿æžãããäœçœ®ãæå®ãã ⢠çŸåšã®ãªãã»ãããè¿ããŠãããã® ã§ãååŸãæå®ãããäžã€ã§å¯èœ ⢠ã©ã³ãã ã¢ã¯ã»ã¹ã蚱容ãããã€ã åã§ããã°åºæ¬äœã§ãOK
When flushing ⢠ãã£ã¹ã¯ãžæžã蟌ãéã«åã¡ããªã ã¯ã®ãªãã»ãããä¿åããå¿ èŠ â¢ io.Seekerãæºãã *os.File ãå©çš â¢
ã¡ããªãã¯ã®æžã蟌ã¿ãéå§ããã¿ ã€ãã³ã°ã§Seek(0, io.SeekCurrent) ãåŒã¶
When reading ⢠[]byte ã®æå®ãããªãã»ããããèª ã¿åºããã ⢠io.ReadSeekerãæºãã *bytes.Reader ãå©çš
é«éã«èªã¿åºããããã«ãªã£ ããã©...
ïŒåæ²ïŒããŒã¿éãèšå€§ ⢠Varintsã§ãããªãå§çž®ãããããæäœã§ã1ãã€ãå¿ èŠ â¢ æç³»åããŒã¿ã®ç¹åŸŽã«æ³šç®ããŠ1ãã€ãæªæºã«å§çž®ã§ããªãã
Encoding ⢠ã¿ã€ã ã¹ã¿ã³ãã¯å調å¢å ããåŸåã«ãã ⢠差åã®å·®åã ãæžã蟌ãã°è¯ãã®ã§ã¯ïŒ ⢠â Delta-of-delta encoding
Delta-of-delta encoding 1600000000 1600000015 1600000030
Delta-of-delta encoding 1600000000 1600000015 1600000030 ±15 ±15
Delta-of-delta encoding 1600000000 1600000015 1600000030 ±15 ±15 ±0
Delta-of-delta encoding 1600000000 1600000015 1600000030 ±15 ±15 ±0 3çªç®ä»¥éã¯ãã®0 (1bit)
ã ããæžã蟌ãã§ãã
When reading 1600000000 1600000015 1600000030 ±15 ±15 ±0 ã·ãŒã±ã³ã·ã£ã«ã«èªã¿åºããŠãã®delta-of-deltaãå ç®ããŠãã
Bitåäœã§ã¹ããªãŒã ã«èªã¿æžããã ⢠Goã®æšæºioããã±ãŒãžã®èªã¿æžãæå°åäœã¯byte ⢠bitåäœã§èªã¿æžãããããã«ã¯ãããæŒç®ããå¿ èŠ
Bitåäœã§ã¹ããªãŒã ã«èªã¿æžããã 0001000 1 00010001 io.Writer.Write() byte宿!
Bitåäœã§ã¹ããªãŒã ã«èªã¿æžããã ⢠bitã¯boolã§è¡šçŸ
Bitåäœã§ã¹ããªãŒã ã«èªã¿æžããã
Bitåäœã§ã¹ããªãŒã ã«èªã¿æžããã ⢠0ã§æ·ãè©°ãããã8bitsã çšæ
Bitåäœã§ã¹ããªãŒã ã«èªã¿æžããã ⢠1ãæžã蟌ãå Žåã¯æ«å°Ÿã®0 ãš1ã®ãããåãåã ⢠ãããŠå¿ èŠãªåã ãå·Šã·ã ããã
è² è·ãã¹ãããŒã«ã®ããã©ãŒãã³ã¹ãæ¹å
⢠(ja) ãŒãããäœãæç³»åããŒã¿ããŒã¹ãšã³ãžã³ : https://zenn.dev/nakabonne/articles/d300838a1500c7 ⢠(en) Write a time-series
database engine from scratch: https://nakabonne.dev/posts/write-tsdb-from-scratch ⢠Repo: https://github.com/nakabonne/tstorage More...
Thanks Any questions? @nakabonne