Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

8 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

DeltaDB

ไธ€ไธชๅ— LevelDB ๅฏๅ‘็š„ C++20 ๅตŒๅ…ฅๅผ้”ฎๅ€ผๅญ˜ๅ‚จๅผ•ๆ“Ž๏ผŒ้‡‡็”จ LSM-Tree ๆžถๆž„๏ผŒๆ”ฏๆŒ WALใ€SSTableใ€ๅคš็บง Compactionใ€ๅฟซ็…ง้š”็ฆปๅ’Œ Bloom Filter ็ญ‰็‰นๆ€งใ€‚

็‰ˆๆœฌ: 1.23 | ่ฏญ่จ€: C++20 | ๆžถๆž„: LSM-Tree


็›ฎๅฝ•


้กน็›ฎ็ฎ€ไป‹

DeltaDB ๆ˜ฏไธ€ไธช้ซ˜ๆ€ง่ƒฝๅตŒๅ…ฅๅผ้”ฎๅ€ผๅญ˜ๅ‚จๅผ•ๆ“Ž๏ผŒ้‡‡็”จ LSM-Tree๏ผˆLog-Structured Merge Tree๏ผ‰ ๆžถๆž„่ฎพ่ฎกใ€‚้กน็›ฎๆ•ดไฝ“ๅ— LevelDB ๅฏๅ‘๏ผŒไฝฟ็”จ C++20 ๆ ‡ๅ‡†ๅฎž็Žฐ๏ผŒไปฃ็ ้ตๅพช Google ็ผ–็ ่ง„่Œƒ๏ผˆclang-format ๆ ผๅผๅŒ–๏ผŒ120 ๅˆ—ๅฎฝ้™ๅˆถ๏ผŒ4 ็ฉบๆ ผ็ผฉ่ฟ›๏ผ‰ใ€‚

DeltaDB ้€‚็”จไบŽ้œ€่ฆๆŒไน…ๅŒ–ๅญ˜ๅ‚จใ€้ซ˜ๅžๅๅ†™ๅ…ฅ็š„ๅœบๆ™ฏ๏ผŒๅฆ‚ๆ—ฅๅฟ—ๅญ˜ๅ‚จใ€ๆ—ถๅบๆ•ฐๆฎใ€็ผ“ๅญ˜ๅŽ็ซฏ็ญ‰ใ€‚ไฝœไธบๅตŒๅ…ฅๅผๆ•ฐๆฎๅบ“๏ผŒๅฎƒ็›ดๆŽฅ้“พๆŽฅๅˆฐๅบ”็”จ็จ‹ๅบไธญ๏ผŒๆ— ้œ€็‹ฌ็ซ‹็š„ๆ•ฐๆฎๅบ“ๆœๅŠกๅ™จใ€‚


ๆ ธๅฟƒ็‰นๆ€ง

็‰นๆ€ง ่ฏดๆ˜Ž
LSM-Tree ๆžถๆž„ 7 ๅฑ‚็ป“ๆž„๏ผˆL0-L6๏ผ‰๏ผŒMemTable โ†’ SSTable โ†’ ๅคš็บง Compaction
WAL ๆŒไน…ๅŒ– 32KB ๅ—ๅฏน้ฝ็š„้ข„ๅ†™ๆ—ฅๅฟ—๏ผŒCRC32C ๆ ก้ชŒ๏ผŒๆ”ฏๆŒๅˆ†็‰‡่ฎฐๅฝ•
ๅฟซ็…ง้š”็ฆป ๅŸบไบŽ MVCC ็š„ๅฟซ็…งๆœบๅˆถ๏ผŒ56 ไฝๅบๅˆ—ๅทไฟ่ฏไธ€่‡ดๆ€ง่ฏป
Bloom Filter ๅŒๅฑ‚ๅ“ˆๅธŒๅธƒ้š†่ฟ‡ๆปคๅ™จ๏ผŒๅคงๅน…ๅ‡ๅฐ‘ๆ— ๆ•ˆ็ฃ็›˜่ฏปๅ–
ๅ‰็ผ€ๅŽ‹็ผฉ SSTable Block ๅ†…้”ฎๅ‰็ผ€ๅŽ‹็ผฉ๏ผŒๆœ‰ๆ•ˆ้™ไฝŽๅญ˜ๅ‚จๅ ็”จ
ๆ•ฐๆฎๅŽ‹็ผฉ ๆ”ฏๆŒ Snappy ๅ’Œ Zstd ๅŽ‹็ผฉ๏ผŒๅŽ‹็ผฉ็އไธไฝณๆ—ถ่‡ชๅŠจๅ›ž้€€
LRU ็ผ“ๅญ˜ 16 ๅˆ†็‰‡ LRU ็ผ“ๅญ˜ Block ๆ•ฐๆฎ๏ผŒ็บฟ็จ‹ๅฎ‰ๅ…จ้ซ˜ๅนถๅ‘
ๅŽŸๅญๆ‰น้‡ๅ†™ๅ…ฅ WriteBatch ๆ”ฏๆŒๅŽŸๅญ Put/Delete ๆ“ไฝœ๏ผŒWAL ๅˆๅนถๅ†™
ๅผ‚ๆญฅๆ—ฅๅฟ— ๅคš็บงๅผ‚ๆญฅๆ—ฅๅฟ—็ณป็ปŸ๏ผŒๆ”ฏๆŒๆŒ‰ๅคงๅฐ่ฝฎ่ฝฌๅ’Œไฟกๅทๅค„็†
่ทณ่กจ็ดขๅผ• ๆ— ้”่ฏปๅ–่ทณ่กจ๏ผˆSkipList๏ผ‰ไฝœไธบ MemTable ๅŽ็ซฏ

ๆžถๆž„ๆ€ป่งˆ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                        DeltaDB                              โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚   DB API    โ”‚  โ”‚  WriteBatch  โ”‚  โ”‚    Snapshot       โ”‚  โ”‚
โ”‚  โ”‚ Put/Get/Del โ”‚  โ”‚  Atomic Ops  โ”‚  โ”‚    MVCC Read      โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚         โ”‚                โ”‚                    โ”‚             โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚                  DBImpl ๆ ธๅฟƒๅฎž็Žฐ                       โ”‚  โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚  โ”‚
โ”‚  โ”‚  โ”‚ MemTable โ”‚  โ”‚ Immutable MT โ”‚  โ”‚  Background     โ”‚  โ”‚  โ”‚
โ”‚  โ”‚  โ”‚ SkipList โ”‚  โ”‚   (readonly) โ”‚  โ”‚   Compaction    โ”‚  โ”‚  โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚  โ”‚
โ”‚  โ”‚       โ”‚               โ”‚                    โ”‚           โ”‚  โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚  โ”‚
โ”‚  โ”‚  โ”‚              VersionSet ็‰ˆๆœฌ็ฎก็†                  โ”‚  โ”‚  โ”‚
โ”‚  โ”‚  โ”‚  L0 (SST) โ†’ L1 (SST) โ†’ ... โ†’ L6 (SST)          โ”‚  โ”‚  โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                          โ”‚                                     โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚                    WAL ้ข„ๅ†™ๆ—ฅๅฟ—                          โ”‚  โ”‚
โ”‚  โ”‚  32KB Block | CRC32C | ๅˆ†็‰‡่ฎฐๅฝ• | fsync ไฟ้šœ            โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                                                                โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚  Bloom Filterโ”‚  โ”‚  LRU Cache   โ”‚  โ”‚  SSTable ๆ–‡ไปถ็ผ“ๅญ˜  โ”‚  โ”‚
โ”‚  โ”‚  ๅŒๅ“ˆๅธŒๆŽขๆต‹  โ”‚  โ”‚  16 ๅˆ†็‰‡     โ”‚  โ”‚  RandomAccessFile  โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆจกๅ—่ฏฆ่งฃ

1. Utils ๅทฅๅ…ทๆจกๅ—

ๅŸบ็ก€ๅทฅๅ…ท้›†ๅˆ๏ผŒไธบๆ•ดไธช้กน็›ฎๆไพ›ๅบ•ๅฑ‚ๆ”ฏๆ’‘ใ€‚

1.1 Status ็Šถๆ€็ 

็ปŸไธ€็š„้”™่ฏฏๅค„็†ๆœบๅˆถ๏ผŒ้‡‡็”จ็ดงๅ‡‘็š„็Šถๆ€็ผ–็ ๆ ผๅผ๏ผš

  • ็Šถๆ€็ : OKใ€NotFoundใ€Corruptionใ€NotSupportedใ€InvalidArgumentใ€IOError
  • ็ผ–็ ๆ ผๅผ: ไฝฟ็”จ 4 ๅญ—่Š‚ packed ็Šถๆ€็  + ๅฏๅ˜้•ฟๅบฆๆถˆๆฏ๏ผŒๅ†…ๅญ˜ๅ ็”จๆžๅฐ
  • ๅทฅๅŽ‚ๆ–นๆณ•: Status::OK()ใ€Status::NotFound(msg) ็ญ‰้™ๆ€ๅทฅๅŽ‚ๆ–นๆณ•

