当使用DataStax c#驱动程序时,故障转移无法与Cassandra一起工作

本文关键字:转移 Cassandra 工作 一起 故障 DataStax 驱动程序 | 更新日期: 2023-09-27 17:50:46

我在Azure中有两个节点设置,我试图在与c#驱动程序连接时获得故障转移工作。当使用cqlsh和OpsCenter时,我的节点似乎可以很好地通信。

var contact = "publicipforfirstnode";
_cluster = Cassandra.Cluster.Builder().AddContactPoint(contact).Build();
_session = _cluster.Connect("demo");

我首先连接到第一个节点的公共IP。这很好。然而,在配置中,我使用了虚拟网络分配的内部网络ip,如10.1.0.4、10.1.0.5等。我将它们设置为每个节点的listen_address和broadcast_rpc_address。即使我在配置中使用内部IP,我也可以很好地连接到公共IP。我有一个特殊的防火墙规则,允许我从公共IP上的某个机器连接。然而,为了避免节点内部通信的防火墙规则,我把节点放在同一个虚拟网络上,不需要额外的工作。

这看起来很好,直到我的第一个节点下降。然后使用内部IP尝试第二个节点。

我得到一个错误:所有主机尝试查询(第一个公共IP)(第二个节点的内部IP)

但是由于我从不在虚拟网络中的机器连接,它无法到达这个内部ip。我的应用程序不会在内部网络,所以这似乎是一个问题。

不使用内部ip迫使我设置身份验证和/或特殊的防火墙规则,我宁愿不这样做。有没有办法强制c#驱动程序使用公共ip,并允许节点在内部ip上通信?使用内部ip似乎是推荐的最佳实践,除非您有多个区域。

当使用DataStax c#驱动程序时,故障转移无法与Cassandra一起工作

在cassandra中配置为broadcast_rpc_address的IP。驱动程序使用Yaml文件来连接它们。

在您的情况下,如果您想使用公共ip地址与驱动程序连接,您应该将broadcast_rpc_address设置为公共ip地址。

您可以在驱动程序中启用跟踪以查看引擎盖下发生的事情:

// Specify the minimum trace level you want to see
Cassandra.Diagnostics.CassandraTraceSwitch.Level = TraceLevel.Info;
// Add a standard .NET trace listener
Trace.Listeners.Add(new ConsoleTraceListener());

From the docs:

  • listen_address:绑定到其他Cassandra节点的IP地址或主机名。
  • broadcast_rpc_address:向广播到驱动程序和其他Cassandra节点的RPC地址。不能设置为0.0.0.0。如果为空,则设置为rpc_address或rpc_interface的值。如果rpc_address或rpc_interface设置为0.0.0.0,则必须设置此属性。

当您的Cassandra集群位于NAT设备(如防火墙或网关)后面时,了解broadcast_addressbroadcast_rpc_address的含义是很重要的。

broadcast_address是其他节点连接的地址。默认情况下,这与listen_address相同(通常您需要这样做,因为节点位于同一网络中)。

如果您的集群跨两个网络并且发生NAT,则必须将其设置为两个网络上的节点都可以访问的值(如果您在AWS中进行多区域部署,则可以将其设置为公共IP)。这意味着网络内以及跨网络的流量都将通过NAT设备,因为内部IP不可达。

broadcast_rpc_address是一个节点"通告"另一个节点的地址。

。,节点A有broadcast_address =10.0.0.100和broadcast_rpc_address =52.2.3.100,节点B有broadcast_address =10.0.0.101和broadcast_rpc_address =52.2.3.101

接下来发生的是节点A将在10.0.0.101连接到节点B,但如果客户端驱动程序问A"嘿,你的集群中还有哪些节点?",那么它将为B响应52.2.3.101。

这个设计(我相信是在Cassandra 2.0.10中引入的)使得网络外的客户端可以连接到集群中的任何节点(不仅仅是种子节点)。

但是限制是你不能在网络内外都有客户端,否则你需要确保网络内外都可以访问公共IP(如更改防火墙设置)。

我希望这能澄清一些事情。

添加

如果您愿意,您可以使用以下cqlsh命令查找节点对其他节点的了解情况:

select * from system.peers

peer列为节点的broadcast_address, rpc_address列为节点的broadcast_rpc_address