đȘš RocksDB â Architecture, Tuning, OpĂ©rations
LSM-tree, WAL, memtables, SSTables, compaction, column families, Bloom/prefix, backup/checkpoint, perf & troubleshooting.
Vue dâensemble
Keyâvalue store embarquĂ©, LSMâtree.
LSMEmbeddedArchitecture
WAL, memtable, SST, compactions.
WALSSTInstallation
Linux/Windows, CMake, Java, Python.
C++PythonColumn Families
Isolation logique, options dédiées.
CFTTLOptions clés
Block cache, write buffers, filters.
CacheBloomCompaction
Leveled, Universal, RateLimiter.
L0âL1RatePerformance
Read/Write amp, prefix, IO.
AmpIOMonitoring
Statistics, perf_context, logs.
StatsPerfBackup & Restore
Checkpoints, backup engine.
SnapshotS3Troubleshooting
Stalls, L0 flush, corruption.
StallL0Cas dâusage
State store, cache, queues.
StreamsEdgeRéférences
Docs, tuning, wiki.
DocsObjectif & Positionnement
RocksDB est un moteur clĂ©âvaleur embarquĂ© basĂ© sur une structure LSMâTree, optimisĂ© pour SSD/NVMe, utilisĂ© dans Kafka Streams, Flink StateBackend, MySQL/MyRocks, TiKV et de nombreux systĂšmes distribuĂ©s. Il ne fournit ni SQL, ni rĂ©seau : câest une brique bas niveau performante Ă intĂ©grer comme stockage local.
Caractéristiques clés
- Writeâahead log (WAL) + memtables -> flush -> fichiers SST.
- Compaction multiâniveaux pour maintenir lâordre des clĂ©s.
- Block cache unifiĂ© (LRU/GDSF) pour rĂ©duire lâI/O disque.
- Prefix filters + Bloom pour accélérer les recherches.
- Column Families pour séparer les workloads et les stratégies de compaction.
- Compression ZSTD / LZ4 / Snappy â compromis place/perf.
Forces
- Ăcritures sĂ©quentielles trĂšs rapides, idĂ©al ingestion/streaming.
- Adapté aux workloads append-heavy et clé ordonnée.
- Permet des optimisations trĂšs fines via Options.
Faiblesses
- Complexité : tuning indispensable.
- Write/Read Amplification â gestion compactions critique.
- Pas de queries complexes, pas dâindex secondaires avancĂ©s.
| CritĂšre | LSM (RocksDB) | BâTree |
|---|---|---|
| Writes | Append (WAL) + memtable â flush | Random pages |
| Reads | Filtres + block cache | Index/arbre |
| Compaction | Oui (amp. write/read) | Non |
Put â WAL append â Memtable insert â Flush â SST L0 â Compaction L0âL1â⊠Get â Memtable â Block cache â Bloom â SST read
- Quand vous voulez un **KV embarqué** trÚs rapide, sans réseau : moteurs analytics, caches locaux, state store (Flink/Samza).
- Ăviter si besoin **SQL** riche, ou **requĂȘtes distribuĂ©es**.
- WAL (writeâahead log) sĂ©quentiel + memtable (skiplist/hash) ; flush quand plein â SST L0.
- Paralléliser avec plusieurs memtables (write_buffer_number) et subcompactions.
- SSTable = blocks + index + filter (Bloom/prefix) + footer. Taille block typique 4â16Â KB.
- Block cache unifié (LRU) pour data + index + filter.
| Style | Usage | Effet |
|---|---|---|
| Leveled | par dĂ©faut | Faible readâamp, writeâamp modĂ©rĂ©e |
| Universal | Grandes valeurs/TTL | Moins dâoverwrites, merges sĂ©lectifs |
| FIFO | Log/time series | Eviction par Ăąge |
Memtable â[flush]â L0.sst âââș Compaction L0âL1 (tri/merge) L1..Ln plus grands, non chevauchants (leveling)
sudo apt-get update && sudo apt-get install -y build-essential cmake libsnappy-dev zlib1g-dev libbz2-dev libzstd-dev liblz4-dev git clone https://github.com/facebook/rocksdb && cd rocksdb cmake -S . -B build -DPORTABLE=1 -DWITH_ZSTD=1 -DWITH_BZ2=1 -DWITH_LZ4=1 cmake --build build -j sudo cmake --install build
pip install python-rocksdb
# Exemple Python
import rocksdb
opts=rocksdb.Options()
opts.create_if_missing=True
opts.write_buffer_size=64*1024*1024
opts.target_file_size_base=64*1024*1024
opts.max_background_compactions=4
opts.table_factory=rocksdb.BlockBasedTableFactory(
block_cache=rocksdb.LRUCache(512*1024*1024),
filter_policy=rocksdb.BloomFilterPolicy(10)
)
db=rocksdb.DB('data.db', opts)
db.put(b'k1', b'v1')
print(db.get(b'k1'))
# Java (Maven)org.rocksdb rocksdbjni 9.0.0
# Dockerfile simple FROM python:3.12-slim RUN apt-get update && apt-get install -y libsnappy1v5 libzstd1 liblz4-1 && pip install python-rocksdb WORKDIR /app COPY app.py . CMD ["python","app.py"]
- Chaque Column Family a ses propres options/compactions.
- Isoler par domaine :
cf_users,cf_orders, etc.
opts=rocksdb.Options(create_if_missing=True)
cf_names=[b'default', b'cf_users', b'cf_orders']
# Créer CF
rocksdb.DB.create_column_family('data.db', opts, b'cf_users')
# Ouvrir avec CFs
cf_opts=[(b'default', opts),(b'cf_users', opts),(b'cf_orders', opts)]
db=rocksdb.DB('data.db', opts, column_families=cf_opts)
wo=rocksdb.WriteOptions(); ro=rocksdb.ReadOptions()
db.put((b'cf_users', b'u:1'), b'Alice')
- TTL DBÂ : expiration automatique (sur compactions).
- Options par CFÂ : block_cache, prefix_extractor, compression.
cache=rocksdb.LRUCache(1*1024*1024*1024) # 1GB factory=rocksdb.BlockBasedTableFactory(block_cache=cache, cache_index_and_filter_blocks=True) opts.table_factory=factory
Dimensionner ~Â 50â70% de la RAM disponible (selon workload).
opts.write_buffer_size=128*1024*1024 # memtable opts.max_write_buffer_number=3 opts.min_write_buffer_number_to_merge=1
opts.prefix_extractor=rocksdb.FixedPrefixTransform(8) opts.memtable_prefix_bloom_size_ratio=0.1 factory=rocksdb.BlockBasedTableFactory(filter_policy=rocksdb.BloomFilterPolicy(10))
RequĂȘtes par prĂ©fixe (scans/sauts rapides), rĂ©duit readâamp.
opts.compression=rocksdb.CompressionType.zstd_compression opts.bottommost_compression=rocksdb.CompressionType.zstd_compression
- Levelâbased : L0 chevauchants â tri en L1..Ln, faible readâamp.
- Universal : merge basé sur taille/age, utile pour gros blobs/TTL.
- FIFOÂ : purge par Ăąge/bytes, pour logs.
opts.rate_limiter=rocksdb.RateLimiter(100*1024*1024) # 100MB/s compaction/flush
opts.enable_pipelined_write=True opts.max_background_compactions=8 opts.max_background_flushes=2
Principes
- Writeâamp : rĂ©glĂ© par taille memtable/compaction.
- Readâamp : caches, bloom, prefix, index perf.
- Spaceâamp : compression, leveled.
Recettes rapides
# OLTP keyâvalue write_buffer_size=64â256MB, LRU 1â4GB, bloom=10 # Timeâseries universal compaction, TTL, bottommost zstd
opts.statistics=rocksdb.Statistics() print(opts.statistics)
Activer perf_context pour décomposer un GET (block cache hit, table open, etc.).
Analyser le fichier LOG pour compactions/flush, stalles, erreurs.
import rocksdb, os
cp=rocksdb.Checkpoint.create(db)
os.makedirs('snap', exist_ok=True)
cp.create_checkpoint('snap')
# C++/Java: BackupEngine vers répertoire/S3 (monté)
# Restaurer: fermer DB, remplacer répertoire par snapshot, rouvrir
- Augmenter max_background_compactions, rate_limiter.
- Ălargir write_buffer_size, rĂ©duire flushs frĂ©quents.
- Limiter chevauchements : niveau L0 â L1 plus agressif.
- Vérifier taille de SST/compaction triggers.
- Vérifier disque/FS, corriger avec backup/restore.
State store streaming
- Flink, Spark, Samza : opĂ©rateurs dâĂ©tat locaux.
Cache/Edge
- KV rapide pour dédup/idempotence, files locales.
- RocksDB Wiki & Docs : options, formats, tuning.
- Facebook RocksDB GitHub : issues, examples.
- Tuning guides (block cache, compaction, bloom/prefix).
Recettes
# KV OLTP write_buffer_size=128MB LRU cache 1â2GB Bloom bits=10 compression=zstd # Timeâseries universal compaction TTL
C++ init (idée)
rocksdb::Options o; o.create_if_missing=true; o.write_buffer_size = 128<<20; // 128MB rocksdb::BlockBasedTableOptions t; t.block_cache = rocksdb::NewLRUCache(1<<30); o.table_factory.reset(NewBlockBasedTableFactory(t)); rocksdb::DB* db; rocksdb::Status s = rocksdb::DB::Open(o, "data", &db);
