c# - 如何连接到 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和traceroute。
注2:我已经测试了用户名和密码,直接在服务器上尝试可以登录cassandra服务器,没有任何问题。
注 3:Cassandra 在我今天刚刚创建的 VM 中运行。VM 是运行代码的主机上的来宾机器。
注 4:Host OS 和 Guest OS 都是 Linux。
解决方案
.AddContactPoint("127.0.0.1")
如果这在同一台机器上有效,那么您可能已将 Cassandra绑定到该 IP。如果您需要远程连接到您的节点,则需要将可路由 IP 绑定到该节点。
运行一个nodetool status
. 如果您看到集群状态显示您的节点的 IP 为 127.0.0.1,那么从本地计算机连接到本地计算机是唯一可行的方案。
尝试在您的节点上运行以下命令:
grep _address cassandra.yaml
输出中返回的 IP 地址是唯一允许应用程序连接的 IP 地址。如果您希望能够连接到 192.168.0.18,则listen
andrpc
地址应如下所示:
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
但请先尝试设置listen
和设置rpc
为 192.168.0.18。
编辑 20191022
只是想仔细检查一下,我是否将 192.168.0.18 作为listen_address 和 rpc_address 添加到 cassandra 节点的 IP 地址为 192.168.0.18 的 cassandra 节点?
是的。还要确保您的节点的种子列表设置如下:
- seeds: "192.168.0.18"
在我这样做之前,listen_address 和 rpc_address 的值被设置为 localhost
我是这么想的。
但是,在做出您建议的更改后,nodetool status 现在给了我
Failed to connect to 127.0.0.1:7199 - connection refused
具有讽刺意味的是,这与当 Cassandra 未运行时 nodetool 返回的消息相同。此时我会检查系统日志,看看它是否返回可能阻止它启动的错误。我怀疑种子列表仍然显示“127.0.0.1”。
tl;博士;
如果您打算远程连接到集群/节点,则不能使用将 Cassandra 绑定到主 IP (127.0.0.1/localhost) 的默认配置。这包括所有_address
设置以及您的seeds
列表。
推荐阅读
- authentication - 使用用户身份验证将数据从网络导入到谷歌表
- linux - 在 docker 容器中使用 quotactl 系统调用
- centos - 在 vagrant 中转发多个端口
- kotlin - 用于集合的 Kotlin DSL
- c++ - 乘以整数的持久性
- laravel-5.7 - “找不到类'Maatwebsite\Excel\Facades\Excel'”问题
- python - 为什么我的小部件没有显示在第三个屏幕上
- java - 创建一个具有自己唯一名称的新对象
- rust - 打开的图像作为全局变量?
- docker - 如何在容器之间连接docker-compose内的socket.io