Skip to content

Commit b132c33

Browse files
committed
Add Valkey distributed cache for horizontal scaling
Implement distributed caching using Valkey (Redis-compatible) to enable horizontal scaling of Trino Gateway across multiple instances. This allows query metadata to be shared between gateway instances, ensuring consistent routing regardless of which instance receives a request. Key features: - 3-tier caching architecture: L1 (Guava local) → L2 (Valkey distributed) → L3 (PostgreSQL) - Graceful degradation when Valkey unavailable (falls back to database) - Configurable health checks and connection pooling - Cache metrics (hits, misses, writes, errors, hit rate) - Write-through caching for backend and routing group lookups - Lazy-loading for external URL lookups - Convention over Configuration with sensible defaults Implementation: - Add ValkeyConfiguration with 11 configurable parameters (minimal 3 required) - Create DistributedCache interface and ValkeyDistributedCache implementation - Integrate distributed cache into BaseRoutingManager routing logic - Use modern Duration API (no deprecated methods) - Add comprehensive input validation and error handling - Include 31 unit tests (16 config + 15 cache tests) Configuration: valkeyConfiguration: enabled: true host: valkey.internal port: 6379 password: ${VALKEY_PASSWORD} Documentation includes: - Quick start guide with minimal configuration - Full configuration reference with tuning guidelines - Deployment scenarios (single vs. multi-instance) - Performance tuning recommendations - Security best practices - Architecture documentation and troubleshooting Single-instance deployments don't need distributed caching - local Guava cache is sufficient. Multi-instance deployments benefit from shared cache for consistent query routing.
1 parent 5040c0d commit b132c33

File tree

5 files changed

+10
-3
lines changed

5 files changed

+10
-3
lines changed

docs/config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ valkeyConfiguration:
1818
host: localhost
1919
port: 6379
2020
# password: ${VALKEY_PASSWORD} # Uncomment if Valkey requires AUTH
21+
# cacheTtlSeconds: 1800 # Cache TTL in seconds (default: 1800 = 30 minutes)

docs/installation.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,14 @@ valkeyConfiguration:
176176
host: valkey.internal.prod
177177
port: 6379
178178
password: ${ENV:VALKEY_PASSWORD}
179+
cacheTtlSeconds: 1800 # Cache TTL (default: 1800 = 30 minutes)
179180
```
180181

182+
**Optional parameters**: You can customize `cacheTtlSeconds` based on your query duration:
183+
- Short queries (< 5 min): 600 seconds (10 minutes)
184+
- Default queries: 1800 seconds (30 minutes)
185+
- Long-running queries: 3600 seconds (1 hour)
186+
181187
See [Valkey distributed cache configuration](valkey-configuration.md) for
182188
detailed configuration options, deployment scenarios, and performance tuning.
183189

docs/valkey-configuration.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,9 @@ valkeyConfiguration:
187187
host: ${VALKEY_INTERNAL_HOST}
188188
port: 6379
189189
password: ${VALKEY_PASSWORD}
190+
```
190191

192+
```bash
191193
# Environment variables (set in deployment)
192194
export VALKEY_INTERNAL_HOST=valkey.vpc.internal
193195
export VALKEY_PASSWORD=$(vault read -field=password secret/valkey)

gateway-ha/config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,4 @@ valkeyConfiguration:
3030
host: localhost
3131
port: 6379
3232
# password: ${VALKEY_PASSWORD} # Uncomment if Valkey requires AUTH
33+
# cacheTtlSeconds: 1800 # Cache TTL in seconds (default: 1800 = 30 minutes)

gateway-ha/src/main/java/io/trino/gateway/ha/module/HaGatewayProviderModule.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import io.trino.gateway.ha.config.OAuth2GatewayCookieConfigurationPropertiesProvider;
4141
import io.trino.gateway.ha.config.RoutingRulesConfiguration;
4242
import io.trino.gateway.ha.config.RulesExternalConfiguration;
43-
import io.trino.gateway.ha.config.UserConfiguration;
4443
import io.trino.gateway.ha.config.ValkeyConfiguration;
4544
import io.trino.gateway.ha.persistence.JdbcConnectionManager;
4645
import io.trino.gateway.ha.persistence.RecordAndAnnotatedConstructorMapper;
@@ -55,9 +54,7 @@
5554
import io.trino.gateway.ha.router.QueryHistoryManager;
5655
import io.trino.gateway.ha.router.ResourceGroupsManager;
5756
import io.trino.gateway.ha.router.RoutingGroupSelector;
58-
import io.trino.gateway.ha.router.RoutingManager;
5957
import io.trino.gateway.ha.router.ValkeyDistributedCache;
60-
import io.trino.gateway.ha.security.ApiAuthenticator;
6158
import io.trino.gateway.ha.security.AuthorizationManager;
6259
import io.trino.gateway.ha.security.LbAuthorizer;
6360
import io.trino.gateway.ha.security.LbFormAuthManager;

0 commit comments

Comments
 (0)