From b987a58caad6eb833bd4cf8de7df40e564562b67 Mon Sep 17 00:00:00 2001 From: Eauldane Date: Sun, 14 Sep 2025 00:26:59 +0100 Subject: [PATCH] Redis Cluster prep --- .../MareSynchronosAuthService/Startup.cs | 27 ++++++++++--------- .../Services/SystemInfoService.cs | 8 ++++-- .../MareSynchronosServer/Startup.cs | 27 ++++++++++--------- .../Startup.cs | 27 ++++++++++--------- 4 files changed, 51 insertions(+), 38 deletions(-) diff --git a/MareSynchronosServer/MareSynchronosAuthService/Startup.cs b/MareSynchronosServer/MareSynchronosAuthService/Startup.cs index bd06ef5..df0bde1 100644 --- a/MareSynchronosServer/MareSynchronosAuthService/Startup.cs +++ b/MareSynchronosServer/MareSynchronosAuthService/Startup.cs @@ -165,19 +165,22 @@ public class Startup var options = ConfigurationOptions.Parse(redisConnection); - var endpoint = options.EndPoints[0]; - string address = ""; - int port = 0; - if (endpoint is DnsEndPoint dnsEndPoint) { address = dnsEndPoint.Host; port = dnsEndPoint.Port; } - if (endpoint is IPEndPoint ipEndPoint) { address = ipEndPoint.Address.ToString(); port = ipEndPoint.Port; } + var hosts = options.EndPoints + .Select(ep => + { + if (ep is DnsEndPoint dns) return (host: dns.Host, port: dns.Port); + if (ep is IPEndPoint ip) return (host: ip.Address.ToString(), port: ip.Port); + return (host: (string?)null, port: 0); + }) + .Where(x => x.host != null) + .Distinct() + .Select(x => new RedisHost { Host = x.host!, Port = x.port }) + .ToArray(); var redisConfiguration = new RedisConfiguration() { - AbortOnConnectFail = true, + AbortOnConnectFail = false, KeyPrefix = "", - Hosts = new RedisHost[] - { - new RedisHost(){ Host = address, Port = port }, - }, + Hosts = hosts, AllowAdmin = true, ConnectTimeout = options.ConnectTimeout, Database = 0, @@ -187,11 +190,11 @@ public class Startup { Mode = ServerEnumerationStrategy.ModeOptions.All, TargetRole = ServerEnumerationStrategy.TargetRoleOptions.Any, - UnreachableServerAction = ServerEnumerationStrategy.UnreachableServerActionOptions.Throw, + UnreachableServerAction = ServerEnumerationStrategy.UnreachableServerActionOptions.IgnoreIfOtherAvailable, }, MaxValueLength = 1024, PoolSize = mareConfig.GetValue(nameof(ServerConfiguration.RedisPool), 50), - SyncTimeout = options.SyncTimeout, + SyncTimeout = Math.Max(options.SyncTimeout, 10000), }; services.AddStackExchangeRedisExtensions(redisConfiguration); diff --git a/MareSynchronosServer/MareSynchronosServer/Services/SystemInfoService.cs b/MareSynchronosServer/MareSynchronosServer/Services/SystemInfoService.cs index 35db7ac..b597a09 100644 --- a/MareSynchronosServer/MareSynchronosServer/Services/SystemInfoService.cs +++ b/MareSynchronosServer/MareSynchronosServer/Services/SystemInfoService.cs @@ -7,6 +7,7 @@ using MareSynchronosShared.Services; using MareSynchronosShared.Utils.Configuration; using Microsoft.AspNetCore.SignalR; using Microsoft.EntityFrameworkCore; +using StackExchange.Redis; using StackExchange.Redis.Extensions.Core.Abstractions; namespace MareSynchronosServer.Services; @@ -19,11 +20,12 @@ public class SystemInfoService : IHostedService, IDisposable private readonly ILogger _logger; private readonly IHubContext _hubContext; private readonly IRedisDatabase _redis; + private readonly IConnectionMultiplexer _connectionMultiplexer; private Timer _timer; public SystemInfoDto SystemInfoDto { get; private set; } = new(); public SystemInfoService(MareMetrics mareMetrics, IConfigurationService configurationService, IServiceProvider services, - ILogger logger, IHubContext hubContext, IRedisDatabase redisDb) + ILogger logger, IHubContext hubContext, IRedisDatabase redisDb, IConnectionMultiplexer connectionMultiplexer) { _mareMetrics = mareMetrics; _config = configurationService; @@ -31,6 +33,7 @@ public class SystemInfoService : IHostedService, IDisposable _logger = logger; _hubContext = hubContext; _redis = redisDb; + _connectionMultiplexer = connectionMultiplexer; } public Task StartAsync(CancellationToken cancellationToken) @@ -52,8 +55,9 @@ public class SystemInfoService : IHostedService, IDisposable _mareMetrics.SetGaugeTo(MetricsAPI.GaugeAvailableWorkerThreads, workerThreads); _mareMetrics.SetGaugeTo(MetricsAPI.GaugeAvailableIOWorkerThreads, ioThreads); + var onlineUsers = _connectionMultiplexer.GetServers().Where(server => !server.IsReplica).SelectMany(server => server.Keys(0, "UID:*", pageSize:1000)).Count(); - var onlineUsers = (_redis.SearchKeysAsync("UID:*").GetAwaiter().GetResult()).Count(); + SystemInfoDto = new SystemInfoDto() { OnlineUsers = onlineUsers, diff --git a/MareSynchronosServer/MareSynchronosServer/Startup.cs b/MareSynchronosServer/MareSynchronosServer/Startup.cs index da4ec70..3cc6807 100644 --- a/MareSynchronosServer/MareSynchronosServer/Startup.cs +++ b/MareSynchronosServer/MareSynchronosServer/Startup.cs @@ -142,19 +142,22 @@ public class Startup var options = ConfigurationOptions.Parse(redisConnection); - var endpoint = options.EndPoints[0]; - string address = ""; - int port = 0; - if (endpoint is DnsEndPoint dnsEndPoint) { address = dnsEndPoint.Host; port = dnsEndPoint.Port; } - if (endpoint is IPEndPoint ipEndPoint) { address = ipEndPoint.Address.ToString(); port = ipEndPoint.Port; } + var hosts = options.EndPoints + .Select(ep => + { + if (ep is DnsEndPoint dns) return (host: dns.Host, port: dns.Port); + if (ep is IPEndPoint ip) return (host: ip.Address.ToString(), port: ip.Port); + return (host: (string?)null, port: 0); + }) + .Where(x => x.host != null) + .Distinct() + .Select(x => new RedisHost { Host = x.host!, Port = x.port }) + .ToArray(); var redisConfiguration = new RedisConfiguration() { - AbortOnConnectFail = true, + AbortOnConnectFail = false, KeyPrefix = "", - Hosts = new RedisHost[] - { - new RedisHost(){ Host = address, Port = port }, - }, + Hosts = hosts, AllowAdmin = true, ConnectTimeout = options.ConnectTimeout, Database = 0, @@ -164,11 +167,11 @@ public class Startup { Mode = ServerEnumerationStrategy.ModeOptions.All, TargetRole = ServerEnumerationStrategy.TargetRoleOptions.Any, - UnreachableServerAction = ServerEnumerationStrategy.UnreachableServerActionOptions.Throw, + UnreachableServerAction = ServerEnumerationStrategy.UnreachableServerActionOptions.IgnoreIfOtherAvailable, }, MaxValueLength = 1024, PoolSize = mareConfig.GetValue(nameof(ServerConfiguration.RedisPool), 50), - SyncTimeout = options.SyncTimeout, + SyncTimeout = Math.Max(options.SyncTimeout, 10000), }; services.AddStackExchangeRedisExtensions(redisConfiguration); diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Startup.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Startup.cs index 9c01a36..bb4cc89 100644 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Startup.cs +++ b/MareSynchronosServer/MareSynchronosStaticFilesServer/Startup.cs @@ -142,19 +142,22 @@ public class Startup var options = ConfigurationOptions.Parse(redisConnection); - var endpoint = options.EndPoints[0]; - string address = ""; - int port = 0; - if (endpoint is DnsEndPoint dnsEndPoint) { address = dnsEndPoint.Host; port = dnsEndPoint.Port; } - if (endpoint is IPEndPoint ipEndPoint) { address = ipEndPoint.Address.ToString(); port = ipEndPoint.Port; } + var hosts = options.EndPoints + .Select(ep => + { + if (ep is DnsEndPoint dns) return (host: dns.Host, port: dns.Port); + if (ep is IPEndPoint ip) return (host: ip.Address.ToString(), port: ip.Port); + return (host: (string?)null, port: 0); + }) + .Where(x => x.host != null) + .Distinct() + .Select(x => new RedisHost { Host = x.host!, Port = x.port }) + .ToArray(); var redisConfiguration = new RedisConfiguration() { - AbortOnConnectFail = true, + AbortOnConnectFail = false, KeyPrefix = "", - Hosts = new RedisHost[] - { - new RedisHost(){ Host = address, Port = port }, - }, + Hosts = hosts, AllowAdmin = true, ConnectTimeout = options.ConnectTimeout, Database = 0, @@ -164,11 +167,11 @@ public class Startup { Mode = ServerEnumerationStrategy.ModeOptions.All, TargetRole = ServerEnumerationStrategy.TargetRoleOptions.Any, - UnreachableServerAction = ServerEnumerationStrategy.UnreachableServerActionOptions.Throw, + UnreachableServerAction = ServerEnumerationStrategy.UnreachableServerActionOptions.IgnoreIfOtherAvailable, }, MaxValueLength = 1024, PoolSize = mareConfig.GetValue(nameof(ServerConfiguration.RedisPool), 50), - SyncTimeout = options.SyncTimeout, + SyncTimeout = Math.Max(options.SyncTimeout, 10000), }; services.AddStackExchangeRedisExtensions(redisConfiguration);