1.2 Coding ็ผ–่งฃ็ 

ๆไพ›ๅ›บๅฎšๅฎฝๅบฆๅ’Œๅฏๅ˜้•ฟๅบฆๆ•ดๆ•ฐ็ผ–่งฃ็ ๏ผš

  • ๅ›บๅฎšๅฎฝๅบฆ: EncodeFixed32/64ใ€DecodeFixed32/64๏ผˆๅฐ็ซฏๅบ๏ผ‰
  • Varint: GetVarint32/64ใ€PutVarint32/64๏ผŒๅฐๅ€ผไป…ๅ  1 ๅญ—่Š‚๏ผŒๆœ‰ๆ•ˆ่Š‚็œๅญ˜ๅ‚จ็ฉบ้—ด
  • LevelDB ๅ…ผๅฎน: ็ผ–่งฃ็ ๆ ผๅผไธŽ LevelDB ๅฎŒๅ…จๅ…ผๅฎน

1.3 Comparator ๆฏ”่พƒๅ™จ

ๆŠฝ่ฑกๆฏ”่พƒๆŽฅๅฃ๏ผŒๆ”ฏๆŒ่‡ชๅฎšไน‰ๆŽ’ๅบ่ง„ๅˆ™๏ผš

  • BytewiseComparator: ๆŒ‰ๅญ—่Š‚ๅบๆฏ”่พƒ็š„้ป˜่ฎคๅฎž็Žฐ
  • FindShortestSeparator: ๅฏปๆ‰พไธคไธช้”ฎไน‹้—ด็š„ๆœ€็Ÿญๅˆ†้š”็ฌฆ๏ผˆ็”จไบŽ Block ๅ‰็ผ€ๅŽ‹็ผฉไผ˜ๅŒ–๏ผ‰
  • FindShortSuccessor: ๅฏปๆ‰พ้”ฎ็š„ๆœ€็ŸญๅŽ็ปง๏ผˆ็”จไบŽ SSTable ่Œƒๅ›ดๆ‰ซๆไผ˜ๅŒ–๏ผ‰

1.4 Arena ๅ†…ๅญ˜ๅˆ†้…ๅ™จ

Bump-Pointer ๅˆ†้…ๅ™จ๏ผŒไธ“ไธบๅฐๅฏน่ฑก้ซ˜้ข‘ๅˆ†้…ๅœบๆ™ฏ่ฎพ่ฎก๏ผš

  • ๅ—ๅˆ†้…: ๆฏๆฌกๅˆ†้… 4KB ๅ†…ๅญ˜ๅ—๏ผŒๅ‡ๅฐ‘็ณป็ปŸ่ฐƒ็”จ
  • ๅฏน้ฝๅˆ†้…: ๆ”ฏๆŒๅฏน้ฝๅ†…ๅญ˜ๅˆ†้…๏ผŒๆปก่ถณ SIMD ็ญ‰ๅœบๆ™ฏ้œ€ๆฑ‚
  • ้€‚็”จๅœบๆ™ฏ: MemTable ไธญ็š„้”ฎๅ€ผๅฏนๅˆ†้…๏ผŒ้ฟๅ…้ข‘็น malloc/free

1.5 SkipList ่ทณ่กจ

LSM-Tree MemTable ็š„ๆ ธๅฟƒๆ•ฐๆฎ็ป“ๆž„๏ผš

  • ๆ— ้”่ฏปๅ–: ๅŽŸๅญๆŒ‡้’ˆๅ‘ๅธƒ๏ผŒ่ฏปๅ–็ซฏๅฎŒๅ…จๆ— ้”
  • ๅ†™ๅค–้ƒจๅŒๆญฅ: ๅ†™ๅ…ฅ็”ฑๅค–้ƒจ้”ไฟๆŠค๏ผŒ่ฏปๅนถๅ‘ๆ— ็ซžไบ‰
  • ๆœ€ๅคง้ซ˜ๅบฆ 12: ๆฆ‚็އๆ€งๅฑ‚็บง็ป“ๆž„๏ผŒๆœ็ดขๆ—ถ้—ดๅคๆ‚ๅบฆ O(log N)
  • ไธๅฏๅ˜่Š‚็‚น: ่Š‚็‚นไธ€ๆ—ฆๅˆ›ๅปบไพฟไธๅฏไฟฎๆ”น๏ผŒไฟ่ฏ่ฏปๅ–็บฟ็จ‹ๅฎ‰ๅ…จ

1.6 MySkipList ๅขžๅผบ่ทณ่กจ

ๅฆไธ€็‰ˆๆœฌ็š„่ทณ่กจๅฎž็Žฐ๏ผŒไฝฟ็”จ shared_mutex ่ฏปๅ†™้”๏ผš

  • ๆ”ฏๆŒๆ’ๅ…ฅ/ๆœ็ดข/ๅˆ ้™คๆ“ไฝœ
  • ๅŸบไบŽๆฆ‚็އ็š„ๅฑ‚็บง็”Ÿๆˆ
  • ้€‚ๅˆ้œ€่ฆๅนถๅ‘ๅˆ ้™ค็š„ๅœบๆ™ฏ

1.7 DBFormat ๅ†…้ƒจ้”ฎๆ ผๅผ

DeltaDB ็š„ๅ†…้ƒจ้”ฎๆ ผๅผ่ฎพ่ฎกๆ˜ฏๆ•ดไธช MVCC ๆœบๅˆถ็š„ๅŸบ็Ÿณ๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚    user_key      โ”‚  56-bit sequence  โ”‚  8-bit type  โ”‚
โ”‚  (ๅ˜้•ฟ็”จๆˆท้”ฎ)    โ”‚    (MVCC ๅบๅˆ—ๅท)   โ”‚  (ๅ€ผ็ฑปๅž‹)    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  • InternalKeyComparator: ๅ…ˆๆŒ‰ user_key ๅ‡ๅบ๏ผŒๅ†ๆŒ‰ sequence ้™ๅบ๏ผˆไฟ่ฏ็›ธๅŒ key ็š„ๆœ€ๆ–ฐ็‰ˆๆœฌๆŽ’ๅœจๆœ€ๅ‰๏ผ‰
  • InternalFilterPolicy: ๅŒ…่ฃ…็”จๆˆท Bloom Filter๏ผŒ้€‚้…ๅ†…้ƒจ้”ฎๆ ผๅผ
  • LookupKey: ๆŸฅๆ‰พ้”ฎๅฐ่ฃ…๏ผŒๆ–นไพฟ MemTable ๅฟซ้€Ÿๅฎšไฝ

1.8 Config ้…็ฝฎ็ณป็ปŸ

ๅŸบไบŽ TinyXML ็š„ XML ้…็ฝฎ่งฃๆž๏ผš

  • ้…็ฝฎ้กน: WAL ่ทฏๅพ„ใ€Compaction ่งฆๅ‘้˜ˆๅ€ผใ€็ผ“ๅ†ฒๅŒบๅคงๅฐใ€Block ๅคงๅฐใ€ๅŽ‹็ผฉ่ฎพ็ฝฎใ€็ผ“ๅญ˜ๅคงๅฐใ€Bloom Filter ็ญ‰
  • ReadOptions/WriteOptions: ่ฏปๅ†™ๆ“ไฝœ็š„่ฟ่กŒๆ—ถ้€‰้กน
  • Limiter: ๅŽŸๅญ่ต„ๆบๆŽงๅˆถๅ™จ๏ผŒ็”จไบŽ้™ๅˆถๅนถๅ‘ๆ–‡ไปถๆ่ฟฐ็ฌฆ็ญ‰

1.9 Logger ๅผ‚ๆญฅๆ—ฅๅฟ—

ๅคš็บงๅผ‚ๆญฅๆ—ฅๅฟ—็ณป็ปŸ๏ผš

  • ๆ—ฅๅฟ—็บงๅˆซ: DEBUG / INFO / WARN / ERROR
  • ๅผ‚ๆญฅๅ†™ๅ…ฅ: ็‹ฌ็ซ‹็บฟ็จ‹็ผ“ๅ†ฒๅ†™ๅ…ฅ๏ผŒๅ‡ๅฐ‘ๅฏนไธป่ทฏๅพ„็š„ๅฝฑๅ“
  • ๆ–‡ไปถ่ฝฎ่ฝฌ: ๆŒ‰ๆ–‡ไปถๅคงๅฐ่‡ชๅŠจ่ฝฎ่ฝฌ๏ผˆ้ป˜่ฎค 5MB๏ผ‰
  • ไฟกๅทๅค„็†: ๆณจๅ†Œ coredump ไฟกๅทๅค„็†ๅ™จ
  • ็บฟ็จ‹ๅฎ‰ๅ…จ: ๅคš็บฟ็จ‹ๅฎ‰ๅ…จ็š„็ผ“ๅ†ฒๅ†™ๅ…ฅ

