ALM-2 / backend /docs /SQLITE_FALLBACK.md
ACA050's picture
Upload 520 files
2ed8996 verified
# SQLite Fallback Database
This document describes the SQLite fallback database implementation for the AegisLM SaaS Backend.
## Overview
The SQLite fallback database provides high availability by automatically switching to a local SQLite database when the primary PostgreSQL database becomes unavailable. This ensures the application remains functional even during PostgreSQL outages.
## Architecture
### Primary Database (PostgreSQL)
- **Production Database**: Neon PostgreSQL
- **Connection**: Async SQLAlchemy with connection pooling
- **Features**: Full feature support, high performance
### Fallback Database (SQLite)
- **Fallback Database**: Local SQLite file
- **Connection**: Async SQLite with aiosqlite driver
- **Features**: Basic functionality, local storage, automatic failover
## Configuration
Add these environment variables to your `.env` file:
```env
# SQLite Fallback Database Configuration
ENABLE_SQLITE_FALLBACK=true
SQLITE_DATABASE_PATH="aegislm_fallback.db"
SQLITE_FALLBACK_TIMEOUT=5
```
### Configuration Options
- `ENABLE_SQLITE_FALLBACK`: Enable/disable the fallback system
- `SQLITE_DATABASE_PATH`: Path to the SQLite database file
- `SQLITE_FALLBACK_TIMEOUT`: Timeout in seconds for fallback connections
## How It Works
### 1. Automatic Failover
- Application tries to connect to PostgreSQL first
- If PostgreSQL fails, automatically switches to SQLite
- Seamless switching without application downtime
### 2. Data Synchronization
- **Initial Setup**: Migrates data from PostgreSQL to SQLite
- **Ongoing Sync**: Can sync SQLite data back to PostgreSQL
- **Bidirectional**: Supports both migration directions
### 3. Health Monitoring
- Continuous health checks for both databases
- Automatic recovery when PostgreSQL becomes available
- Detailed status reporting
## API Endpoints
The system provides management endpoints for superusers:
### Status Monitoring
- `GET /api/v1/sqlite-fallback/status` - Get fallback system status
- `POST /api/v1/sqlite-fallback/test` - Test fallback mechanism
### Database Control
- `POST /api/v1/sqlite-fallback/switch-to-primary` - Force switch to PostgreSQL
- `POST /api/v1/sqlite-fallback/switch-to-fallback` - Force switch to SQLite
### Data Management
- `POST /api/v1/sqlite-fallback/migrate-from-primary` - Migrate PostgreSQL → SQLite
- `POST /api/v1/sqlite-fallback/sync-to-primary` - Sync SQLite → PostgreSQL
- `POST /api/v1/sqlite-fallback/backup` - Backup SQLite database
- `DELETE /api/v1/sqlite-fallback/cleanup` - Remove SQLite database
## Setup and Installation
### 1. Install Dependencies
```bash
pip install aiosqlite
```
### 2. Configure Environment
Add the SQLite fallback configuration to your `.env` file (see above).
### 3. Run Setup Script
```bash
cd backend
python setup_sqlite_fallback.py
```
### 4. Verify Installation
The setup script will:
- Initialize the SQLite fallback database
- Test the fallback mechanism
- Report system status
## Usage Examples
### Checking Fallback Status
```python
from core.fallback_database import check_database_health, get_current_database_type
is_healthy, db_type = await check_database_health()
print(f"Database healthy: {is_healthy}, Active: {db_type}")
```
### Manual Database Switching
```python
from core.fallback_database import switch_to_fallback, switch_to_primary
# Switch to SQLite fallback
success = await switch_to_fallback()
# Switch back to PostgreSQL
success = await switch_to_primary()
```
### Data Migration
```python
from core.sqlite_fallback_manager import SQLiteFallbackManager
manager = SQLiteFallbackManager()
# Migrate from PostgreSQL to SQLite
success = await manager.migrate_from_postgresql()
# Sync from SQLite back to PostgreSQL
success = await manager.sync_to_postgresql()
```
## Database Compatibility
### SQLite Compatibility Features
- **JSON Fields**: Automatically converted to/from text
- **DateTime Fields**: Proper timezone handling
- **Boolean Fields**: Standard SQLite boolean support
- **Foreign Keys**: Enabled with proper constraints
### Limitations
- Some PostgreSQL-specific features may not work in SQLite
- Performance is lower than PostgreSQL for large datasets
- Concurrent writes are limited by SQLite's file-based nature
## Monitoring and Logging
### Health Checks
The system provides comprehensive health monitoring:
- Primary database connectivity
- Fallback database connectivity
- Automatic failover status
- Data synchronization status
### Logging
All fallback operations are logged with appropriate levels:
- `INFO`: Normal operations, status changes
- `WARNING`: Failover events, connection issues
- `ERROR`: Critical failures, setup problems
## Best Practices
### 1. Regular Backups
- Create regular backups of the SQLite database
- Use the provided backup endpoint for automated backups
### 2. Monitor Performance
- Monitor fallback usage patterns
- Check database file size and performance
- Set up alerts for frequent fallback usage
### 3. Data Synchronization
- Regularly sync data back to PostgreSQL
- Verify data integrity after synchronization
- Test migration procedures periodically
### 4. Security Considerations
- Restrict fallback management endpoints to superusers
- Secure the SQLite database file permissions
- Monitor fallback system access logs
## Troubleshooting
### Common Issues
#### SQLite Database Not Found
- Check `SQLITE_DATABASE_PATH` configuration
- Verify directory permissions
- Run the setup script again
#### Migration Failures
- Ensure both databases are accessible
- Check for data type compatibility issues
- Review error logs for specific problems
#### Performance Issues
- Monitor SQLite database size
- Consider regular cleanup and optimization
- Check for long-running transactions
### Debug Mode
Enable debug logging for detailed troubleshooting:
```python
import logging
logging.getLogger('core.fallback_database').setLevel(logging.DEBUG)
logging.getLogger('core.sqlite_fallback_manager').setLevel(logging.DEBUG)
```
## Performance Considerations
### SQLite Optimizations
The system automatically applies SQLite optimizations:
- WAL journal mode for better concurrency
- Normal synchronous mode for balance
- Memory temp store for performance
- Optimized cache size
### Connection Pooling
- Primary database uses connection pooling
- SQLite uses static pooling for consistency
- Automatic connection cleanup on errors
## Security
### Access Control
- Fallback management requires superuser privileges
- Database file permissions are properly set
- API endpoints are protected with authentication
### Data Protection
- SQLite database file is stored securely
- Backup files include timestamps
- Sensitive data is not logged
## Testing
### Automated Tests
Run the comprehensive test suite:
```bash
cd backend
python -m core.sqlite_fallback_manager test
```
### Manual Testing
Use the provided test endpoints to verify:
- Connection failover
- Data migration
- API functionality
- Performance characteristics
## Future Enhancements
### Planned Features
- **Multi-database Support**: Support for additional database types
- **Advanced Sync**: Real-time synchronization capabilities
- **Performance Monitoring**: Built-in performance metrics
- **Automated Recovery**: Enhanced automatic recovery procedures
### Extensibility
The system is designed for easy extension:
- Plugin architecture for new database types
- Configurable failover strategies
- Custom synchronization rules
- Enhanced monitoring capabilities