0

我已经设法在 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 结束。

4

1 回答 1

0

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

  1. 您的客户从哪里运行?
  2. Cassandra 节点之间以及从客户端机器到 C* 节点之间的 ping 时间是多少?
  3. 您实际上不需要端口 9042 上的负载平衡器,因为驱动程序将能够自己进行负载平衡。
  4. 通常,您应该通过使用准备好的语句看到一些改进
于 2013-10-04T18:49:45.927 回答