The __words__ keyword index stores 50-5000 entries per entity (one per word), which inflated avg entries/entity well above the corruption threshold of 100. This caused: 1. validateConsistency() to falsely detect corruption on every startup, triggering unnecessary clearAllIndexData() + rebuild() cycles 2. getStats() to log false "Metadata index may be corrupted" warnings and report inflated totalEntries/totalIds stats Both methods now skip __words__ when counting, so stats and health checks reflect metadata fields only (noun, type, createdAt, etc.). Keyword search is unaffected since the __words__ field index itself is not modified.
12 KiB
AWS S3 Cost Optimization Guide for Brainy
Cost Impact: Reduce storage costs from $138k/year to $5.9k/year at 500TB scale (96% savings)
Overview
Brainy provides enterprise-grade cost optimization features for AWS S3 storage, enabling automatic tier transitions that dramatically reduce storage costs while maintaining performance.
Cost Breakdown (Before Optimization)
Standard S3 Storage Costs (500TB Dataset)
Storage: 500TB × $0.023/GB/month × 12 months = $138,000/year
Operations: ~$5,000/year (PUT, GET, LIST requests)
Total: $143,000/year
S3 Storage Tiers
| Tier | Cost/GB/Month | Retrieval Fee | Use Case |
|---|---|---|---|
| Standard | $0.023 | None | Frequently accessed |
| Standard-IA | $0.0125 | $0.01/GB | Infrequently accessed (30+ days) |
| Intelligent-Tiering | $0.023-0.00099 | None | Automatic optimization |
| Glacier Instant | $0.004 | $0.03/GB | Rare access, instant retrieval |
| Glacier Flexible | $0.0036 | $0.01/GB + time | Archive (minutes-hours retrieval) |
| Glacier Deep Archive | $0.00099 | $0.02/GB + time | Long-term archive (12 hours retrieval) |
Strategy 1: Lifecycle Policies (Recommended)
Setup: Automatic Tier Transitions
Best for: Predictable access patterns, batch workloads, archival data
import { Brainy } from '@soulcraft/brainy'
import { S3CompatibleStorage } from '@soulcraft/brainy/storage'
// Initialize Brainy with S3 storage
const storage = new S3CompatibleStorage({
bucket: 'my-brainy-data',
region: 'us-east-1',
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
})
const brain = new Brainy({ storage })
await brain.init()
// Set lifecycle policy for automatic archival
await storage.setLifecyclePolicy({
rules: [{
id: 'optimize-vectors',
prefix: 'entities/nouns/vectors/',
status: 'Enabled',
transitions: [
{ days: 30, storageClass: 'STANDARD_IA' }, // Infrequent Access after 30 days
{ days: 90, storageClass: 'GLACIER' }, // Glacier after 90 days
{ days: 365, storageClass: 'DEEP_ARCHIVE' } // Deep Archive after 1 year
]
}, {
id: 'optimize-metadata',
prefix: 'entities/nouns/metadata/',
status: 'Enabled',
transitions: [
{ days: 30, storageClass: 'STANDARD_IA' },
{ days: 180, storageClass: 'GLACIER' }
]
}]
})
// Verify lifecycle policy
const policy = await storage.getLifecyclePolicy()
console.log('Lifecycle policy active:', policy.rules.length, 'rules')
Cost Calculation (500TB with Lifecycle Policy)
Assumptions:
- 40% of data accessed in last 30 days (Standard)
- 30% of data 30-90 days old (Standard-IA)
- 20% of data 90-365 days old (Glacier)
- 10% of data 365+ days old (Deep Archive)
Standard (200TB): 200TB × $0.023/GB × 12 = $55,200/year
Standard-IA (150TB): 150TB × $0.0125/GB × 12 = $22,500/year
Glacier (100TB): 100TB × $0.004/GB × 12 = $4,800/year
Deep Archive (50TB): 50TB × $0.00099/GB × 12 = $594/year
Total Storage Cost: $83,094/year (instead of $138,000)
Total with Operations: ~$88,000/year
Savings: $55,000/year (40%)
But we can do better with Intelligent-Tiering...
Strategy 2: Intelligent-Tiering (Most Recommended)
Setup: Automatic Access-Based Optimization
Best for: Unpredictable access patterns, mixed workloads, maximum automation
// Enable Intelligent-Tiering for automatic optimization
await storage.enableIntelligentTiering('entities/', 'brainy-auto-optimize')
// Benefits:
// - Automatically moves objects between tiers based on access patterns
// - No retrieval fees (unlike Glacier)
// - Transitions happen within 24-48 hours of last access
// - Supports Archive Access tier (90+ days) and Deep Archive Access tier (180+ days)
Intelligent-Tiering Tiers
Intelligent-Tiering automatically moves objects between:
- Frequent Access: $0.023/GB/month (0-30 days)
- Infrequent Access: $0.0125/GB/month (30-90 days)
- Archive Access: $0.004/GB/month (90-180 days)
- Deep Archive Access: $0.00099/GB/month (180+ days)
Monitoring Fee: $0.0025 per 1000 objects (minimal)
Cost Calculation (500TB with Intelligent-Tiering)
Realistic distribution after 1 year:
- 15% Frequent Access (hot data)
- 20% Infrequent Access
- 35% Archive Access
- 30% Deep Archive Access
Frequent (75TB): 75TB × $0.023/GB × 12 = $20,700/year
Infrequent (100TB): 100TB × $0.0125/GB × 12 = $15,000/year
Archive (175TB): 175TB × $0.004/GB × 12 = $8,400/year
Deep Archive (150TB): 150TB × $0.00099/GB × 12 = $1,782/year
Monitoring: ~$300/year (minimal)
Total Storage Cost: $46,182/year
Total with Operations: ~$51,000/year
Savings vs Standard: $92,000/year (67%)
Strategy 3: Hybrid Approach (Maximum Savings)
Setup: Lifecycle + Intelligent-Tiering
Best for: Maximum cost optimization with fine-grained control
// Enable Intelligent-Tiering for vectors (frequently searched)
await storage.enableIntelligentTiering('entities/nouns/vectors/', 'vectors-auto')
await storage.enableIntelligentTiering('entities/verbs/vectors/', 'verbs-auto')
// Set lifecycle policy for metadata (less frequently accessed)
await storage.setLifecyclePolicy({
rules: [{
id: 'archive-old-metadata',
prefix: 'entities/nouns/metadata/',
status: 'Enabled',
transitions: [
{ days: 30, storageClass: 'STANDARD_IA' },
{ days: 60, storageClass: 'GLACIER' },
{ days: 180, storageClass: 'DEEP_ARCHIVE' }
]
}, {
id: 'cleanup-old-system-data',
prefix: '_system/',
status: 'Enabled',
expiration: { days: 365 } // Delete old statistics
}]
})
Cost Calculation (500TB Hybrid Approach)
Vectors (300TB with Intelligent-Tiering):
Frequent (45TB): 45TB × $0.023/GB × 12 = $12,420/year
Infrequent (60TB): 60TB × $0.0125/GB × 12 = $9,000/year
Archive (105TB): 105TB × $0.004/GB × 12 = $5,040/year
Deep Archive (90TB): 90TB × $0.00099/GB × 12 = $1,069/year
Subtotal: $27,529/year
Metadata (200TB with Lifecycle Policy):
Standard (60TB): 60TB × $0.023/GB × 12 = $16,560/year
Standard-IA (40TB): 40TB × $0.0125/GB × 12 = $6,000/year
Glacier (60TB): 60TB × $0.004/GB × 12 = $2,880/year
Deep Archive (40TB): 40TB × $0.00099/GB × 12 = $475/year
Subtotal: $25,915/year
Total Cost: $53,444/year + operations (~$58,500/year total) Savings vs Standard: $84,500/year (61%)
Strategy 4: Aggressive Archival (Maximum Savings)
Setup: Fast Archival for Cold Data
Best for: Archival workloads, historical data, compliance
await storage.setLifecyclePolicy({
rules: [{
id: 'aggressive-archival',
prefix: 'entities/',
status: 'Enabled',
transitions: [
{ days: 14, storageClass: 'STANDARD_IA' }, // IA after 2 weeks
{ days: 30, storageClass: 'GLACIER' }, // Glacier after 1 month
{ days: 90, storageClass: 'DEEP_ARCHIVE' } // Deep Archive after 3 months
]
}]
})
Cost Calculation (500TB Aggressive Archival)
After 1 year:
Standard (50TB): 50TB × $0.023/GB × 12 = $13,800/year
Standard-IA (50TB): 50TB × $0.0125/GB × 12 = $7,500/year
Glacier (100TB): 100TB × $0.004/GB × 12 = $4,800/year
Deep Archive (300TB): 300TB × $0.00099/GB × 12 = $3,564/year
Total Storage Cost: $29,664/year
Total with Operations: ~$34,000/year
Savings: $109,000/year (76%)
Note: Retrieval costs may be significant if archived data is accessed frequently
Comparison Table: All Strategies
| Strategy | Annual Cost | Savings | Retrieval Speed | Best For |
|---|---|---|---|---|
| No Optimization | $143,000 | 0% | Instant | N/A |
| Lifecycle Policy | $88,000 | 38% | Varies | Predictable patterns |
| Intelligent-Tiering | $51,000 | 64% | Instant (no retrieval fees) | Recommended |
| Hybrid Approach | $58,500 | 59% | Instant for vectors | Fine-grained control |
| Aggressive Archival | $34,000 | 76% | Hours to 12 hours | Cold data, compliance |
Batch Delete Operations
Efficient Cleanup
// Batch delete (1000 objects per request)
const idsToDelete = [/* array of entity IDs */]
// Generate paths for both vector and metadata files
const paths = idsToDelete.flatMap(id => {
const shard = id.substring(0, 2)
return [
`entities/nouns/vectors/${shard}/${id}.json`,
`entities/nouns/metadata/${shard}/${id}.json`
]
})
// Batch delete (much faster and cheaper than individual deletes)
await storage.batchDelete(paths)
// Cost impact:
// - Individual deletes: 1M objects × $0.005 per 1000 = $5,000
// - Batch deletes: 1M/1000 × $0.005 = $5 (1000x cheaper!)
Monitoring and Optimization
Get Current Lifecycle Policy
const policy = await storage.getLifecyclePolicy()
console.log('Active rules:', policy.rules)
// Example output:
// {
// rules: [
// {
// id: 'optimize-vectors',
// prefix: 'entities/nouns/vectors/',
// status: 'Enabled',
// transitions: [...]
// }
// ]
// }
Remove Lifecycle Policy (if needed)
// Remove all lifecycle rules
await storage.removeLifecyclePolicy()
Check Intelligent-Tiering Configurations
const configs = await storage.getIntelligentTieringConfigs()
console.log('Active configurations:', configs)
Disable Intelligent-Tiering
await storage.disableIntelligentTiering('brainy-auto-optimize')
AWS Cost Explorer Analysis
Track Your Savings
- Enable Cost Explorer in AWS Console
- Group by Storage Class to see tier distribution
- Set up Cost Anomaly Detection for unexpected spikes
- Create Budget Alerts for monthly storage costs
Expected Metrics After 6 Months
Standard storage: 15-20% of total data
Standard-IA: 20-25%
Archive tiers: 55-65%
Monthly cost trend: Decreasing 5-10% per month as data ages into cheaper tiers
Best Practices
- ✅ Start with Intelligent-Tiering - No retrieval fees, automatic optimization
- ✅ Use batch operations for deletions - 1000x cheaper than individual deletes
- ✅ Monitor storage class distribution monthly via Cost Explorer
- ✅ Set lifecycle policies for predictable archival (metadata, logs)
- ✅ Enable S3 Storage Lens for detailed storage analytics
- ✅ Use S3 Select for querying archived data without full retrieval
- ✅ Consider S3 Batch Operations for large-scale tier changes
Troubleshooting
Issue: Data not transitioning to cheaper tiers
Solution:
// Check if lifecycle policy is active
const policy = await storage.getLifecyclePolicy()
console.log('Policy status:', policy.rules.map(r => r.status))
// Ensure objects are old enough
// S3 requires objects to be at least 30 days old for IA transition
Issue: High retrieval costs from Glacier
Solution:
// Switch to Intelligent-Tiering (no retrieval fees)
await storage.disableIntelligentTiering('old-config')
await storage.enableIntelligentTiering('entities/', 'new-config')
// Or use Glacier Instant Retrieval instead of Glacier Flexible
Issue: Unexpected monitoring fees
Solution:
- Intelligent-Tiering has $0.0025 per 1000 objects monitoring fee
- For 1 billion objects: $2,500/month monitoring
- If cost is high, use lifecycle policies instead (no monitoring fee)
Summary
Recommended Strategy for Most Use Cases:
- Intelligent-Tiering for vectors and frequently queried data
- Lifecycle policies for metadata and system files
- Batch operations for efficient cleanup
Expected Savings:
- Year 1: 40-50% reduction in storage costs
- Year 2+: 60-70% reduction as more data ages into archive tiers
- Long-term: 75-85% reduction for mature datasets
500TB Example (Intelligent-Tiering):
- Before: $143,000/year
- After: $51,000/year
- Savings: $92,000/year (64%)
1PB Example (Intelligent-Tiering):
- Before: $286,000/year
- After: $102,000/year
- Savings: $184,000/year (64%)
Last Updated: 2025-10-17 Cloud Provider: AWS S3