我在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。我的应用程序将不在内部网络中,因此这似乎是一个问题。
不使用内部ips会迫使我设置身份验证和/或我宁愿不必执行的特殊防火墙规则。有什么方法可以强制C#驱动程序使用公共ip并允许节点在内部ip上进行通信?除非您有多个区域,否则建议使用内部ips是最佳做法。
broadcast_rpc_address
驱动程序使用在cassandra.yaml文件中配置的IP连接到它们。
对于您的情况,如果要使用公共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());
从文档:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句