首页 文章

使用DataStax C#驱动程序缓慢执行Cassandra的时间

提问于
浏览
0

我设法在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 回答

  • 0

    虽然很难仅根据这些细节来调查性能问题,但这里有几个问题/评论:

    • 您的客户端在哪里运行?

    • Cassandra节点之间以及从客户端机器到C *节点之间的ping时间是多少?

    • 您实际上不需要端口9042上的负载均衡器,因为驱动程序可以自己进行负载均衡 .

    • 通常你应该通过使用预准备语句看到一些改进

相关问题