1.10 Bloom Filter ๅธƒ้š†่ฟ‡ๆปคๅ™จ

็ฉบ้—ด้ซ˜ๆ•ˆ็š„ๆฆ‚็އๅž‹ๆ•ฐๆฎ็ป“ๆž„๏ผš

  • ๅŒๅ“ˆๅธŒๆŠ€ๅทง: ไฝฟ็”จไธคไธชๅ“ˆๅธŒๅ‡ฝๆ•ฐๆจกๆ‹Ÿๅคšไธชๅ“ˆๅธŒ๏ผŒๅ‡ๅฐ‘่ฎก็ฎ—ๅผ€้”€
  • ๅฏ้…็ฝฎไฝๆ•ฐ: NewBloomFilterPolicy(bits_per_key) ๆŽงๅˆถ่ฏฏๅˆค็އ
  • ๅบ”็”จๅœบๆ™ฏ: SSTable ๅฟซ้€Ÿๅˆคๆ–ญ้”ฎๆ˜ฏๅฆไธๅญ˜ๅœจ๏ผŒ้ฟๅ…ๆ— ๆ•ˆ็ฃ็›˜ I/O

1.11 ๅทฅๅ…ทๅ‡ฝๆ•ฐ้›†

  • ๆ–‡ไปถๆ“ไฝœ: CreateDirใ€RenameFileใ€RemoveFileใ€WriteStringToFileSync
  • ๅŽ‹็ผฉๅฐ่ฃ…: Snappy / Zstd ๅŽ‹็ผฉ/่งฃๅŽ‹
  • ้šๆœบๆ•ฐ: Random๏ผˆ็บฟๆ€งๅŒไฝ™ PRNG๏ผ‰
  • ๅ“ˆๅธŒ: Murmur ้ฃŽๆ ผๅ“ˆๅธŒๅ‡ฝๆ•ฐ
  • ๆ—ถ้—ด: NowMicrosใ€SleepForMicroseconds
  • ๅŒๆญฅๅŽŸ่ฏญ: CondVar ๆกไปถๅ˜้‡ๅฐ่ฃ…

1.12 NoDestructor ้˜ฒๆžๆž„ๅŒ…่ฃ…ๅ™จ

็บฟ็จ‹ๅฎ‰ๅ…จ็š„ๅ•ไพ‹ๅŒ…่ฃ…ๅ™จ๏ผŒ้ฟๅ…้™ๆ€ๅฏน่ฑก้”€ๆฏ้กบๅบ้—ฎ้ข˜ใ€‚

1.13 SingleThreadPool ๅ•็บฟ็จ‹ๆฑ 

ๆ‡’ๅฏๅŠจ็š„ๅ•ๅทฅไฝœ็บฟ็จ‹ๆฑ ๏ผŒ้ฆ–ๆฌก Schedule() ๆ—ถๅฏๅŠจ็บฟ็จ‹๏ผŒ็”จไบŽๅŽๅฐ Compaction ไปปๅŠกใ€‚


2. WAL ้ข„ๅ†™ๆ—ฅๅฟ—ๆจกๅ—

Write-Ahead Log ๆ˜ฏไฟ่ฏๆ•ฐๆฎๆŒไน…ๅŒ–็š„ๆ ธๅฟƒๆœบๅˆถใ€‚

2.1 WAL ๆ ผๅผ่ฎพ่ฎก

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    32KB Block                           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚ Record Header (7 bytes)                            โ”‚ โ”‚
โ”‚  โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚
โ”‚  โ”‚ โ”‚ 4B CRC32Cโ”‚ 2B Length โ”‚ 1B Type                 โ”‚ โ”‚ โ”‚
โ”‚  โ”‚ โ”‚ (ๆ ก้ชŒๅ’Œ) โ”‚ (ๆ•ฐๆฎ้•ฟๅบฆ) โ”‚ (Full/First/Middle/Last)โ”‚ โ”‚ โ”‚
โ”‚  โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚
โ”‚  โ”‚                    Record Data                      โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  • ๅ—ๅคงๅฐ: 32KB ๅ›บๅฎšๅ—๏ผŒไพฟไบŽ็ฎก็†ๅ’Œๅฏน้ฝ
  • ่ฎฐๅฝ•็ฑปๅž‹: Full๏ผˆๅฎŒๆ•ด่ฎฐๅฝ•๏ผ‰ใ€First/Middle/Last๏ผˆ่ทจๅ—ๅˆ†็‰‡่ฎฐๅฝ•๏ผ‰
  • CRC32C ๆ ก้ชŒ: ๆฏๆก่ฎฐๅฝ•ๅŒ…ๅซ CRC32C ๆ ก้ชŒๅ’Œ๏ผŒๆฃ€ๆต‹ๆ•ฐๆฎๆŸๅ

2.2 WAL Writer ๅ†™ๅ…ฅๅ™จ

  • ่‡ชๅŠจ่พน็•Œๅค„็†: ๅฝ“่ฎฐๅฝ•่ทจ่ถŠ 32KB ๅ—่พน็•Œๆ—ถ๏ผŒ่‡ชๅŠจๅˆ†็‰‡ไธบ First/Middle/Last ็ฑปๅž‹
  • CRC ้ข„่ฎก็ฎ—่กจ: ้ข„่ฎก็ฎ— CRC32C ็ฑปๅž‹่กจ๏ผŒๅŠ ้€Ÿๆ ก้ชŒๅ’Œ่ฎก็ฎ—
  • ่ฟฝๅŠ ๅ†™ๅ…ฅ: ้กบๅบ่ฟฝๅŠ ๏ผŒๆœ€ๅคงๅŒ–ๅ†™ๅ…ฅๅžๅ

2.3 WAL Reader ่ฏปๅ–ๅ™จ

  • ๅˆ†็‰‡้‡็ป„: ่‡ชๅŠจ้‡็ป„ First/Middle/Last ๅˆ†็‰‡่ฎฐๅฝ•
  • CRC ๆ ก้ชŒ: ่ฏปๅ–ๆ—ถ้ชŒ่ฏ CRC๏ผŒๆฃ€ๆต‹ๆŸๅๆ•ฐๆฎ
  • Reporter ๅ›ž่ฐƒ: ๅ‘็ŽฐๆŸๅๆ—ถ่ฐƒ็”จๅ›ž่ฐƒๅ‡ฝๆ•ฐ้€š็ŸฅไธŠๅฑ‚
  • ๅ็งปๅŒๆญฅๅค„็†: ๅค„็†ๆœชๅฎŒๆˆ็š„ fsync ไบง็”Ÿ็š„่„ๆ•ฐๆฎ

2.4 WritableFile ๅฏๅ†™ๆ–‡ไปถ

  • 64KB ็ผ“ๅ†ฒ: ๅ†…็ฝฎ 64KB ๅ†™็ผ“ๅ†ฒ๏ผŒๅ‡ๅฐ‘็ณป็ปŸ่ฐƒ็”จ
  • Append/Flush/Sync/Close: ๅฎŒๆ•ด็š„ๅ†™ๅ…ฅ็”Ÿๅ‘ฝๅ‘จๆœŸ็ฎก็†
  • MANIFEST ็‰นๆฎŠๅค„็†: MANIFEST ๆ–‡ไปถๅ†™ๅ…ฅๅŽๅŒๆญฅ็ˆถ็›ฎๅฝ•๏ผŒ็กฎไฟๅ…ƒๆ•ฐๆฎๆŒไน…ๅŒ–
  • ๅทฅๅŽ‚ๆ–นๆณ•: NewWritableFile๏ผˆ่ฆ†็›–ๅ†™๏ผ‰/ NewAppendableFile๏ผˆ่ฟฝๅŠ ๅ†™๏ผ‰

2.5 SequentialFile ้กบๅบ่ฏปๅ–ๆ–‡ไปถ

  • ๅช่ฏป้กบๅบ่ฎฟ้—ฎ: ็”จไบŽ WAL ๅ›žๆ”พๅ’Œ MANIFEST ่ฏปๅ–
  • Read/Skip ๆ“ไฝœ: ่ฏปๅ–ๅ’Œ่ทณ่ฟ‡ๆŒ‡ๅฎšๅญ—่Š‚ๆ•ฐ
  • ReadFileToString ่พ…ๅŠฉ: ๅฐ†ๆ•ดไธชๆ–‡ไปถ่ฏปๅ…ฅๅญ—็ฌฆไธฒ

