복붙노트

[REDIS] ServiceStack.Redis.Sentinel 사용

REDIS

ServiceStack.Redis.Sentinel 사용

나는 ServiceStack의 라이센스 버전을 실행하고 Google 클라우드 컴퓨팅에 대한 감시 클러스터 설정을 얻기 위해 노력하고있어.

3 개 서버 - 클러스터는 기본적으로 GCE의 클릭 투 배포 레디 스 솔루션입니다. 여기에 내가 초기화 사용하고 코드입니다 ...

var hosts = Settings.Redis.Host.Split(';');
var sentinel = new ServiceStack.Redis.RedisSentinel(hosts, "master");
redis = sentinel.Setup();

container.Register<IRedisClientsManager>(redis);
container.Register<ICacheClient>(redis.GetCacheClient());

클라이언트는 잘 작동합니다 -하지만 난이 종료되면 레디 스 인스턴스의 모든 중 하나는 침대 배변. 클라이언트가 누락 된 인스턴스에 연결할 수 없다는 메시지를 뿌려줍니다. 또한, 나는 백업 인스턴스를 가져올 경우에도 - 모든 것이 계속 실패 그래서, 읽기 전용 모드에 있습니다. 이 상태에서 일단 복구하는 방법이있을 것 같지 않습니다 ...

내가 뭔가 잘못하고있는 건가요? RedisSentinal 클라이언트가 새 주인이 누구인지 파악하지 않는 몇 가지 이유가 있나요? 나는 그것을 3 호스트 IP 주소를 공급 ...

해결법

  1. ==============================

    1.이 센티넬 호스트에서 다른 마스터 / 슬레이브 레디 스 서버의 활성 목록을수록 당신은 RedisSentinel로 레디 스 센티넬 서버의 호스트를 제공해야합니다.

    이 센티넬 호스트에서 다른 마스터 / 슬레이브 레디 스 서버의 활성 목록을수록 당신은 RedisSentinel로 레디 스 센티넬 서버의 호스트를 제공해야합니다.

    RedisSentinel에 일부 변화는 최근에 추가 로깅 및 레디 스 센티넬 이벤트의 콜백을 포함 MyGet에 사용할 수있어 최신 v4.0.37에 추가되었습니다. 새로운 v4.0.37의 API의 외모가 좋아 :

    var sentinel = new RedisSentinel(sentinelHost, masterName);
    

    RedisSentinel 센티넬 호스트에 연결하여 능동 (즉, 레디 스 연결 풀) 사전 구성된 RedisClientManager를 반환 시작

    var redisManager = sentinel.Start();
    

    어떤 당신은 다음 IOC와에 등록 할 수 있습니다 :

    container.Register<IRedisClientsManager>(redisManager);
    

    RedisSentinel는 센티넬 호스트에서 마스터 / 슬레이브 변화를 듣고 따라 redisManager 장애 조치해야한다. 풀에서 기존 연결은 배치와 새로 구성된 호스트에 대한 새 풀로 대체합니다. 다시 사용할 경우 풀의 모든 활성 연결의 외부는은 RedisClient는이 새로운 호스트로 구성됩니다 풀에서 검색되는 다음 번에 연결 예외를 던질거야.

    다음은 RedisServer 이벤트를 성찰하는 새로운 콜백을 사용하는 방법의 예입니다 :

    var sentinel = new RedisSentinel(sentinelHost, masterName)
    {
        OnFailover = manager => 
        {
            "Redis Managers were Failed Over to new hosts".Print();
        },
        OnWorkerError = ex =>
        {
            "Worker error: {0}".Print(ex);
        },
        OnSentinelMessageReceived = (channel, msg) =>
        {
            "Received '{0}' on channel '{1}' from Sentinel".Print(channel, msg);
        },                
    };
    

    이러한 이벤트의 로깅은 ServiceStack에서 로깅을 구성하여 사용할 수 있습니다 :

    LogManager.LogFactory = new ConsoleLogFactory(debugEnabled:false);
    

    최신 마스터 / 슬레이브 호스트, 예컨대에 다시 조회 및 장애 조치에 RedisSentinel를 강제하는 데 사용할 수있는 추가 명시 적 FailoverToSentinelHosts는 ()도 있습니다 :

    var sentinelInfo = sentinel.FailoverToSentinelHosts();
    

    새로운 호스트는 반환 sentinelInfo에서 사용할 수 있습니다 :

    "Failed over to read/write: {0}, read-only: {1}".Print(
        sentinelInfo.RedisMasters, sentinelInfo.RedisSlaves);
    
  2. from https://stackoverflow.com/questions/28132528/servicestack-redis-sentinel-usage by cc-by-sa and MIT license