csredis icon indicating copy to clipboard operation
csredis copied to clipboard

状态不可用,等待后台检查程序恢复方可使用 Connect to server timeout

Open yeibl opened this issue 4 years ago • 11 comments

【aiyunrds:6379/0】状态不可用,等待后台检查程序恢复方可使用。Connect to server timeout

运行一段是时间后出现上面这个问题 centos 7 csrediscore 3.6.5 and csrediscore 3.15
尝试过 #324 里面的方案还是不行, 连接字符串如下 "ConnectionString": "rds:6379,password=***,idleTimeout=15000,tryit=2,poolsize=500,preheat=10,syncTimeout=15000,testcluster=false" 重启linux 还是不行

yeibl avatar Aug 07 '20 17:08 yeibl

connectTimeout=30000

【aiyunrds:6379/0】状态不可用,等待后台检查程序恢复方可使用。Connect to server timeout

连接超时才会这样,默认是5秒超时。

2881099 avatar Aug 07 '20 17:08 2881099

但是本地不会哦,线上也是可以ping 通的

yeibl avatar Aug 07 '20 17:08 yeibl

connectTimeout=30000

加了也不行,就是线上liunx 环境会这样,而且这个环境之前也是可以的

yeibl avatar Aug 07 '20 18:08 yeibl

aiyunrds:6379

这是什么,确定能连?

2881099 avatar Aug 08 '20 02:08 2881099

阿里云的 redis 只是做个说明,线上的不是这样

yeibl avatar Aug 08 '20 03:08 yeibl

我发现出现这种情况是在程序更新的时候,应用程序有两台负载 A,B 我这边更新的时候一般是先更新A服务器验证情况然后在更新到B,但是有时候,更新完A之后再重启A服务的应用,之后redis就无法连接了,导致B也无法链接 redis服务器,报的错误都是 状态不可用,等待后台检查程序恢复方可使用。Connect to server timeout 服务器AB都是linux centos 7 ,redis使用的是阿里云的云服务

yeibl avatar Sep 29 '20 07:09 yeibl

demo 复现了问题 开一个线程订阅 很多线程发布和插入操作 就会出现 在3.6.5, 3.6.6版本都会奔溃 3.5.5 可以跑较长时间不出现问题 `using System; using System.Collections.Concurrent; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using CSRedis; using Newtonsoft.Json; using Newtonsoft.Json.Converters;

namespace MG.Redis.CSRedis.Test { class Program { public class DispatchRecordDTO { public DateTime SendTime { get; set; } public long testInt { get; set; } public string testTxt { get; set; } } public static long ToUnixTime(DateTime dateTime) { return (dateTime.ToUniversalTime().Ticks - 621355968000000000) / 10000; } static void Main(string[] args) { Console.WriteLine("Hello World!"); //var redis = new RedisService(new RedisOption() //{ // RedisHost = "127.0.0.1", // DefaultIndex = 0, // RedisPort = 6379, // asyncPipeline = true, // ConnectTimeout = 15000, // Poolsize = 100, //}); var redis = new CSRedisClient("127.0.0.1:6379,defaultDatabase=0,ssl=false," + "writeBuffer=10240,preheat=2,Poolsize=100,idleTimeout=20000,syncTimeout=20000,asyncPipeline=true,connectTimeout=15000"); //var redis = new CSRedisClient("127.0.0.1:6379,defaultDatabase=0,ssl=false,writeBuffer=10240,preheat=false"); var tasks = new ConcurrentBag();

        try
        {
            redis.Subscribe(("key", c =>
                    {
                        //if (c.Body.Contains("不可用"))
                        Console.WriteLine(c.Body);

                        var sb = new StringBuilder();
                        Console.WriteLine("test1");
                        sb.Append($"127.0.0.1:6379/0统计信息\r\n");
                        redis.Nodes.Values.ToList().ForEach(c =>
                        {
                            sb.Append(c.Statistics + "\r\n");
                        });
                        Console.WriteLine(tasks.Count + "\r\n");
                        Console.WriteLine(sb.ToString());
                    }
            ));
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        for (int i = 0; i < 60000; i++)
        {
            Task.Run(() =>
            {
                while (true)
                {
                    var guid = Guid.NewGuid().ToString();
                    try
                    {
                        if (!tasks.Contains(Thread.CurrentThread.ManagedThreadId))
                        {
                            tasks.Add(Thread.CurrentThread.ManagedThreadId);
                        }
                        //redis.RedisInstance.Set($"{guid}_test", "1", 1000);
                        //redis.RedisInstance.Get($"{guid}_test");
                        //redis.RedisInstance.PublishNoneMessageId("key", $"{DateTime.Now}test{Thread.CurrentThread.ManagedThreadId}");
                        //redis2.RedisInstance.Set($"{guid}_test", "1", 1000);
                        //redis2.RedisInstance.PublishNoneMessageId("key", $"{DateTime.Now}test{Thread.CurrentThread.ManagedThreadId}");


                        var key = $"{DateTime.Now.ToString("yyyyMMdd")}_test_DispatchLog";
                        var t = new DispatchRecordDTO()
                        {
                            SendTime = DateTime.Now,
                            testInt = 111,
                            testTxt = $"aaaaaaa"
                        };
                        IsoDateTimeConverter timeFormat = new IsoDateTimeConverter();
                        timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
                        _ = redis.ZAddAsync(key, (ToUnixTime(DateTime.Now), JsonConvert.SerializeObject(t
                            , Formatting.Indented, timeFormat))).Result;
                        _ = redis.ExpireAsync(key, TimeSpan.FromSeconds(2));
                        _ = redis.PublishNoneMessageIdAsync("key",
                             $"{Thread.CurrentThread.ManagedThreadId}test").Result;
                        Task.Delay(100).Wait();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                }
            });
        }


        Console.ReadKey();
    }
}

} `

nontracey avatar Jan 22 '21 16:01 nontracey

跑3.5.5 又会出现(【127.0.0.1:6379/9】状态不可用,等待后台检查程序恢复方可使用。Client is not connected)

nontracey avatar Jan 23 '21 02:01 nontracey

跑3.5.5 又会出现(【127.0.0.1:6379/9】状态不可用,等待后台检查程序恢复方可使用。Client is not connected)

没用的,我试过很多次了

Y2zz avatar Apr 29 '22 12:04 Y2zz

可以试试 FreeRedis

2881099 avatar Apr 30 '22 03:04 2881099

已经收到邮件

nontracey avatar Apr 30 '22 03:04 nontracey