一尘不染

从Sentinel C#获取Redis主地址

redis

我正在尝试使用哨兵来获取我的主服务器的连接地址,问题是哨兵仅在故障转移时发送该地址,但是如果我的主服务器关闭并且从属服务器被提升为主服务器并且我的应用程序刚刚启动,则不会知道并且不会收到有关原始主服务器已关闭的消息,是否有任何方法可以与哨兵通信,并询问他认为主服务器正在使用C#servicestack
redis客户端的人?


阅读 329

收藏
2020-06-20

共1个答案

一尘不染

不得不这样做,我使用下一个代码段模仿了redis-cli命令:(剩下的就是解析响应的结果)

   public string GetMasterFromSentinel(string sentinelAddress)
    {
        TcpClient server;

        try
        {
            var splittedAddress = sentinelAddress.Split(':');
            server = new TcpClient(splittedAddress[0], splittedAddress[1].ParseInt());
        }
        catch (SocketException)
        {
            _log.Error("Unable to connect to server");
            return string.Empty;
        }
        NetworkStream ns = server.GetStream();
        var payload = new byte[] { 0x2a, 0x32, 0x0d, 0x0a, 0x24, 0x38, 0x0d, 0x0a, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6c, 
                0x0d, 0x0a, 0x24, 0x37, 0x0d, 0x0a, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x0d, 0x0a };
        ns.Write(payload, 0, payload.Length);
        ns.Flush();
        var data = new byte[1024];
        ns.Read(data, 0, data.Length);
        var recv = ns.Read(data, 0, data.Length);

        ns.Close();
        server.Close();
        return ParseResponse(data);
    }
2020-06-20