我设法在Microsoft Azure中设置了一个Cassandra集群 . 目前,群集在Azure中的2个VM上包含2个节点 . 我一直在使用OpsCenter来检查集群的状态,一切看起来都很有希望 . 但是我已经为集群创建了一个简单的C#测试客户端,使用DataStax 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秒才能执行查询 . 我认为它与使用cassandra.yaml设置在Azure中构建的Load Balancer有关 .
我还注意到集群正在返回2个IP . 一个是集群的外部ip,另一个是一个特定节点的内部ip,当然无法从外部访问 .
This is our setup:
端口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 Yaml
监听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结束 .
1 回答
虽然很难仅根据这些细节来调查性能问题,但这里有几个问题/评论:
您的客户端在哪里运行?
Cassandra节点之间以及从客户端机器到C *节点之间的ping时间是多少?
您实际上不需要端口9042上的负载均衡器,因为驱动程序可以自己进行负载均衡 .
通常你应该通过使用预准备语句看到一些改进