İLERİ
Replication & Sentinel
Master-Replica (async replication) + Sentinel (otomatik failover).
Kod örneği görünümü
Bu sayfadaki eşleşen örnekleri seçilen istemciye göre gösterir.
# docker-compose.yml — Master + 2 Replica + 3 Sentinel
services:
redis-master:
image: redis:8-alpine
command: redis-server --appendonly yes --requirepass masterpass
redis-replica-1:
image: redis:8-alpine
command: redis-server --replicaof redis-master 6379 --masterauth masterpass --requirepass replicapass
redis-replica-2:
image: redis:8-alpine
command: redis-server --replicaof redis-master 6379 --masterauth masterpass --requirepass replicapass
sentinel-1:
image: redis:8-alpine
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- ./sentinel.conf:/etc/redis/sentinel.conf
sentinel-2:
image: redis:8-alpine
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- ./sentinel.conf:/etc/redis/sentinel.conf
sentinel-3:
image: redis:8-alpine
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- ./sentinel.conf:/etc/redis/sentinel.conf
# sentinel.conf
sentinel monitor mymaster redis-master 6379 2
sentinel auth-pass mymaster masterpass
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
# Durum kontrol
redis-cli -p 26379 SENTINEL masters
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
redis-cli INFO replication
// Sentinel bağlantısı — otomatik failover desteği
var config = new ConfigurationOptions
{
ServiceName = "mymaster", // Sentinel monitör adı
Password = "masterpass",
AbortOnConnectFail = false,
ConnectRetry = 3,
ConnectTimeout = 5000,
DefaultDatabase = 0,
AllowAdmin = false
};
config.EndPoints.Add("sentinel-1:26379");
config.EndPoints.Add("sentinel-2:26379");
config.EndPoints.Add("sentinel-3:26379");
builder.Services.AddSingleton<IConnectionMultiplexer>(
ConnectionMultiplexer.Connect(config));
// Failover event'ini dinle
var mux = ConnectionMultiplexer.Connect(config);
mux.ConnectionFailed += (sender, args) =>
{
logger.LogWarning("Redis connection failed: {FailureType} - {Exception}",
args.FailureType, args.Exception?.Message);
};
mux.ConnectionRestored += (sender, args) =>
{
logger.LogInformation("Redis connection restored: {EndPoint}", args.EndPoint);
};
// Read replicas'dan okuma (yazım master'a gider)
var db = mux.GetDatabase();
// Replica'dan oku (eventual consistency)
var value = await db.StringGetAsync("key", CommandFlags.PreferReplica);
// Master'dan oku (strong consistency)
var fresh = await db.StringGetAsync("key", CommandFlags.DemandMaster);
Replication async'tir. Master'a yazılan veri replica'ya ulaşmadan master çökerse veri kaybı olabilir.
WAITkomutu ile sync replication mümkün ama latency artar.
Sentinel + Multi-DB: Sentinel sadece db0'ı monitor eder. Failover sonrası yeni master'da diğer DB'lere SELECT yapılabilir ama Sentinel'in health check'i sadece db0 üzerinden çalışır. Production'da Sentinel kullanıyorsan db0 + key prefix tercih et.