Session Persistence with Redis
Session Persistence with Redis
Section titled “Session Persistence with Redis”This document describes the Redis-backed session persistence implementation for the puppeteer-mcp project, including configuration, usage, and operational considerations.
Overview
Section titled “Overview”The session persistence system provides:
- Redis-backed session storage with automatic failover to in-memory store
- Session migration utilities for moving between different stores
- Replication and synchronization features for high availability
- Comprehensive monitoring and health checks
- Graceful fallback mechanisms when Redis is unavailable
- NIST compliance with proper audit logging and security controls
Architecture
Section titled “Architecture”┌─────────────────────────────────────────────────────────────────┐│ Session Store Factory │├─────────────────────────────────────────────────────────────────┤│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ││ │ Redis Session │ │ In-Memory Store │ │ Migration │ ││ │ Store │ │ (Fallback) │ │ Utilities │ ││ └─────────────────┘ └─────────────────┘ └─────────────────┘ │├─────────────────────────────────────────────────────────────────┤│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ││ │ Monitoring │ │ Replication │ │ Health Checks │ ││ │ System │ │ Manager │ │ System │ ││ └─────────────────┘ └─────────────────┘ └─────────────────┘ │└─────────────────────────────────────────────────────────────────┘
Configuration
Section titled “Configuration”Environment Variables
Section titled “Environment Variables”# Redis ConnectionREDIS_URL=redis://localhost:6379REDIS_TLS=trueREDIS_KEY_PREFIX=mcp:REDIS_SESSION_TTL=86400 # 24 hours in secondsREDIS_FALLBACK_ENABLED=true
# Redis ReliabilityREDIS_MAX_RETRIES=3REDIS_RETRY_DELAY=1000REDIS_HEALTH_CHECK_INTERVAL=30000
# Session Store ConfigurationSESSION_STORE_TYPE=auto # auto, redis, memorySESSION_STORE_MONITORING_ENABLED=trueSESSION_STORE_REPLICATION_ENABLED=falseSESSION_STORE_MIGRATION_ENABLED=false
Session Store Types
Section titled “Session Store Types”auto
: Automatically selects Redis if available, otherwise falls back to in-memoryredis
: Forces Redis usage (falls back to in-memory if Redis unavailable)memory
: Forces in-memory store usage
Basic Usage
Section titled “Basic Usage”import { sessionStoreFactory } from './src/store/session-store-factory.js';
// Create a session store instanceconst storeResult = await sessionStoreFactory.create('my-app', { preferredStore: 'auto', enableMonitoring: true, enableReplication: false, enableMigration: true,});
// Use the storeconst sessionId = await storeResult.store.create({ userId: 'user123', username: 'john_doe', roles: ['user'], createdAt: new Date().toISOString(), expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),});
// Retrieve sessionconst session = await storeResult.store.get(sessionId);
Advanced Configuration
Section titled “Advanced Configuration”// Create with custom configurationconst storeResult = await sessionStoreFactory.create('advanced-app', { preferredStore: 'redis', enableMonitoring: true, enableReplication: true, enableMigration: true, monitoringConfig: { healthCheckInterval: 15000, alertThresholds: { maxLatency: 500, maxErrorRate: 0.01, }, }, replicationConfig: { mode: 'master-slave', syncInterval: 60000, conflictResolution: 'last-write-wins', },});
Features
Section titled “Features”1. Redis Session Store
Section titled “1. Redis Session Store”Provides persistent session storage with:
- TTL-based expiration: Sessions automatically expire based on configuration
- Atomic operations: Uses Redis pipelines for consistency
- User session indexing: Efficient retrieval of all sessions for a user
- Graceful fallback: Automatic failover to in-memory store
// Direct store usageimport { RedisSessionStore } from './src/store/redis-session-store.js';
const store = new RedisSessionStore();await store.create(sessionData);
2. Session Migration
Section titled “2. Session Migration”Migrate sessions between different stores:
import { SessionMigration } from './src/store/session-migration.js';
const migration = new SessionMigration();
// Migrate from in-memory to Redisawait migration.migrate(inMemoryStore, redisStore, { skipExisting: true, deleteAfterMigration: false, batchSize: 100,});
// Create backupconst backup = await migration.backup(store);
// Restore from backupawait migration.restore(targetStore, backup);
3. Replication and Synchronization
Section titled “3. Replication and Synchronization”High availability through replication:
import { SessionReplicationManager } from './src/store/session-replication.js';
const replication = new SessionReplicationManager(primaryStore, { mode: 'master-slave', syncInterval: 30000, conflictResolution: 'last-write-wins',});
// Add replicaawait replication.addReplica('replica1', replicaStore);
// Start replicationawait replication.start();
4. Monitoring and Health Checks
Section titled “4. Monitoring and Health Checks”Comprehensive monitoring system:
import { SessionStoreMonitor } from './src/store/session-monitoring.js';
const monitor = new SessionStoreMonitor(store, { healthCheckInterval: 30000, alertThresholds: { maxLatency: 1000, maxErrorRate: 0.05, },});
// Start monitoringawait monitor.start();
// Get health statusconst health = await monitor.performHealthCheck();
5. Session Store Factory
Section titled “5. Session Store Factory”Centralized store management:
// Create multiple storesawait sessionStoreFactory.create('web-app', { preferredStore: 'redis' });await sessionStoreFactory.create('api-app', { preferredStore: 'memory' });
// List all storesconst stores = sessionStoreFactory.list();
// Get health statusconst health = await sessionStoreFactory.getHealthStatus();
// Switch store typeawait sessionStoreFactory.switchStoreType('web-app', 'memory', { migrateData: true,});
Redis Configuration
Section titled “Redis Configuration”Connection Options
Section titled “Connection Options”// Redis connection via URLREDIS_URL=redis://username:password@localhost:6379/0
// Redis with TLSREDIS_URL=rediss://username:password@localhost:6380/0REDIS_TLS=true
// Redis ClusterREDIS_URL=redis://node1:6379,node2:6379,node3:6379
Performance Tuning
Section titled “Performance Tuning”# Redis configuration for session storagemaxmemory 2gbmaxmemory-policy allkeys-lrusave 900 1save 300 10save 60 10000
Monitoring and Observability
Section titled “Monitoring and Observability”Health Checks
Section titled “Health Checks”The system provides multiple health check endpoints:
// Store-level health checkconst health = await store.healthCheck();// Returns: { redis: { available, latency, error }, fallback: { available } }
// Factory-level health checkconst factoryHealth = await sessionStoreFactory.getHealthStatus();// Returns: { overall: 'healthy|degraded|unhealthy', instances: [...] }
Metrics
Section titled “Metrics”Available metrics include:
- Operation metrics: Count, latency, error rates for CRUD operations
- Store metrics: Total sessions, active sessions, expired sessions
- Redis metrics: Latency, memory usage, key count, connections
- Fallback metrics: Activation count, fallback duration
Prometheus Integration
Section titled “Prometheus Integration”// Export Prometheus metricsconst monitor = new SessionStoreMonitor(store);const metrics = monitor.exportMetrics();console.log(metrics.prometheus);
Security and Compliance
Section titled “Security and Compliance”NIST Controls
Section titled “NIST Controls”The implementation includes NIST compliance features:
- AU-2/AU-3: Comprehensive audit logging for all session operations
- AC-12: Automatic session termination and cleanup
- SC-8: Encrypted transmission (TLS support)
- SC-28: Protection of data at rest (Redis encryption)
Security Features
Section titled “Security Features”- Input validation: Zod schema validation for all session data
- Audit logging: Detailed logs for all session operations
- Access controls: Role-based session data access
- Data encryption: Support for TLS/SSL connections
Operational Procedures
Section titled “Operational Procedures”Deployment
Section titled “Deployment”- Configure Redis: Set up Redis instance with appropriate configuration
- Set environment variables: Configure connection and behavior settings
- Initialize stores: Create session store instances via factory
- Enable monitoring: Start health checks and monitoring systems
Backup and Recovery
Section titled “Backup and Recovery”// Create backupconst backup = await sessionStoreFactory.createBackup('my-app');
// Store backup dataawait fs.writeFile('session-backup.json', JSON.stringify(backup));
// Restore from backupconst backupData = JSON.parse(await fs.readFile('session-backup.json'));await sessionStoreFactory.restoreBackup('my-app', backupData);
Scaling and High Availability
Section titled “Scaling and High Availability”- Redis Clustering: Use Redis Cluster for horizontal scaling
- Replication: Enable session replication for redundancy
- Load Balancing: Distribute session stores across multiple instances
- Monitoring: Implement comprehensive monitoring and alerting
Troubleshooting
Section titled “Troubleshooting”Common Issues
Section titled “Common Issues”-
Redis Connection Failures
- Check Redis service status
- Verify connection string and credentials
- Review network connectivity and firewall rules
-
High Latency
- Monitor Redis performance metrics
- Check network latency
- Review Redis configuration and memory usage
-
Memory Issues
- Monitor Redis memory usage
- Adjust TTL settings
- Implement proper cleanup procedures
Debugging
Section titled “Debugging”// Enable debug loggingconst logger = pino({ level: 'debug' });const store = new RedisSessionStore(logger);
// Check Redis healthconst health = await checkRedisHealth();console.log('Redis health:', health);
// Monitor operationsconst monitor = new SessionStoreMonitor(store);monitor.on('alert', (alert) => { console.log('Alert:', alert);});
Testing
Section titled “Testing”Unit Tests
Section titled “Unit Tests”# Run session store testsnpm test -- --testPathPattern=tests/unit/store
# Run specific test suitesnpm test -- tests/unit/store/redis-session-store.test.tsnpm test -- tests/unit/store/session-migration.test.tsnpm test -- tests/unit/store/session-store-factory.test.ts
Integration Tests
Section titled “Integration Tests”# Run with Redis instancenpm run test:integration -- --testPathPattern=sessions
# End-to-end testsnpm run test:e2e -- --testPathPattern=session-persistence
Best Practices
Section titled “Best Practices”Migration Guide
Section titled “Migration Guide”From In-Memory to Redis
Section titled “From In-Memory to Redis”- Configure Redis: Set up Redis instance and connection
- Update configuration: Set
SESSION_STORE_TYPE=redis
- Enable migration: Set
SESSION_STORE_MIGRATION_ENABLED=true
- Migrate data: Use migration utilities to transfer existing sessions
- Verify operation: Confirm Redis store is working correctly
Between Redis Instances
Section titled “Between Redis Instances”- Set up new Redis instance: Configure target Redis
- Create temporary store: Create new store instance for target
- Migrate sessions: Use migration utilities to transfer data
- Update configuration: Switch to new Redis instance
- Clean up: Remove old Redis instance and temporary store
API Reference
Section titled “API Reference”SessionStore Interface
Section titled “SessionStore Interface”interface SessionStore { create(data: SessionData): Promise<string>; get(id: string): Promise<Session | null>; update(id: string, data: Partial<SessionData>): Promise<Session | null>; delete(id: string): Promise<boolean>; deleteExpired(): Promise<number>; getByUserId(userId: string): Promise<Session[]>; exists(id: string): Promise<boolean>; touch(id: string): Promise<boolean>;}
SessionStoreFactory Methods
Section titled “SessionStoreFactory Methods”class SessionStoreFactory { create( instanceId?: string, config?: SessionStoreFactoryConfig, ): Promise<SessionStoreFactoryResult>; get(instanceId?: string): SessionStoreFactoryResult | undefined; list(): Array<{ instanceId: string; result: SessionStoreFactoryResult }>; destroy(instanceId: string): Promise<void>; destroyAll(): Promise<void>; migrate( fromInstanceId: string, toInstanceId: string, options?: MigrationOptions, ): Promise<MigrationStats>; getHealthStatus(): Promise<HealthStatusResult>; switchStoreType( instanceId: string, newType: 'memory' | 'redis', options?: SwitchOptions, ): Promise<void>; createBackup(instanceId: string): Promise<BackupResult>; restoreBackup( instanceId: string, backup: BackupData, options?: RestoreOptions, ): Promise<RestoreStats>;}
Related Documentation
Section titled “Related Documentation”- Architecture Overview for system design context
- Security Testing for session security validation
- Operations Guide for monitoring and maintenance
- Browser Pool Optimization for performance optimization
Support
Section titled “Support”For issues, questions, or contributions:
- GitHub Issues: Report bugs and request features
- Documentation: Refer to inline code documentation
- Tests: Review test cases for usage examples
- Community: Engage with the community for support
Conclusion
Section titled “Conclusion”The session persistence system provides enterprise-grade reliability and performance for browser automation workloads. By leveraging Redis for persistent storage with intelligent fallback mechanisms, comprehensive monitoring, and migration utilities, the system ensures session data integrity and high availability in production environments.