如何连接到Cassandra VM

osh*_*nen 6 .net c# cassandra .net-core

如果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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

假设如果代码在一台计算机上并且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();
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

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$ 
Run Code Online (Sandbox Code Playgroud)

节点(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:~$
Run Code Online (Sandbox Code Playgroud)

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

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

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

注4:主机OS和客户机OS均为Linux。

Aar*_*ron 5

.AddContactPoint("127.0.0.1")
Run Code Online (Sandbox Code Playgroud)

如果这在同一台机器上工作,那么你可能有 Cassandra 绑定到该 IP。如果您需要远程连接到您的节点,那么您需要将一个可路由的 IP 绑定到该节点。

运行一个nodetool status. 如果你看到一个显示为127.0.0.1的IP您的节点,然后连接您的群集状态本地机器本地机器是将唯一的方案以往的工作。

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

grep _address cassandra.yaml
Run Code Online (Sandbox Code Playgroud)

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

listen_address: 192.168.0.18
rpc_address: 192.168.0.18
Run Code Online (Sandbox Code Playgroud)

请注意,您需要更改您的 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
Run Code Online (Sandbox Code Playgroud)

但尝试设置只是 listenrpc为 192.168.0.18。

编辑 20191022

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

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

- seeds: "192.168.0.18"
Run Code Online (Sandbox Code Playgroud)

在我这样做之前,listen_address 和 rpc_address 的值被设置为 localhost

我是这么想的。

但是,在进行您建议的更改后,nodetool status 现在给了我

Failed to connect to 127.0.0.1:7199 - connection refused
Run Code Online (Sandbox Code Playgroud)

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

tl;博士;

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