【问题标题】:Cannot Connect Cassandra Client on Public IP无法在公共 IP 上连接 Cassandra 客户端
【发布时间】:2019-04-19 19:36:10
【问题描述】:

您好,我正在尝试在 Azure linux VM 上设置一个三节点 Cassandra 集群,并使用 C# datastax 客户端从外部计算机连接到它。但是,我无法通过网络外部的虚拟机公共 IP 进行连接。任何帮助将不胜感激,因为我现在迷路了。

这是机器正在运行的 Java 版本。

openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-0ubuntu0.18.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

我的 cassandra 版本是

3.11.3

当我运行 nodetool status 时,我可以看到集群上的机器,但是它显示的是 Azure VNetwork 上的本地 IP 地址,而不是它们的公共 IP 地址。我不确定这是否正确?

Datacenter: dc1europe
=====================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address   Load       Tokens       Owns (effective)  Host ID                               Rack
DN  10.1.0.7  101.37 KiB  256          32.8%             617d3f87-cb04-4c29-9e0c-e2c712487ad5  rack1europe
UN  10.1.0.6  158.26 KiB  256          33.1%             b79a1aa0-a049-46f2-8efc-679d10a097e2  rack1europe
DN  10.1.0.9  101.36 KiB  256          34.2%             58a101e5-51f2-491e-833f-cc5c49a8740a  rack1europe

我可以使用 cqlsh Internal IP Address 连接到任何机器,但是当我使用 cqlsh Public IP Address 时出现以下错误:

Connection error: ('Unable to connect to any servers', {'XX.XXX.XXX.XXX': error(None, "Tried connecting to [('XX.XXX.XXX.XXX', 9042)]. Last error: timed out")})

当我运行 netstat -vatn 时,它显示我的机器实际上正在侦听端口 9042,但我再次不确定这是否正确:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:9042            0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 10.1.0.6:7000           0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:42271         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:7199          0.0.0.0:*               LISTEN
tcp        0     64 10.1.0.6:22             109.76.85.23:51728      ESTABLISHED
tcp6       0      0 :::22                   :::*                    LISTEN

我可以使用当前在集群上登录的计算机的公共 IP 地址进行远程登录,但是当我尝试使用集群上另一台计算机的公共 IP 地址进行远程登录时,我得到以下信息:

Trying XX.XXX.XXX.XXX...

但永远不会建立连接。

这是我为集群上所有三个节点编辑的 cassandra.yaml 文件中的相关设置

seed_provider:
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
      parameters:
          - seeds: "10.1.0.6, 10.1.0.7"

listen_address:

# broadcast_address: 1.2.3.4

start_rpc: false

rpc_address: 0.0.0.0

broadcast_rpc_address: <PUBLIC IP OF CURRENT NODE>

我已在 azure 中编辑了 NSG,以允许所有必需的入站端口,包括 7000、7001、7199、9042、9160、9142,所以这应该不是问题。

我不确定问题出在我的 Azure VM/网络配置还是我的 Cassandra 设置上。任何指示或帮助都会很棒!

谢谢。

【问题讨论】:

    标签: azure cassandra


    【解决方案1】:

    我的设置。

    Windows VM 作为网络服务器

    Ubuntu 作为 Cassandra 节点。

    在同一个订阅和不同的资源组和 VNET 中。

    用于从 Windows 机器连接到 Cassandra。

    按照这些步骤,它工作:)

    1) 对等 VNet。这必须在两个 vnet 上完成。最初我无法从 Windows VM ping Ubuntu VM,在对等之后我能够 ping。

    2) 在 Cassandra VM 上打开 9042 端口,可以对 Webserver 的地址范围进行限制。

    3) 在 Ubuntu VM 中编辑 etc/cassandra/cassandra.yaml 并更改以下设置。 IP 是 Ubuntu 虚拟机的私有 IP 地址

    1) rpc_address: 10.0.1.5
    2) listen_address: 10.0.1.5
    3) seeds: "10.0.1.5"
    

    4) 现在尝试使用任何测试应用程序从 Web 服务器连接到 cassandra。

    例如

                var cluster = Cluster.Builder()
                     .AddContactPoints("10.0.1.5")
                     .WithPort(9042)
                     .WithAuthProvider(new PlainTextAuthProvider("cassandra", "cassandra"))
                     .Build();
                ISession session = cluster.Connect();
    

    您应该能够连接和运行语句。

    干杯,

    赫曼特

    【讨论】:

      【解决方案2】:

      根据您的描述,这听起来像是 Nat Forwarding/Endpoint。我假设它是一个经典的部署,所以下面是查看 Endpoints 的信息。

      https://docs.microsoft.com/en-us/azure/virtual-machines/linux/classic/setup-endpoints

      【讨论】:

      • 您好,感谢您的回答,我相信这是使用 Azure 资源管理器创建的。有一个从我创建的 cassandra VM 映像创建的虚拟机规模集。我从这个图像创建了一个三节点规模集。规模集中的每台计算机都是同一虚拟网络的一部分。该子网附加到一个网络安全组,我尝试按照docs.microsoft.com/en-us/azure/virtual-machines/linux/… 打开特定端口
      • 如果是ARM,那么它位于负载均衡器后面,您需要在负载均衡器上设置NAT规则。
      • 没有负载均衡器,因为这似乎违背了 Cassandra 使用的概念。每个 VM 实例都有自己的公共 IP 地址。但是,我现在似乎能够使用集群外部的一个虚拟机公共 IP 连接到集群,而无需更改上述任何设置。也许 NSG 规则需要一些时间才能生效,或者我的家庭网络以某种方式阻止了对特定端口的出站请求。感谢您的帮助汉内尔。
      猜你喜欢
      • 2011-08-08
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 2020-07-24
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多