如何连接到Cassandra VM

时间:2019-10-19 18:32:07

标签: c# .net .net-core cassandra

如果Cassandra和代码在同一台机器上,则以下代码有效:

using System;
using Cassandra;

namespace CassandraInsertTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var cluster = Cluster.Builder()
            .AddContactPoint("127.0.0.1")
            .Build();

            var session = cluster.Connect("test_keyspace");

            session.Execute("INSERT INTO test_table (id, col1, col2) VALUES (1, 'data1', 'data2')");

            Console.WriteLine($"Finished");
            Console.ReadKey();
        }
    }
}

如果代码位于一台计算机上,而cassandra位于另一台计算机上(假设IP地址不同),是否需要用户名和密码?所以我尝试了:

        var cluster = Cluster.Builder()
        .AddContactPoint("192.168.0.18") <- the ip address for the cassandra node
        .WithPort(9042)
        .WithCredentials("username to log into the cassandra node","password to log into the cassandra node")
        .Build();

我收到以下错误消息:

userone@desktop:~/Desktop/vsc$ dotnet run
Unhandled exception. Cassandra.NoHostAvailableException: All hosts tried for query failed (tried 192.168.0.18:9042: SocketException 'Connection refused')
   at Cassandra.Connections.ControlConnection.Connect(Boolean isInitializing)
   at Cassandra.Connections.ControlConnection.InitAsync()
   at Cassandra.Tasks.TaskHelper.WaitToCompleteAsync(Task task, Int32 timeout)
   at Cassandra.Cluster.Cassandra.SessionManagement.IInternalCluster.OnInitializeAsync()
   at Cassandra.ClusterLifecycleManager.InitializeAsync()
   at Cassandra.Cluster.Cassandra.SessionManagement.IInternalCluster.ConnectAsync[TSession](ISessionFactory`1 sessionFactory, String keyspace)
   at Cassandra.Cluster.ConnectAsync(String keyspace)
   at Cassandra.Tasks.TaskHelper.WaitToComplete(Task task, Int32 timeout)
   at Cassandra.Tasks.TaskHelper.WaitToComplete[T](Task`1 task, Int32 timeout)
   at Cassandra.Cluster.Connect(String keyspace)
   at HelloWorld.Program.Main(String[] args) in /home/userone/Desktop/vsc/Program.cs:line 17
userone@desktop:~/Desktop/vsc$ 

该节点(cassandra服务器)上的iptables当前设置如下:

node1@node1:~$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A IMPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 192.168.0.73/32 -p tcp -m multiport --dports 7000,7001,7199,9042,9160,9142 -m state --state NEW,ESTABLISHED -j ACCEPT
node1@node1:~$

注意1:安装了该应用程序的计算机和安装了cassandra的计算机都可以在两个方向上ping和跟踪路由。

注2:我已经测试了用户名和密码,并且可以直接在cassandra服务器上尝试直接登录而没有任何问题。

注3:Cassandra在我今天创建的VM中运行。 VM是运行代码的主机上的来宾计算机。

注4:主机操作系统和来宾操作系统均为Linux。

3 个答案:

答案 0 :(得分:4)

.AddContactPoint("127.0.0.1")

如果这是同一台计算机上的工作,则可能是Cassandra 绑定到该IP。如果需要远程连接到节点,则需要将可路由的IP绑定到该节点。

运行nodetool status。如果您看到群集状态显示IP为127.0.0.1的节点,则将连接到本地计算机是唯一会 工作。

尝试在您的节点上运行以下命令:

grep _address cassandra.yaml

输出中返回的IP地址是允许应用程序连接的唯一地址。如果您希望能够连接到192.168.0.18,则listenrpc地址应如下所示:

listen_address: 192.168.0.18
rpc_address: 192.168.0.18

请注意,您也需要更改seeds列表。

此外,如果您使用的虚拟机/提供商同时具有内部和外部IP地址,则还需要将broadcast_地址设置为外部IP:

broadcast_address: 10.6.5.5
broadcast_rpc_address: 10.6.5.5
listen_address: 192.168.0.18
rpc_address: 192.168.0.18

但是请尝试先仅将listenrpc设置为192.168.0.18。

编辑20191022

  

只是想仔细检查一下,我是否将192.168.0.18作为listen_address和rpc_address添加到cassandra节点(其中cassandra节点的IP地址为192.168.0.18)?

是的。还要确保节点的种子列表设置如下:

- seeds: "192.168.0.18"
  

在此之前,将listen_address和rpc_address的值设置为localhost

我是这样认为的。

  

但是,在进行了建议的更改后,nodetool的状态现在为我提供了

Failed to connect to 127.0.0.1:7199 - connection refused
具有讽刺意味的是,与Cassandra不运行时,nodetool返回的消息相同。在这一点上,我将检查系统日志,看看它是否返回错误,可能阻止它启动。我怀疑种子列表仍显示为“ 127.0.0.1”。

tl; dr;

如果打算远程连接到群集/节点,则不能使用将Cassandra绑定到本地IP(127.0.0.1/localhost)的默认配置。其中包括所有_address设置以及您的seeds列表。

答案 1 :(得分:1)

我建议使用telnet 192.168.0.18 9042之类的东西来测试网络是否针对此场景进行了正确配置。驱动程序引发的错误只是驱动程序无法连接到cassandra主机时返回的标准套接字错误。

答案 2 :(得分:0)

我没有使用Cassandra的经验,但是几乎所有的连接问题都与防火墙的配置,操作系统分布式和网络服务等有关。
 因此,如果在本地一切正常,则在完全确定源代码之前不要在源代码中进行任何更改。

 我建议先检查以下列表:

  • 检查所有服务器的防火墙配置
  • 检查是否所有必需的服务都在所有服务器上运行(搜索Cassandra是否依赖于任何服务)。
  • 检查网络防火墙和子网端口以及协议访问限制(如果存在)。
  • 检查Cassandra是否已完全正常运行并且可以在9042端口上正常工作。