2013-10-04 93 views
0

我已經設法在Microsoft Azure中設置Cassandra集羣。目前,Azure中的2個虛擬機上包含2個節點。我一直在使用OpsCenter來檢查羣集的狀態,並且一切都看起來很有前景。不過,我已經爲集羣創建了一個簡單的C#測試客戶端,使用DataStax C#Driver連接到實際正在工作但真的非常慢的集羣。使用DataStax C#驅動程序執行Cassandra的速度緩慢

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,當然這是從外部無法訪問的。

這是我們的設置:在端口9042上的端口

負載平衡器9160

卡桑德拉節點1與外部IP 66.55.44.33有內部IP 33.44.33.44

負載平衡器

cassandra-node2與外部IP 66.55.44.33與內部IP 11.22.11.22

卡桑德拉YAML

監聽地址卡桑德拉節點1:33.44.33.44 RPC地址卡桑德拉節點1:33.44.33.44

監聽地址卡桑德拉節點2:11.22.11.22 RPC地址cassandra- node2:11.22.11.22

有時候,程序在執行查詢時甚至會以WriteTimeoutException結束。

+0

什麼是你的ping時間,無論你正在運行的代碼卡桑德拉節點有所改善? 10秒顯然是不合理的,我沒有看到你的代碼有什麼問題。 –

回答

0

雖然這是很難僅僅基於這些細節尋找到一個性能問題,這裏有幾個問題/評論:

  1. 哪裏是你的客戶端運行?
  2. Cassandra節點之間以及從客戶端機器到C *節點之間的ping時間是多少?
  3. 實際上,您不需要端口9042上的負載平衡器,因爲驅動程序將能夠自行執行負載平衡。
  4. 通常你應該看到通過使用預處理語句
+0

當羣集處於Azure中時,客戶端從我的家庭網絡運行。我無法ping Azure虛擬機,所以我真的不知道在這個問題上的響應時間。最奇怪的是,代碼實際上工作,但真的很低調。 – parek

+0

嘗試在Azure中設置客戶端以排除外部接口上的問題。 – jbellis

+0

您可以通過使用psping和ping您已暴露的端點端口來ping通天藍虛擬機。或者你可以設置一個實例ip和ping,因爲它將直接指向虛擬機,而不是雲服務本身。 – KingOfHypocrites

相關問題