RRedis Handbook

İ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.
Normal → Master çöker → Sentinel failover → Replica promote Master :6379 (WRITE) Replica 1 :6380 → NEW MASTER ⬆ PROMOTED Replica 2 :6381 → follows new master async repl Sentinel 1 Sentinel 2 Sentinel 3 quorum: 2/3 → FAILOVER .NET App auto-reconnect
# 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. WAIT komutu 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.