【问题标题】:Failover not working with Cassandra when using DataStax C# Driver使用 DataStax C# 驱动程序时,故障转移不适用于 Cassandra
【发布时间】:2015-08-07 13:48:17
【问题描述】:

我在 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 尝试第二个节点。

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

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

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

【问题讨论】:

    标签: c# azure cassandra datastax-enterprise


    【解决方案1】:

    驱动程序使用 cassandra.yaml 文件中配置为 broadcast_rpc_address 的 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());
    

    From the docs:

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

    【讨论】:

    • 令人困惑的是在 cmets 中它还说广播_rpc_address 被其他节点使用。 broadcast_address 还说它被其他节点使用,所以我认为它们都是。如果驱动程序可以引用与内部节点不同的 IP 地址,那就太好了。
    • 我理解,但在您的情况下,您应该使用 listen_address 作为您的私人 IP,使用 broadcast_rpc_address 作为您的公共 IP。
    • 我尝试更改我的 broadcast_rpc_address 并修复了故障转移问题,但我现在必须查看节点是否使用内部 IP 地址相互通信,因为我有公共 IP 对所有内容开放以进行测试.
    • 您发布的编辑.. 您可以看到它说“其他 cassandra 节点”,这是整个问题。我不希望其他 cassandra 节点使用公共 IP 地址。
    • 这是广播的方式,而不是节点之间的连接方式。您应该看到节点正在使用nodetool status 相互通信。
    【解决方案2】:

    我认为当您的 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_addressrpc_address 列是节点的broadcast_rpc_address

    【讨论】:

    • 我相信节点间通信只使用本地和 gossip,而不是 rpc,因此broadcast_rpc_address 只对客户端驱动程序有用。但如果我错了,请纠正我。
    猜你喜欢
    • 2016-03-01
    • 2014-10-13
    • 2015-08-08
    • 2017-10-04
    • 2022-12-11
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    相关资源
    最近更新 更多