3. Table SSTable ๆจกๅ—

SSTable๏ผˆSorted String Table๏ผ‰ๆ˜ฏๆŒไน…ๅŒ–ๆ•ฐๆฎ็š„ๆ ธๅฟƒๆ–‡ไปถๆ ผๅผใ€‚

3.1 SST ๆ–‡ไปถๆ ผๅผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    SST File Layout                      โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  [Data Block 0]                                          โ”‚
โ”‚  [Data Block 1]                                          โ”‚
โ”‚  ...                                                     โ”‚
โ”‚  [Data Block N]                                          โ”‚
โ”‚  [Meta Block (Filter Block)]                             โ”‚
โ”‚  [Meta Index Block]                                      โ”‚
โ”‚  [Index Block]                                           โ”‚
โ”‚  [Footer (48 bytes fixed)]                               โ”‚
โ”‚    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚    โ”‚ FilterBH | MetaIndexBH | IndexBH | Padding | Magicโ”‚ โ”‚
โ”‚    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚    Magic Number: 0xdb4775248b80fb57                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  • BlockHandle: varint ็ผ–็ ็š„ๅ็งป้‡ + ๅคงๅฐ๏ผŒ็ดงๅ‡‘ๅญ˜ๅ‚จ
  • Footer: ๅ›บๅฎš 48 ๅญ—่Š‚๏ผŒๅŒ…ๅซ้ญ”ๆ•ฐ 0xdb4775248b80fb57 ็”จไบŽๆ–‡ไปถๅฎŒๆ•ดๆ€งๆ ก้ชŒ
  • ReadBlock: ่ฏปๅ–ๆ—ถ่‡ชๅŠจ CRC ๆ ก้ชŒ + Snappy/Zstd ่งฃๅŽ‹

3.2 Block ๆ•ฐๆฎๅ—

SSTable ็š„ๅŸบๆœฌๅญ˜ๅ‚จๅ•ๅ…ƒ๏ผš

  • ๅ‰็ผ€ๅŽ‹็ผฉ: Block ๅ†…็›ธ้‚ป้”ฎๅ…ฑไบซๅ‰็ผ€๏ผŒไป…ๅญ˜ๅ‚จๅทฎๅผ‚ๅŽ็ผ€
  • Restart Point: ๆฏ block_restart_interval๏ผˆ้ป˜่ฎค 16๏ผ‰ๆก่ฎฐๅฝ•่ฎพ็ฝฎไธ€ไธชๅฎŒๆ•ด้”ฎ้‡ๅฏ็‚น
  • ๅŒๅ‘่ฟญไปฃ: ๆ”ฏๆŒ forward/backward ้ๅކ
  • ไบŒๅˆ†ๆœ็ดข: ๅŸบไบŽ Restart Point ๅฏน้”ฎ่ฟ›่กŒไบŒๅˆ†ๆœ็ดข๏ผŒๅŠ ้€Ÿ็‚นๆŸฅ

3.3 BlockBuilder ๅ—ๆž„ๅปบๅ™จ

  • ๅ‰็ผ€ๅŽ‹็ผฉไผ˜ๅŒ–: ่‡ชๅŠจๆฃ€ๆต‹็›ธ้‚ป้”ฎ็š„ๅ…ฑๅŒๅ‰็ผ€๏ผŒๅ‡ๅฐ‘ๅ†—ไฝ™ๅญ˜ๅ‚จ
  • ้‡ๅฏ็‚น็ฎก็†: ๅฎšๆœŸๆ’ๅ…ฅๅฎŒๆ•ด้”ฎไฝœไธบ้‡ๅฏ็‚น๏ผŒๆ”ฏๆŒๅฟซ้€ŸไบŒๅˆ†ๆŸฅๆ‰พ

3.4 Table SSTable ่กจ

  • ไธคๅฑ‚่ฟญไปฃๅ™จ: Index Block โ†’ Data Block๏ผŒ้€ๆ˜Ž้ๅކๆ‰€ๆœ‰ๆ•ฐๆฎ
  • Bloom Filter ไผ˜ๅŒ–: ็‚นๆŸฅๆ—ถๅ…ˆๆฃ€ๆŸฅ Bloom Filter๏ผŒๅฟซ้€Ÿ่ทณ่ฟ‡ไธๅญ˜ๅœจ็š„้”ฎ
  • InternalGet: ้’ˆๅฏนๅ†…้ƒจๆŸฅ่ฏข็š„ไผ˜ๅŒ–่ทฏๅพ„๏ผŒ็›ดๆŽฅๅฎšไฝๅˆฐ็›ฎๆ ‡ Block

3.5 SSTBuilder SST ๆž„ๅปบๅ™จ

ๅฎŒๆ•ด็š„ SST ๆ–‡ไปถๆž„ๅปบๆต็จ‹๏ผš

  1. ๆž„ๅปบ Data Block๏ผˆๅซๅ‰็ผ€ๅŽ‹็ผฉ๏ผ‰
  2. ๆž„ๅปบ Filter Block๏ผˆๆฏ 2KB ๆ•ฐๆฎๆฎต็”Ÿๆˆไธ€ไธช Bloom Filter๏ผ‰
  3. ๆž„ๅปบ Meta Index Block
  4. ๆž„ๅปบ Index Block
  5. ๅ†™ๅ…ฅ Footer
  • ๅŽ‹็ผฉ็ญ–็•ฅ: ๆ”ฏๆŒ Snappy ๅ’Œ Zstd๏ผŒๅŽ‹็ผฉ็އไฝŽไบŽ 12.5% ๆ—ถ่‡ชๅŠจๅ›ž้€€ไธบๆœชๅŽ‹็ผฉ
  • Zstd ๅฏ้…็ฝฎ็บงๅˆซ: ้€š่ฟ‡ config.xml ่ฎพ็ฝฎๅŽ‹็ผฉ็บงๅˆซ

3.6 Cache LRU ็ผ“ๅญ˜

  • 16 ๅˆ†็‰‡่ฎพ่ฎก: ๅ‡ๅฐ‘้”็ซžไบ‰๏ผŒๆฏไธชๅˆ†็‰‡็‹ฌ็ซ‹ไบ’ๆ–ฅ้”
  • ๅ“ˆๅธŒ่กจ + ๅŒๅ‘้“พ่กจ: O(1) ๆŸฅๆ‰พ + LRU ๆท˜ๆฑฐ
  • ็บฟ็จ‹ๅฎ‰ๅ…จ: ๅˆ†็‰‡็บง็ป†็ฒ’ๅบฆ้”

3.7 SSTCache SST ๆ–‡ไปถ็ผ“ๅญ˜

  • ๆ–‡ไปถๅทๆ˜ ๅฐ„: ๅฐ† file_number ๆ˜ ๅฐ„ๅˆฐ Table ๅฏน่ฑก
  • ่ฟญไปฃๅ™จๆธ…็†ๅ›ž่ฐƒ: ่ฟญไปฃๅ™จ้”€ๆฏๆ—ถ่‡ชๅŠจ้‡Šๆ”พๅ…ณ่”่ต„ๆบ
  • ๅบ•ๅฑ‚ LRU ็ผ“ๅญ˜: ๅค็”จ้€š็”จ LRU ็ผ“ๅญ˜ๅฎž็Žฐ

3.8 FilterBlock ่ฟ‡ๆปคๅ™จๅ—

  • ๅˆ†ๆฎต Bloom Filter: ๆฏ 2KB ๆ•ฐๆฎๆฎต็”Ÿๆˆ็‹ฌ็ซ‹็š„ Bloom Filter
  • ๆ ผๅผ: [Filter 0][Filter 1]...[ๅ็งปๆ•ฐ็ป„][4B ๅ็งป + 1B log_base]
  • ้ซ˜ๆ•ˆๆž„ๅปบ/่ฏปๅ–: FilterBlockBuilder/FilterBlockReader ๅฎŒๆ•ด็”Ÿๅ‘ฝๅ‘จๆœŸ็ฎก็†

3.9 MergeIterator ๅˆๅนถ่ฟญไปฃๅ™จ

  • K ่ทฏๅฝ’ๅนถ: ๅคš่ทฏๆœ‰ๅบ่ฟญไปฃๅ™จ็š„ๅฝ’ๅนถๆŽ’ๅบ
  • ๅŒๅ‘้ๅކ: ๆ”ฏๆŒๆ–นๅ‘ๅˆ‡ๆขๆ—ถ็š„่‡ชๅŠจ้‡ๅฎšไฝ
  • ๅบ”็”จๅœบๆ™ฏ: ๅคšๅฑ‚็บงใ€ๅคšๆ–‡ไปถ็š„ๆœ‰ๅบๆ•ฐๆฎๅˆๅนถ

