Persistence¶
Quiver provides robust persistence capabilities to ensure your vector data and metadata are safely stored and quickly recoverable.
Overview¶
Persistence in Quiver includes:
- Automatic periodic saving
- Configurable persistence intervals
- Safe atomic writes
- Crash recovery
- Optional encryption
Configuration¶
Basic Persistence Settings¶
config := quiver.Config{
StoragePath: "/path/to/storage",
PersistInterval: 5 * time.Minute, // How often to persist
}
Advanced Configuration¶
config := quiver.Config{
StoragePath: "/path/to/storage",
PersistInterval: 5 * time.Minute,
EncryptionEnabled: true,
EncryptionKey: "your-32-byte-encryption-key",
}
How It Works¶
- Periodic Persistence
- Vector data and metadata are saved at configured intervals
- Changes are batched for efficiency
-
Atomic writes ensure data integrity
-
Storage Structure
- HNSW graph for vector indices
- DuckDB for metadata storage
-
Separate backup files
-
Background Processing
- Asynchronous persistence
- Non-blocking operations
- Configurable batch sizes
Data Safety Features¶
Atomic Writes¶
// Quiver uses atomic writes internally
if err := idx.persistToStorage(); err != nil {
// Original data remains intact if persistence fails
}
Encryption¶
Crash Recovery¶
// Quiver automatically recovers on startup
idx, err := quiver.Load(config, logger)
if err != nil {
// Handle recovery error
}
Best Practices¶
- Storage Configuration
- Use SSD for better performance
- Ensure sufficient disk space
-
Monitor disk usage
-
Persistence Settings
- Adjust interval based on update frequency
- Balance between safety and performance
-
Consider backup strategy
-
Monitoring
- Track persistence operations
- Monitor disk space
- Log persistence events
Performance Considerations¶
Batch Size¶
Persistence Interval¶
config := quiver.Config{
PersistInterval: 10 * time.Minute, // Longer intervals for better performance
}
Error Handling¶
idx, err := quiver.New(config, logger)
if err != nil {
switch {
case errors.Is(err, ErrStoragePathNotFound):
// Handle storage path issues
case errors.Is(err, ErrEncryptionKeyInvalid):
// Handle encryption key issues
default:
// Handle other errors
}
}
Monitoring and Metrics¶
// Get persistence metrics
metrics := idx.CollectMetrics()
fmt.Printf("Last persist ID: %d\n", metrics["last_persist_id"])
fmt.Printf("Persist interval: %.2f seconds\n", metrics["persist_interval"])
Recovery Scenarios¶
Manual Recovery¶
// Force immediate persistence
if err := idx.persistToStorage(); err != nil {
// Handle persistence error
}
Data Verification¶
Next Steps¶
- Learn about Backup & Restore
- Explore Security Features
- Understand Performance Tuning