我已经设法在 Microsoft Azure 中设置了 Cassandra 集群。目前,该群集在 Azure 中的 2 个 VM 上包含 2 个节点。我一直在使用 OpsCenter 检查集群的状态,一切看起来都很有希望。但是,我使用 DataStax C# 驱动程序为集群创建了一个简单的 C# 测试客户端,以连接到实际工作但真的很慢的集群。
static class SimpleClient
{
private static Session _session;
public static Session Session
{
get
{
return _session;
}
}
private static Cluster _cluster;
public static Cluster Cluster
{
get
{
return _cluster;
}
}
public static void Connect(String node)
{
Console.WriteLine("Connecting to " + node);
_cluster = Cluster.Builder().AddContactPoint(node).Build();
_session = _cluster.Connect();
Metadata metadata = _cluster.Metadata;
Console.WriteLine("Connected to cluster: " + metadata.ClusterName.ToString());
}
public static void Close()
{
_cluster.Shutdown();
}
public static void CreateTable()
{
Console.WriteLine("Creating table with name test1");
_session.Execute(" CREATE TABLE kstt.test1 ( identifier text PRIMARY KEY, name text ); ");
Console.WriteLine("Table created with name test1");
}
public static void InsertToTable()
{
Console.WriteLine("Inserting data into test1");
_session.Execute(" INSERT INTO kstt.test1 ( identifier, name ) VALUES ( '" + "hello" + "', '" + "man" + "' );");
Console.WriteLine("Data inserted into test1");
}
public static void ReadFromTable(int times)
{
Console.WriteLine("Reading data from test1");
for (int i = 0; i < times; i++)
{
RowSet results = _session.Execute(" SELECT * FROM kstt.test1; ");
foreach (CqlColumn cqlColumn in results.Columns)
{
Console.WriteLine("Keyspace: " + cqlColumn.Keyspace + " # Table: " + cqlColumn.Table + " # Name: " + cqlColumn.Name);
}
}
Console.WriteLine("Data was read from test1");
}
public static void DropTable()
{
Console.WriteLine("Dropping table test1");
try
{
_session.Execute(" DROP TABLE kstt.test1; ");
}
catch { }
Console.WriteLine("Dropped table test1");
}
}
这段代码确实有效。但它非常慢,连接大约需要 10 秒,执行查询大约需要 10 秒。我认为这与 Azure 中内置的负载均衡器以及 cassandra.yaml 设置有关。
我还注意到集群返回 2 个 IP。一个是集群的外部 ip,另一个是一个特定节点的内部 ip,当然从外部无法访问。
这是我们的设置:
端口 9042 上的负载均衡器
端口 9160 上的负载均衡器
cassandra-node1 与外部 ip 66.55.44.33 与内部 ip 33.44.33.44
cassandra-node2,外部 ip 66.55.44.33,内部 ip 11.22.11.22
卡桑德拉·亚姆
cassandra-node1 的监听地址:33.44.33.44 cassandra-node1 的 RPC 地址:33.44.33.44
cassandra-node2 的监听地址:11.22.11.22 cassandra-node2 的 RPC 地址:11.22.11.22
有时程序在执行查询时甚至会以 WriteTimeoutException 结束。