我正在运行ServiceStack的许可版本,并尝试在Google Cloud Compute上获取哨兵群集设置。
群集基本上是GCE的即点即用Redis解决方案-3台服务器。这是我用来初始化的代码…
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());
客户端工作正常-
但是一旦我关闭了其中一个Redis实例,一切都会摇摇欲坠。客户端抱怨无法连接到丢失的实例。另外,即使当我备份实例时,它也处于只读模式,因此一切仍然失败。一旦处于这种状态,似乎就无法恢复…
难道我做错了什么?RedisSentinal客户端不知道新主服务器是谁的某些原因吗?我将所有3个主机IP地址都提供给它…
您应该只向Redis
Sentinel服务器的主机提供服务,RedisSentinel
因为它会从Sentinel主机获取其他主/从Redis服务器的活动列表。
RedisSentinel
最近在 MyGet
中可用的最新 v4.0.37
中对进行了一些更改,其中包括额外的日志记录和Redis Sentinel事件的回调。新的 v4.0.37 API如下所示:
var sentinel = new RedisSentinel(sentinelHost, masterName);
启动RedisSentinel将连接到Sentinel主机,并返回一个预配置的RedisClientManager(即redis连接池),其中活动的
var redisManager = sentinel.Start();
然后,您可以使用以下方法在IOC中进行注册:
container.Register<IRedisClientsManager>(redisManager);
然后,它们RedisSentinel
应侦听Sentinel主机上的主/从更改,并相应地对 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中配置Logging来启用这些事件的日志记录:
LogManager.LogFactory = new ConsoleLogFactory(debugEnabled:false);
还有一个附加的显式变量FailoverToSentinelHosts()
,可用于强制RedisSentinel
重新查找和故障转移到最新的主/从主机,例如:
var sentinelInfo = sentinel.FailoverToSentinelHosts();
新的主机在返回的sentinelInfo中可用:
"Failed over to read/write: {0}, read-only: {1}".Print(
sentinelInfo.RedisMasters, sentinelInfo.RedisSlaves);
问题内容: Android 中的class或org.apache.http.HttpEntity的目的是什么? 什么时候应该使用它会产生副作用? 我正在尝试修复应用程序中的一个错误,该错误使用HttpClient向服务器发出请求,有时即使一个特定的请求失败,尽管互联网正常,但随后也会失败。应用在输入流读取结束时调用此方法。 问题答案: 正如@Sotirios建议的那样,已弃用,因此请在可行时使用。
本文向大家介绍JavaScript中的await/async的作用和用法,包括了JavaScript中的await/async的作用和用法的使用技巧和注意事项,需要的朋友参考一下 await/async 是 ES7 最重要特性之一,它是目前为止 JS 最佳的异步解决方案了。虽然没有在 ES2016 中录入,但很快就到来,目前已经在 ES-Next Stage 4 阶段。 直接上例子,比如我们需要按
问题内容: 让我以谨慎的态度为这篇文章做开头。我是Java的初学者。我已经对PHP进行了一段时间的编程,但是我准备制作一个桌面应用程序,因此出于各种原因,我决定使用Java。 我正在处理的应用程序处于起步阶段(少于5个类),我需要从本地文件读取字节。通常,文件当前小于512kB(但将来可能会更大)。目前,我正在使用a 将文件读取为三个字节的数组,这完全可以满足我的要求。但是,我已经看到一个提及,并
主要内容:const 和指针,const 和函数形参,const 和非 const 类型转换有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定。例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小。为了满足这一要求,可以使用 关键字对变量加以限定: 这样 MaxNum 的值就不能被修改了,任何对 MaxNum 赋值的行为都将引发错误: 我们经常将 const 变量称为 常量(Constant)。创建常量的格式通常为: const type name = va
主要内容:typedef 和 #define 的区别C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样。 起别名的目的不是为了提高程序运行效率,而是为了编码方便。例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样写: struct stu stu1; struct 看起来就是多余的,但不写又会报错。如果为 struct stu 起了一个别名 STU,书写起来就简单了: STU stu1; 这种写法更加简练,意义也非常明确,
主要内容:#include 用法举例叫做 文件包含命令,用来引入对应的头文件( 文件)。#include 也是C语言预处理命令的一种。 #include 的处理过程很简单,就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连接成一个源文件,这与复制粘贴的效果相同。 #include 的用法有两种,如下所示: #include <stdHeader.h> #include "myHeader.h" 使用尖括号 和双引号