c# - 使用 DataStax C# 驱动程序时故障转移不适用于 Cassandra

标签 c# azure cassandra datastax-enterprise

我在 Azure 中设置了两个节点,并且尝试在连接 C# 驱动程序时进行故障转移。在使用 cqlsh 和 OpsCenter 内时,我的节点似乎通信良好。

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

我最初连接第一个节点的公共(public)IP。这很好用。然而,在配置中,我使用虚拟网络分配的内部网络IP,例如10.1.0.4、10.1.0.5等。我将它们设置为每个节点的listen_address和broadcast_rpc_address。即使我在配置中使用内部 IP,我也可以很好地连接公共(public) IP。我有一个特殊的防火墙规则,允许我从公共(public) IP 上的特定计算机进行连接。但是,为了避免内部节点通信的防火墙规则,我将节点放在同一个虚拟网络上,不需要额外的工作。

这看起来很棒,直到我的第一个节点出现故障。 然后它会尝试使用内部 IP 的第二个节点。

I get an error: All Hosts tried for query (Public IP of First Node), (Internal IP of Second Node)

但是由于我是从不在虚拟网络中的计算机进行连接,因此无法访问此内部 IP。我的应用程序不会位于内部网络中,因此这似乎是一个问题。

不使用内部 ip 会迫使我设置身份验证和/或特殊的防火墙规则,而我不想这样做。有什么方法可以强制 C# 驱动程序使用公共(public) ip 并允许节点在内部 ip 上进行通信吗?除非您有多个区域,否则使用内部 ip 似乎是推荐的最佳实践。

最佳答案

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

就您的情况而言,如果您想使用公共(public) IP 地址与驱动程序连接,则应将 broadcast_rpc_address 设置为公共(public) 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 绑定(bind)的 IP 地址或主机名,用于连接其他 Cassandra 节点。
  • broadcast_rpc_address:向驱动程序和其他 Cassandra 节点广播的 RPC 地址。该值不能设置为 0.0.0.0。如果为空,则设置为 rpc_address 或 rpc_interface 的值。如果rpc_address或rpc_interface设置为0.0.0.0,则必须设置此属性。

关于c# - 使用 DataStax C# 驱动程序时故障转移不适用于 Cassandra,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30449194/

相关文章:

php - 如何设置实时 WebSocket 缓冲区?

c# - ApiHubFile Azure Function 绑定(bind)的动态输出文件名(一个驱动器、投递箱等)

数据库/NoSQL - 检索以下数据的最低延迟方式

c# - MemoryStream 没有向文件写入任何内容

c# - UWP 应用程序中的 Async Task.Delay 开销,是否有更好的解决方案?

Azure Web 应用程序更新

cassandra - 我应该如何在集群中复制键空间

c# - 如何使用保存对话框下载文件

c# - 如何测量页面时间负载?

cassandra - 使用中国数据中心 (CGF) 扩展 Cassandra 集群