3.10 TwoLevelIterator ไธคๅฑ‚่ฟญไปฃๅ™จ

  • Index โ†’ Data ๅทฅๅŽ‚: ้€š่ฟ‡ Index Block ๅฎšไฝ Data Block๏ผŒๆŒ‰้œ€ๅŠ ่ฝฝ
  • ้€ๆ˜Ž้ๅކ: ไธŠๅฑ‚ๆ— ้œ€ๅ…ณๅฟƒๅบ•ๅฑ‚ Block ่พน็•Œ

3.11 RandomAccessFile ้šๆœบ่ฎฟ้—ฎๆ–‡ไปถ

  • pread ็ณป็ปŸ่ฐƒ็”จ: ็บฟ็จ‹ๅฎ‰ๅ…จ็š„้šๆœบ่ฏปๅ–๏ผŒๆ— ้œ€็ปดๆŠคๆ–‡ไปถๅ็งป
  • FD Limiter ้›†ๆˆ: ๆŽงๅˆถๆ‰“ๅผ€็š„ๆ–‡ไปถๆ่ฟฐ็ฌฆๆ•ฐ้‡

4. DB ๆ•ฐๆฎๅบ“ๆ ธๅฟƒๆจกๅ—

4.1 DB ๅ…ฌๅ…ฑ API

ๆไพ›็ฎ€ๆด็š„็”จๆˆทๆŽฅๅฃ๏ผš

DB::Open()          // ๆ‰“ๅผ€/ๅˆ›ๅปบๆ•ฐๆฎๅบ“
Put(key, value)     // ๅ†™ๅ…ฅ้”ฎๅ€ผๅฏน
Get(key, &value)    // ่ฏปๅ–ๅ€ผ
Delete(key)         // ๅˆ ้™ค้”ฎ
Write(options, batch)  // ๅŽŸๅญๆ‰น้‡ๅ†™ๅ…ฅ
NewIterator()       // ๅˆ›ๅปบ่ฟญไปฃๅ™จ
GetSnapshot()       // ่Žทๅ–ๅฟซ็…ง
ReleaseSnapshot()   // ้‡Šๆ”พๅฟซ็…ง
GetProperty(name)   // ่Žทๅ–ๅฑžๆ€ง
CompactRange(begin, end)  // ๆ‰‹ๅŠจๅŽ‹็ผฉ
DestroyDB()         // ้”€ๆฏๆ•ฐๆฎๅบ“
RepairDB()          // ไฟฎๅคๆ•ฐๆฎๅบ“

4.2 DBImpl ๆ ธๅฟƒๅฎž็Žฐ

DeltaDB ็š„ๆ ธๅฟƒๅผ•ๆ“Ž๏ผŒๅ่ฐƒๆ‰€ๆœ‰ๅญ็ณป็ปŸ๏ผš

  • ๅ†™ๅ…ฅ้˜Ÿๅˆ—: ๆ‰น้‡ๅˆ†็ป„ๅ†™ๅ…ฅ๏ผˆWrite Grouping๏ผ‰๏ผŒๅคšไธช WriteBatch ๅˆๅนถไธบไธ€ๆฌก WAL ๅ†™ๅ…ฅ
  • WAL ๅ†™ๅ…ฅ: ไฟ่ฏๆŒไน…ๅŒ–๏ผŒfsync ็กฎไฟๆ•ฐๆฎ่ฝ็›˜
  • MemTable ็ฎก็†: ๆดป่ทƒ MemTable ๅ’Œ Immutable MemTable ็š„ๅˆ‡ๆข
  • ๅŽๅฐ Compaction: ้€š่ฟ‡ๅ•็บฟ็จ‹ๆฑ ่ฐƒๅบฆ๏ผŒ่งฆๅ‘ๆกไปถๅ’Œ็ญ–็•ฅ็”ฑ VersionSet ๅ†ณๅฎš
  • ๅฟซ็…ง็ฎก็†: ็ปดๆŠคๅฟซ็…ง้“พ่กจ๏ผŒไฟ่ฏไธ€่‡ดๆ€ง่ฏป
  • VersionSet ไบคไบ’: ็‰ˆๆœฌ้“พ็š„ๆ›ดๆ–ฐๅ’ŒๆŒไน…ๅŒ–
  • ๆ–‡ไปถๆธ…็†: ๅผ‚ๆญฅๆธ…็†ไธๅ†่ขซไปปไฝ•็‰ˆๆœฌๅผ•็”จ็š„ๆ—ง SST ๆ–‡ไปถ

4.3 MemTable ๅ†…ๅญ˜่กจ

  • ่ทณ่กจๅŽ็ซฏ: ไฝฟ็”จ SkipList ไฝœไธบๅบ•ๅฑ‚ๆ•ฐๆฎ็ป“ๆž„
  • ๅ†…้ƒจ้”ฎๅญ˜ๅ‚จ: ๅญ˜ๅ‚จๅธฆๅบๅˆ—ๅทๅ’Œ็ฑปๅž‹ไฟกๆฏ็š„ๅ†…้ƒจ้”ฎ
  • Varint ้•ฟๅบฆๅ‰็ผ€: ้”ฎๅ€ผๅฏน้‡‡็”จ varint ้•ฟๅบฆๅ‰็ผ€ๆ ผๅผ
  • ๅผ•็”จ่ฎกๆ•ฐ: ๅฎ‰ๅ…จ็š„็”Ÿๅ‘ฝๅ‘จๆœŸ็ฎก็†
  • ๆ“ไฝœ: Add()ใ€Get()ใ€NewIterator()

4.4 WriteBatch ๆ‰น้‡ๅ†™ๅ…ฅ

  • ๅŽŸๅญๆ“ไฝœ: ไธ€ๆ‰น Put/Delete ๆ“ไฝœ่ฆไนˆๅ…จ้ƒจๆˆๅŠŸ๏ผŒ่ฆไนˆๅ…จ้ƒจๅคฑ่ดฅ
  • ๅบๅˆ—ๅŒ–ๆ ผๅผ: 12 ๅญ—่Š‚ๅคด๏ผˆ8B ๅบๅˆ—ๅท + 4B ่ฎกๆ•ฐ๏ผ‰+ varint ๅ‰็ผ€ๅญ—็ฌฆไธฒ
  • WriteBatchInternal: ๆไพ›ๅบ•ๅฑ‚ๆ“ไฝœๆŽฅๅฃ
  • MemTableInserter: ๅฐ† Batch ๅ›žๆ”พ่‡ณ MemTable
  • WAL ๅˆๅนถๅ†™: ๅคšไธชๅนถๅ‘ Write ๅˆๅนถไธบไธ€ๆฌก WAL ๅ†™ๅ…ฅ๏ผŒๆžๅคงๆๅ‡ๅžๅ

4.5 Snapshot ๅฟซ็…ง

  • ๅŒๅ‘ๅพช็Žฏ้“พ่กจ: SnapshotList ็ฎก็†ๆ‰€ๆœ‰ๆดป่ทƒๅฟซ็…ง
  • ๅบๅˆ—ๅท: ๆฏไธชๅฟซ็…งๆŒๆœ‰ๅˆ›ๅปบๆ—ถ็š„ๅบๅˆ—ๅท๏ผŒ็”จไบŽ MVCC ๅฏ่งๆ€งๅˆคๆ–ญ
  • ไธ€่‡ดๆ€ง่ฏป: ๅฟซ็…ง็กฎไฟ่ฏปๅ–ๆ“ไฝœๅช็œ‹ๅˆฐๅฟซ็…งๅˆ›ๅปบไน‹ๅ‰็š„ๆ•ฐๆฎ

4.6 DBIter ็”จๆˆท่ฟญไปฃๅ™จ

  • ๅ†…้ƒจ่ฟญไปฃๅ™จๅŒ…่ฃ…: ๅฐ่ฃ…ๅ†…้ƒจ่ฟญไปฃๅ™จ๏ผŒๆไพ›็”จๆˆท่ง†ๅ›พ
  • ๅฟซ็…ง่ฟ‡ๆปค: ๆ นๆฎๅฟซ็…งๅบๅˆ—ๅท่ฟ‡ๆปคไธๅฏ่ง็š„้”ฎ็‰ˆๆœฌ
  • ๅˆ ้™คๆ ‡่ฎฐๅค„็†: ่‡ชๅŠจ่ทณ่ฟ‡ๅทฒๅˆ ้™ค็š„้”ฎ
  • ๆ–นๅ‘่ฟฝ่ธช: ่ฎฐๅฝ•้ๅކๆ–นๅ‘๏ผŒๆ”ฏๆŒๆญฃๅ‘/ๅๅ‘ๅˆ‡ๆข
  • ่ฏปๅ–้‡‡ๆ ท: ่ฎฐๅฝ•่ฏปๅ–ๆ ทๆœฌ๏ผŒ็”จไบŽ่‡ชๅŠจ่งฆๅ‘ Compaction

