/// <summary> /// 连接到指定的Sentinel,获取 master 和 slave 信息并返回。同时,注册相应的事件用于接收 sentinel 的通知消息 /// </summary> /// <returns></returns> public string Start() { var redisConnectionString = string.Empty; try { // redis在哨兵模式下,如果Password不为null 或 "",会使用 AUTH 命令,但这个命令是不可用的。 // 所以,克隆一个配置,并将其 Password信息去除 ConfigurationOptions finalSentinalConfig = SentinelConfig; if (!string.IsNullOrWhiteSpace(SentinelConfig.Password)) { var cloneConfig = SentinelConfig.Clone(); cloneConfig.Password = ""; finalSentinalConfig = cloneConfig; } SentinelConnection = ConnectionMultiplexer.Connect(finalSentinalConfig); redisConnectionString = GetConnectionStringFromSentinel(); _Sentinelsub = SentinelConnection.GetSubscriber(); _Sentinelsub.SubscribeAsync("+switch-master", (channle, msg) => { redisConnectionString = GetConnectionStringFromSentinel(); RaiseOnRedisServerChanged(_Section, redisConnectionString, PoolSize); }); } catch (Exception ex) { throw new Exception(string.Format("SESentinelClient.Start 连接到哨兵服务器({0})失败:{1}", SentinelConfig, ex.Message)); } return(redisConnectionString); }
/// <summary> /// 初始化哨兵类 /// </summary> /// <param name="section"></param> /// <param name="connectionStr"></param> /// <param name="poolSize"></param> /// <param name="password"></param> public SESentinelClient(string section, string connectionStr, int poolSize, string password) { if (SentinelConnection != null) { SentinelConnection.Dispose(); } _Section = section; SentinelConfig = ConfigurationOptions.Parse(connectionStr); SentinelConfig.TieBreaker = string.Empty; SentinelConfig.CommandMap = CommandMap.Sentinel; PoolSize = poolSize; _password = password; }
/// <summary> /// 根据当前哨兵获取对应redis实例的连接字符串 /// </summary> /// <returns></returns> private string GetConnectionStringFromSentinel() { try { var activeSentinelServer = GetActiveServer(SentinelConnection, SentinelConnection.GetEndPoints()); var masterConnectionInfo = activeSentinelServer.SentinelGetMasterAddressByName(SentinelConfig.ServiceName); var slaveConnectionInfos = SanitizeHostsConfig(activeSentinelServer.SentinelSlaves(SentinelConfig.ServiceName)); var redisConfigs = new ConfigurationOptions { AllowAdmin = true, DefaultDatabase = SentinelConfig.DefaultDatabase, ConnectRetry = SentinelConfig.ConnectRetry, ConnectTimeout = SentinelConfig.ConnectTimeout, KeepAlive = SentinelConfig.KeepAlive, SyncTimeout = SentinelConfig.SyncTimeout, AbortOnConnectFail = false }; if (!string.IsNullOrEmpty(_password)) { redisConfigs.Password = _password; } redisConfigs.EndPoints.Add(masterConnectionInfo); foreach (var slaveInfo in slaveConnectionInfos) { redisConfigs.EndPoints.Add(slaveInfo); } return(redisConfigs.ToString()); } catch (Exception ex) { throw new Exception(string.Format("SESentinelClient.GetConnectionStringFromSentinel 连接到哨兵服务器({0})失败:{1}", SentinelConfig, ex.Message)); } }