RabbitMQ MassTransit 集群问题
RabbitMQ MassTransit Clustering Issue
环境:RabbitMQ 3.8.14
、Erlang 23.2
、Masstrnasit 7.2.2
、Asp.net core 5.0
Windows server 2016
.
我在不同的服务器中有两个名称为 rabbit@rabbitOne
和 rabbit@rabbitTwo
的节点。
根据 RabbitMQ official documents,我为两个节点设置了相同的 erlang cookie。并将 rabbit@rabbitTwo
节点加入到 rabbit@rabbitOne
节点。
一切都是正确的。我在 rabbit@rabbitTwo 服务器的 RabbitMQ Mangement UI 中看到了两个节点。
我已经看到属于 'rabbit@rabbitOne' 的所有队列。
我还创建了一些类型为 Quorum Queues.
的队列
我使用以下代码配置了 MassTransit:
x.UsingRabbitMq((context, cfg) =>
{
cfg.Host(configuration["clusterName"], opt =>
{
//the host set and test with multiple value; cluster name or host Ip port of the rabbit@rabbitOne node.
opt.UseCluster(cluster =>
{
var nodes = configuration["Rabbit:Nodes"].Split(";");
//nodes set with Ip port.
foreach (var node in nodes)
{
if (string.IsNullOrWhiteSpace(node))
continue;
cluster.Node(node);
}
});
opt.Username(configuration["Rabbit:UserName"]);
opt.Password(configuration["Rabbit:Password"]);
});
现在,我将事件发布到队列中。他们正确地工作了。
问题:
我想simulate high availability
,为了这个工作,我手动停止了rabbit@rabbitOne
节点。我已经看到 rabbit@rabbitOne
节点的 down state
和他的所有队列,除了我的仲裁队列,它们在 running state
中。
但在这种情况下 (rabbit@rabbitOne) MassTransit 总线无法连接到 RabbitMQ。我得到了例外:'None of the specified endpoints were reachable'。 connection faild: "rabbitmq://myMlusterName"
。
我知道什么意思。但我假设这个提示:尽管 rabbit@rabbitOne
节点已关闭,但具有仲裁队列的 rabbit@rabbitTwo
节点必须可用!。
小姐,我了解有关 RabbitMQ 集群的任何事情吗?
我想,我必须在 MassTransit 配置中为 Host 设置另一个值吗?
一定是我在 RabbitMQ 配置文件中为发现节点设置了什么吗?
还是另一个想念?
仲裁队列需要一个仲裁才能访问,这意味着 3 个节点中的 2 个,或 4 个节点中的 3 个,等等。只有一个节点可用的仲裁队列是不可能的。它是 (N/2)+1。并且 2/2+1=2.
Classic HA queues work with a single node, but can potentially result in a split-brain if you don't use pause minority and manually recover the failed nodes.
环境:RabbitMQ 3.8.14
、Erlang 23.2
、Masstrnasit 7.2.2
、Asp.net core 5.0
Windows server 2016
.
我在不同的服务器中有两个名称为 rabbit@rabbitOne
和 rabbit@rabbitTwo
的节点。
根据 RabbitMQ official documents,我为两个节点设置了相同的 erlang cookie。并将 rabbit@rabbitTwo
节点加入到 rabbit@rabbitOne
节点。
一切都是正确的。我在 rabbit@rabbitTwo 服务器的 RabbitMQ Mangement UI 中看到了两个节点。
我已经看到属于 'rabbit@rabbitOne' 的所有队列。
我还创建了一些类型为 Quorum Queues.
我使用以下代码配置了 MassTransit:
x.UsingRabbitMq((context, cfg) =>
{
cfg.Host(configuration["clusterName"], opt =>
{
//the host set and test with multiple value; cluster name or host Ip port of the rabbit@rabbitOne node.
opt.UseCluster(cluster =>
{
var nodes = configuration["Rabbit:Nodes"].Split(";");
//nodes set with Ip port.
foreach (var node in nodes)
{
if (string.IsNullOrWhiteSpace(node))
continue;
cluster.Node(node);
}
});
opt.Username(configuration["Rabbit:UserName"]);
opt.Password(configuration["Rabbit:Password"]);
});
现在,我将事件发布到队列中。他们正确地工作了。
问题:
我想simulate high availability
,为了这个工作,我手动停止了rabbit@rabbitOne
节点。我已经看到 rabbit@rabbitOne
节点的 down state
和他的所有队列,除了我的仲裁队列,它们在 running state
中。
但在这种情况下 (rabbit@rabbitOne) MassTransit 总线无法连接到 RabbitMQ。我得到了例外:'None of the specified endpoints were reachable'。 connection faild: "rabbitmq://myMlusterName"
。
我知道什么意思。但我假设这个提示:尽管 rabbit@rabbitOne
节点已关闭,但具有仲裁队列的 rabbit@rabbitTwo
节点必须可用!。
小姐,我了解有关 RabbitMQ 集群的任何事情吗?
我想,我必须在 MassTransit 配置中为 Host 设置另一个值吗?
一定是我在 RabbitMQ 配置文件中为发现节点设置了什么吗?
还是另一个想念?
仲裁队列需要一个仲裁才能访问,这意味着 3 个节点中的 2 个,或 4 个节点中的 3 个,等等。只有一个节点可用的仲裁队列是不可能的。它是 (N/2)+1。并且 2/2+1=2.
Classic HA queues work with a single node, but can potentially result in a split-brain if you don't use pause minority and manually recover the failed nodes.