4.7 VersionEdit ็‰ˆๆœฌ็ผ–่พ‘

ๆ่ฟฐ็‰ˆๆœฌไน‹้—ด็š„ๅ˜ๅŒ–๏ผš

  • ่ฎฐๅฝ•ๅ†…ๅฎน: ๆฏ”่พƒๅ™จๅ็งฐใ€WAL ็ผ–ๅทใ€ไธ‹ไธ€ไธชๆ–‡ไปถ็ผ–ๅทใ€ๆœ€ๅŽๅบๅˆ—ๅทใ€Compaction ๆŒ‡้’ˆใ€ๆ–ฐๅขž/ๅˆ ้™ค็š„ SST ๆ–‡ไปถ
  • Tag ็ผ–็ : ๅŸบไบŽ Tag ็š„ไบŒ่ฟ›ๅˆถ็ผ–็ ๏ผŒ็ดงๅ‡‘้ซ˜ๆ•ˆ

4.8 VersionSet ็‰ˆๆœฌ็ฎก็†

็‰ˆๆœฌ็ฎก็†็š„ๆ ธๅฟƒ็ณป็ปŸ๏ผš

  • Version: ๆŸไธชๆ—ถ้—ด็‚น็š„ SST ๆ–‡ไปถๅฟซ็…ง๏ผˆ่ทจ L0-L6 ๆ‰€ๆœ‰ๅฑ‚๏ผ‰
  • VersionSet: ็‰ˆๆœฌ้“พ๏ผŒ้€š่ฟ‡ MANIFEST ๆ–‡ไปถๆŒไน…ๅŒ–
  • Compaction ้€‰ๆ‹ฉ: ๅŸบไบŽๆ–‡ไปถๅคงๅฐ๏ผˆSize-based๏ผ‰ๆˆ– Seek ๆฌกๆ•ฐ๏ผˆSeek-based๏ผ‰
  • Builder ้ซ˜ๆ•ˆๅบ”็”จ: Builder ็ป“ๆž„้ซ˜ๆ•ˆๅœฐๅฐ†็ผ–่พ‘ๅบ”็”จๅˆฐๅฝ“ๅ‰็‰ˆๆœฌ
  • MANIFEST ๅ›žๆ”พ: ๅฏๅŠจๆ—ถ้‡ๆ”พ MANIFEST ๆขๅค็‰ˆๆœฌ็Šถๆ€
  • Compaction ่ฏ„ๅˆ†: ่ฎก็ฎ—ๆฏไธชๅฑ‚็š„ Compaction ๅˆ†ๆ•ฐ๏ผŒๅ†ณๅฎšไผ˜ๅ…ˆ็บง

4.9 Filename ๆ–‡ไปถๅ‘ฝๅ

็ปŸไธ€็š„ๆ–‡ไปถๅ‘ฝๅ่ง„่Œƒ๏ผš

ๆ–‡ไปถ็ฑปๅž‹ ๅ‘ฝๅๆ ผๅผ ่ฏดๆ˜Ž
WAL {dbname}/NNNNNN.wal ้ข„ๅ†™ๆ—ฅๅฟ—
SST {dbname}/NNNNNN.sst ๆŽ’ๅบๅญ—็ฌฆไธฒ่กจ
Temp {dbname}/NNNNNN.dbtmp ไธดๆ—ถๆ–‡ไปถ
MANIFEST MANIFEST-NNNNNN ็‰ˆๆœฌๅ…ƒๆ•ฐๆฎ
CURRENT CURRENT ๆŒ‡ๅ‘ๅฝ“ๅ‰ MANIFEST
LOCK LOCK ๆ•ฐๆฎๅบ“้”ๆ–‡ไปถ
LOG LOG ่ฟ่กŒๆ—ฅๅฟ—
  • ParseFileName: ่งฃๆžๆ–‡ไปถๅๆฃ€ๆต‹็ฑปๅž‹
  • SetCurrentFile: ๅŽŸๅญๆ›ดๆ–ฐ CURRENT ๆ–‡ไปถ

ๆ•ฐๆฎๆ ผๅผ่ฎพ่ฎก

ๅ†…้ƒจ้”ฎ๏ผˆInternal Key๏ผ‰

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚      user_key       โ”‚  sequence (56bit) โ”‚ type (8bit)  โ”‚
โ”‚   (ๅ˜้•ฟ๏ผŒ็”จๆˆทๅฎšไน‰)   โ”‚   (MVCC ็‰ˆๆœฌๅท)    โ”‚ (ValueType) โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  • ValueType: kTypeValue (0x0) ่กจ็คบๆœ‰ๆ•ˆๅ€ผ๏ผŒkTypeDeletion (0x1) ่กจ็คบๅˆ ้™คๆ ‡่ฎฐ
  • ๆฏ”่พƒ่ง„ๅˆ™: user_key ๅ‡ๅบ โ†’ sequence ้™ๅบ๏ผˆ็กฎไฟ็›ธๅŒ key ็š„ๆœ€ๆ–ฐ็‰ˆๆœฌไผ˜ๅ…ˆ่ขซๆ‰ซๆๅˆฐ๏ผ‰

WriteBatch ๅบๅˆ—ๅŒ–ๆ ผๅผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Header (12 bytes)โ”‚          Record Body                โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ Seq(8B)โ”‚Cnt(4B)โ”‚โ”‚โ”‚ [tag][varint_len][data]... ้‡ๅค  โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ”‚โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๅ†™ๅ…ฅ่ทฏๅพ„

็”จๆˆท Put/Delete
       โ”‚
       โ–ผ
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚WriteBatchโ”‚ โ† ๅคšไธช Write ๅˆๅนถไธบไธ€ไธช Batch
  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜
       โ”‚
       โ–ผ
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚  WAL ๅ†™ๅ…ฅ โ”‚ โ† ้กบๅบ่ฟฝๅŠ ๅˆฐ WAL๏ผŒfsync ไฟ้šœๆŒไน…ๅŒ–
  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜
       โ”‚
       โ–ผ
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚ MemTable  โ”‚ โ† ๅ†™ๅ…ฅๆดป่ทƒ MemTable๏ผˆ่ทณ่กจ็ป“ๆž„๏ผ‰
  โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜
        โ”‚
        โ”‚ MemTable ๆปก (write_buffer_size)
        โ–ผ
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚ Immutable MT โ”‚ โ† ๅˆ‡ๆขไธบๅช่ฏป๏ผŒ่งฆๅ‘ๅŽๅฐ Compaction
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚  Flush to L0 โ”‚ โ† ็”Ÿๆˆ L0 ๅฑ‚ SSTable ๆ–‡ไปถ
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

่ฏปๅ–่ทฏๅพ„

็”จๆˆท Get(key)
     โ”‚
     โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  ๆœชๆ‰พๅˆฐ๏ผŸ   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  MemTable   โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ โ”‚ Immutable MT โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                   โ”‚
                            ๆœชๆ‰พๅˆฐ๏ผŸโ”‚
                                   โ–ผ
                          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                          โ”‚  L0 SST files  โ”‚ โ† ๅฏ่ƒฝๆœ‰้‡ๅ ๏ผŒ้€ไธชๆฃ€ๆŸฅ
                          โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                  โ”‚
                           ๆœชๆ‰พๅˆฐ๏ผŸโ”‚
                                  โ–ผ
                          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                          โ”‚ L1 โ†’ L6 SST    โ”‚ โ† Bloom Filter ๅฟซ้€Ÿ่ทณ่ฟ‡
                          โ”‚ (Bloom Filter) โ”‚   ไธๅญ˜ๅœจ็š„ๆ–‡ไปถ
                          โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Bloom Filter ไผ˜ๅŒ–: ๅœจ่ฏปๅ– SSTable ไน‹ๅ‰๏ผŒๅ…ˆๆฃ€ๆŸฅๅฏนๅบ”ๆ–‡ไปถ็š„ Bloom Filterใ€‚ๅฆ‚ๆžœ Bloom Filter ่ฟ”ๅ›ž negative๏ผŒๅˆ™็›ดๆŽฅ่ทณ่ฟ‡่ฏฅๆ–‡ไปถ๏ผŒ้ฟๅ…ๆ— ๆ•ˆ็ฃ็›˜ I/Oใ€‚


