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 秒かかります。cassandra.yamlの設定のうち、Azureに組み込まれているロードバランサーと関係があると思います。

また、クラスターが 2 つの IP を返していることにも気付きました。1 つはクラスターの外部 IP であり、もう 1 つは特定のノードの内部 IP であり、もちろん外部からは到達できません。

これが私たちのセットアップです:

ポート 9042 のロード バランサ

ポート 9160 のロード バランサ

外部 IP 66.55.44.33、内部 IP 33.44.33.44 の cassandra-node1

外部 IP 66.55.44.33、内部 IP 11.22.11.22 の cassandra-node2

カサンドラ・ヤムル

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 に答える