Compaction ๆœบๅˆถ

  MemTable (ๆปก)
       โ”‚ flush
       โ–ผ
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚  L0     โ”‚ โ† ๆ–‡ไปถๅฏ่ƒฝๆœ‰้”ฎ้‡ๅ 
  โ”‚ (4 ๆ–‡ไปถ) โ”‚ โ† L0_compaction_trigger = 4 ่งฆๅ‘
  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜
       โ”‚ compaction
       โ–ผ
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚  L1     โ”‚ โ† ๆ–‡ไปถๆ— ้‡ๅ ๏ผŒๆŒ‰ๅบๆŽ’ๅˆ—
  โ”‚         โ”‚
  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜
       โ”‚
       โ–ผ
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚  L2     โ”‚
  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜
       โ”‚
       ...
       โ”‚
       โ–ผ
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚  L6     โ”‚ โ† ๆœ€็ปˆๅฑ‚๏ผŒๅŒ…ๅซๆœ€ๅคšๆ•ฐๆฎ
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

่งฆๅ‘็ญ–็•ฅ:

  • Size-based: ๆŸๅฑ‚ๆ–‡ไปถๆ•ฐ/ๅคงๅฐ่ถ…่ฟ‡้˜ˆๅ€ผๆ—ถ่งฆๅ‘ Compaction
  • Seek-based: ๆŸๆ–‡ไปถ Seek ๆฌกๆ•ฐ่ฟ‡ๅคš๏ผˆ่ฏดๆ˜Ž Bloom Filter ่ฏฏๅˆค็އ้ซ˜๏ผ‰๏ผŒ่งฆๅ‘ Compaction ๆธ…็†

Compaction ่ฟ‡็จ‹:

  1. ้€‰ๆ‹ฉๅพ… Compaction ็š„่พ“ๅ…ฅๆ–‡ไปถ
  2. ไธŽไธ‹ไธ€ๅฑ‚ๆœ‰้‡ๅ ็š„ๆ–‡ไปถๅˆๅนถ
  3. ็”Ÿๆˆๆ–ฐ็š„ SSTable ๆ–‡ไปถ
  4. ๆ›ดๆ–ฐ VersionSet๏ผŒ่ฎฐๅฝ•ๆ–ฐๅขž/ๅˆ ้™ค็š„ๆ–‡ไปถ
  5. ๆŒไน…ๅŒ–ๅˆฐ MANIFEST
  6. ๅผ‚ๆญฅๆธ…็†ๆ—งๆ–‡ไปถ

ๆž„ๅปบไธŽ่ฟ่กŒ

ไพ่ต–

ๅบ“ ็”จ้€”
crc32c CRC32C ๆ ก้ชŒๅ’Œ่ฎก็ฎ—
ZLIB ๆ•ฐๆฎๅŽ‹็ผฉ
GTest ๅ•ๅ…ƒๆต‹่ฏ•
TinyXML XML ้…็ฝฎ่งฃๆž
Snappy ๅฟซ้€ŸๅŽ‹็ผฉ๏ผˆๅฏ้€‰๏ผ‰
Zstd ้ซ˜ๅŽ‹็ผฉๆฏ”ๅŽ‹็ผฉ๏ผˆๅฏ้€‰๏ผ‰

ๆž„ๅปบ

# ไธ€้”ฎๆž„ๅปบ๏ผˆๆธ…็† + CMake + ็ผ–่ฏ‘๏ผ‰
./to_build.sh

# ๆ‰‹ๅŠจๆž„ๅปบ
mkdir -p build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)

ๆž„ๅปบไบง็‰ฉ๏ผš

  • ๅฏๆ‰ง่กŒๆ–‡ไปถ: build/bin/deltadb
  • ๅบ“ๆ–‡ไปถ: build/lib/ ไธ‹็š„้™ๆ€ๅบ“

่ฟ่กŒ REPL

./build/bin/deltadb              # ้ป˜่ฎคๆ•ฐๆฎๅบ“่ทฏๅพ„ ./output/delta
./build/bin/deltadb --db /path   # ๆŒ‡ๅฎšๆ•ฐๆฎๅบ“่ทฏๅพ„

REPL ๅ‘ฝไปค

ๅ‘ฝไปค ่ฏดๆ˜Ž
put <key> <value> ๅ†™ๅ…ฅ้”ฎๅ€ผๅฏน
get <key> ๆŸฅ่ฏขๅ€ผ
del <key> ๅˆ ้™ค้”ฎ
scan [begin] [end] ่Œƒๅ›ดๆ‰ซๆ
compact [begin] [end] ๆ‰‹ๅŠจ Compaction
stats ๆŸฅ็œ‹็ปŸ่ฎกไฟกๆฏ
dbdir ๆŸฅ็œ‹ๆ•ฐๆฎๅบ“็›ฎๅฝ•
help ๅธฎๅŠฉ
quit ้€€ๅ‡บ

้…็ฝฎ่ฏดๆ˜Ž

้…็ฝฎๆ–‡ไปถไฝไบŽ conf/config.xml๏ผŒไธป่ฆ้…็ฝฎ้กน๏ผš

ๆ—ฅๅฟ—้…็ฝฎ

<log>
    <path>./output/log</path>       <!-- ๆ—ฅๅฟ—็›ฎๅฝ• -->
    <prefix>delta</prefix>           <!-- ๆ—ฅๅฟ—ๆ–‡ไปถๅๅ‰็ผ€ -->
    <max_file_size>5242880</max_file_size>  <!-- ๅ•ๆ–‡ไปถๆœ€ๅคง 5MB -->
    <level>DEBUG</level>             <!-- ๆ—ฅๅฟ—็บงๅˆซ -->
    <sync_interval>500</sync_interval>      <!-- ๅŒๆญฅ้—ด้š” 500ms -->
</log>

WAL ้…็ฝฎ

<wal>
    <path>./output/wal</path>        <!-- WAL ็›ฎๅฝ• -->
    <base_name>WAL</base_name>       <!-- WAL ๆ–‡ไปถๅๅ‰็ผ€ -->
    <max_file_size>10485760</max_file_size> <!-- ๅ•ๆ–‡ไปถๆœ€ๅคง 10MB -->
</wal>

ๆ•ฐๆฎๅบ“้…็ฝฎ

<db>
    <num_levels>7</num_levels>                    <!-- LSM ๅฑ‚ๆ•ฐ -->
    <l0_compaction_trigger>4</l0_compaction_trigger>  <!-- L0 ่งฆๅ‘ Compaction ๆ–‡ไปถๆ•ฐ -->
    <l0_slowdown_writes_trigger>8</l0_slowdown_writes_trigger>  <!-- L0 ๅ†™ๅ…ฅๅ‡้€Ÿ้˜ˆๅ€ผ -->
    <l0_stop_writes_trigger>12</l0_stop_writes_trigger>  <!-- L0 ๅ†™ๅ…ฅๅœๆญข้˜ˆๅ€ผ -->
    <write_buffer_size>4194304</write_buffer_size>  <!-- MemTable ๅคงๅฐ 4MB -->
    <block_size>4096</block_size>                   <!-- SST Block ๅคงๅฐ 4KB -->
    <block_restart_interval>16</block_restart_interval>  <!-- Block ้‡ๅฏ็‚น้—ด้š” -->
    <max_sst_size>2097152</max_sst_size>            <!-- ๆœ€ๅคง SST ๆ–‡ไปถๅคงๅฐ 2MB -->
    <zstd_compression_level>1</zstd_compression_level>  <!-- Zstd ๅŽ‹็ผฉ็บงๅˆซ -->
    <fd_limiter>50</fd_limiter>                     <!-- ๆ–‡ไปถๆ่ฟฐ็ฌฆ้™ๅˆถ -->
</db>

ๆŠ€ๆœฏไบฎ็‚น

1. ๅ†™ๅ…ฅ้˜Ÿๅˆ—ไธŽๆ‰น้‡ๅˆ†็ป„๏ผˆWrite Grouping๏ผ‰

ๅคšไธชๅนถๅ‘ๅ†™ๅ…ฅ่ฏทๆฑ‚่ขซๅˆๅนถไธบไธ€ไธช WriteBatch๏ผŒไธ€ๆฌกๆ€งๅ†™ๅ…ฅ WAL ๅ’Œ MemTableใ€‚่ฟ™ๆžๅคงๅ‡ๅฐ‘ไบ† fsync ็š„ๆฌกๆ•ฐ๏ผŒๅฐ†้šๆœบๅ†™่ฝฌไธบ้กบๅบ่ฟฝๅŠ ๏ผŒๆ˜พ่‘—ๆๅ‡ไบ†ๅ†™ๅ…ฅๅžๅ้‡ใ€‚

2. ๆ— ้”่ฏป่ทณ่กจ

MemTable ็š„ SkipList ้‡‡็”จๅŽŸๅญๆŒ‡้’ˆๅ‘ๅธƒๆœบๅˆถ๏ผŒ่ฏปๅ–็ซฏๅฎŒๅ…จๆ— ้”ใ€‚ๅ†™ๆ“ไฝœ็”ฑๅค–้ƒจไบ’ๆ–ฅ้”ไฟๆŠค๏ผŒ่ฏปๅ†™ไบ’ไธ้˜ปๅกž๏ผŒๅœจ่ฏปๅคšๅ†™ๅฐ‘็š„ๅœบๆ™ฏไธ‹ๆ€ง่ƒฝไผ˜ๅผ‚ใ€‚

3. ไธคๅฑ‚ SSTable ่ฟญไปฃๅ™จ

Index Block ๆŒ‡ๅ‘ Data Block๏ผŒ้€š่ฟ‡ TwoLevelIterator ้€ๆ˜Ž้ๅކใ€‚ไธŠๅฑ‚ๆ— ้œ€ๅ…ณๅฟƒ Block ่พน็•Œ๏ผŒๆŒ‰้œ€ๅŠ ่ฝฝ Data Block ๅˆฐ็ผ“ๅญ˜๏ผŒๆœ‰ๆ•ˆๅˆฉ็”จๅ†…ๅญ˜ใ€‚

4. Bloom Filter ไผ˜ๅŒ–

ๆฏ 2KB ๆ•ฐๆฎๆฎต็”Ÿๆˆ็‹ฌ็ซ‹็š„ Bloom Filter๏ผŒ็‚นๆŸฅๆ—ถๅ…ˆๆฃ€ๆŸฅ Bloom Filterใ€‚ๅฆ‚ๆžœ็กฎๅฎš้”ฎไธๅญ˜ๅœจ๏ผŒ็›ดๆŽฅ่ทณ่ฟ‡่ฏฅ SSTable ๆ–‡ไปถ๏ผŒ้ฟๅ…ๆ— ๆ•ˆ็š„็ฃ็›˜ I/Oใ€‚ๅœจ้ซ˜่ฏฏๅˆคๅฎนๅฟๅœบๆ™ฏไธ‹๏ผˆๅฆ‚ 1%๏ผ‰๏ผŒๅฏไปฅ่ฟ‡ๆปคๆމ 99% ็š„ๆ— ๆ•ˆ่ฏปๅ–ใ€‚

5. ๅ‰็ผ€ๅŽ‹็ผฉๅญ˜ๅ‚จ

SSTable Block ๅ†…็›ธ้‚ป้”ฎๅ…ฑไบซๅ‰็ผ€๏ผŒไป…ๅญ˜ๅ‚จๅทฎๅผ‚ๅŽ็ผ€ใ€‚ๆฏ 16 ๆก่ฎฐๅฝ•่ฎพ็ฝฎไธ€ไธช Restart Point ไฟ่ฏไบŒๅˆ†ๆœ็ดข็š„ๆญฃ็กฎๆ€งใ€‚ๅฏนไบŽๆœ‰ๅบๅ†™ๅ…ฅ็š„ๅœบๆ™ฏ๏ผˆๅฆ‚ๆ—ถ้—ดๅบๅˆ—๏ผ‰๏ผŒๅ‰็ผ€ๅŽ‹็ผฉ็އๆž้ซ˜ใ€‚

6. ๅˆ†็‰‡ LRU ็ผ“ๅญ˜

16 ไธช็‹ฌ็ซ‹็š„็ผ“ๅญ˜ๅˆ†็‰‡๏ผŒๆฏไธชๅˆ†็‰‡ๆœ‰่‡ชๅทฑ็š„ไบ’ๆ–ฅ้”ใ€ๅ“ˆๅธŒ่กจๅ’Œ LRU ้“พ่กจใ€‚็›ธๆฏ”ๅ…จๅฑ€้”็š„็ผ“ๅญ˜๏ผŒๅˆ†็‰‡่ฎพ่ฎกๅคงๅน…ๅ‡ๅฐ‘ไบ†้”็ซžไบ‰๏ผŒๆๅ‡ไบ†ๅนถๅ‘่ฏปๆ€ง่ƒฝใ€‚

7. MVCC ๅฟซ็…ง้š”็ฆป

56 ไฝๅบๅˆ—ๅท + ๅŒๅ‘ๅพช็Žฏ้“พ่กจ็ฎก็†ๅฟซ็…งใ€‚ๆฏไธชๅฟซ็…งๆŒๆœ‰ๅˆ›ๅปบๆ—ถ็š„ๅบๅˆ—ๅท๏ผŒ่ฏปๅ–ๆ—ถๅช็œ‹ๅˆฐๅบๅˆ—ๅทๅฐไบŽ็ญ‰ไบŽๅฟซ็…งๅบๅˆ—ๅท็š„้”ฎ็‰ˆๆœฌใ€‚่ฟ™ไฟ่ฏไบ†ๅœจ Compaction ๅ’Œๅนถๅ‘่ฏปๅ†™ๅœบๆ™ฏไธ‹็š„ไธ€่‡ดๆ€ง่ฏปใ€‚

8. ่‡ช้€‚ๅบ”ๅŽ‹็ผฉ

SSTable ๆž„ๅปบๆ—ถๅฐ่ฏ• Snappy ๆˆ– Zstd ๅŽ‹็ผฉ๏ผŒๅฆ‚ๆžœๅŽ‹็ผฉๅŽๅคงๅฐ reduction < 12.5%๏ผŒๅˆ™ๅ›ž้€€ๅˆฐๆœชๅŽ‹็ผฉๆ ผๅผใ€‚่ฟ™้ฟๅ…ไบ†ๅœจไธๅฏๅŽ‹็ผฉๆ•ฐๆฎไธŠ็š„ CPU ๆตช่ดนใ€‚

9. WAL ๅˆ†็‰‡่ฎฐๅฝ•

ๅฝ“่ฎฐๅฝ•่ทจ่ถŠ 32KB ๅ—่พน็•Œๆ—ถ๏ผŒ่‡ชๅŠจๅˆ†็‰‡ไธบ First/Middle/Last ็ฑปๅž‹ใ€‚่ฏปๅ–็ซฏ่‡ชๅŠจ้‡็ป„๏ผŒ็กฎไฟๆ•ฐๆฎๅฎŒๆ•ดๆ€งๅŒๆ—ถ้ฟๅ…ไบ†ๅ—ๆตช่ดนใ€‚

10. MANIFEST ๅŽŸๅญๆ›ดๆ–ฐ

MANIFEST ๆ–‡ไปถๅ†™ๅ…ฅๅŽๅŒๆญฅ็ˆถ็›ฎๅฝ•๏ผˆfsync + fdatasync๏ผ‰๏ผŒ็กฎไฟๅ…ƒๆ•ฐๆฎๅ˜ๆ›ดๆŒไน…ๅŒ–ๅˆฐๅญ˜ๅ‚จ่ฎพๅค‡ใ€‚ๅณไฝฟๅ‘็”Ÿๅดฉๆบƒ๏ผŒไนŸ่ƒฝ้€š่ฟ‡ MANIFEST ๅ›žๆ”พๆขๅค็‰ˆๆœฌ็Šถๆ€ใ€‚

11. ๅผ‚ๆญฅๆ—ฅๅฟ—็ณป็ปŸ

็‹ฌ็ซ‹็š„ๆ—ฅๅฟ—็บฟ็จ‹็ผ“ๅ†ฒๅ†™ๅ…ฅ่ฏทๆฑ‚๏ผŒๆŒ‰ๆ–‡ไปถๅคงๅฐ่‡ชๅŠจ่ฝฎ่ฝฌใ€‚ไธป่ทฏๅพ„็š„ๆ—ฅๅฟ—ๅ†™ๅ…ฅไธไผš้˜ปๅกžๆ ธๅฟƒ่ฏปๅ†™้€ป่พ‘๏ผŒๆ—ฅๅฟ—็บงๅˆซไปŽ DEBUG ๅˆฐ ERROR ็ตๆดปๅฏๆŽงใ€‚

12. ๆ–‡ไปถๆ่ฟฐ็ฌฆ้™ๆต

้€š่ฟ‡ Limiter ๅŽŸๅญ่ฎกๆ•ฐๅ™จๆŽงๅˆถๆ‰“ๅผ€็š„ๆ–‡ไปถๆ่ฟฐ็ฌฆๆ•ฐ้‡ใ€‚ๅฝ“ SSTable ๆ–‡ไปถๆ•ฐ้‡ๅพˆๅคšๆ—ถ๏ผŒไธไผš่ถ…ๅ‡บ็ณป็ปŸ้™ๅˆถ๏ผŒไฟ้šœไบ†ๆ•ฐๆฎๅบ“็š„็จณๅฎšๆ€งใ€‚


่ฎธๅฏ่ฏ

ๆœฌ้กน็›ฎไธบๅญฆไน /็ ”็ฉถ็”จ้€”็š„ๅตŒๅ…ฅๅผ LSM-Tree ๅญ˜ๅ‚จๅผ•ๆ“Žๅฎž็Žฐใ€‚

About

a simple kv database

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages