2013-05-09 41 views
1

我最近開始在我們的Production environment中使用Cassandra。我們有24 node clusterreplication factor of 4。含義2 copies將在each datacenter。因此,這意味着我們有一個單一的跨色碼羣集24 nodes,這意味着12 nodes in SLC colo12 nodes in PHX coloastyanax僅支持本地節點的自動發現模式嗎?

我使用Astyanax client來寫入數據在Cassandra database。現在我試圖弄清楚Astyanax client有沒有什麼辦法可以找出所有的nodes in the PHX colo or SLC colo而不是所有的節點?

在我的setSeeds方法中,我將通過僅與one datacenter相關的節點。它將是SLC或PHX。所以,如果你看看我的下面的代碼,我已經在我的setSeeds method中指定了2個節點,並且所有這些節點都屬於PHX colo。現在我試圖啓用自動發現模式,但僅限於特定的顏色。所以在我的情況下,它應該能夠檢測PHX colo的12個節點,而不是所有的24個節點。

下面是我的代碼中,我使用ConnectionPoolType作爲TOKEN_AWARE它默認使用NodeDiscoveryType作爲RING_DESCRIBE那會告訴我所有的24 nodes相當於兩個colos/datacenter,這就是我不想要什麼。我需要讓每個colo/datacenter對應的所有節點

任何想法如何使用Astyanax客戶端實現這種情況?這可能嗎?

private CassandraAstyanaxConnection() { 

    context = new AstyanaxContext.Builder() 
    .forCluster(ModelConstants.CLUSTER) 
    .forKeyspace(ModelConstants.KEYSPACE) 
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool") 
     .setPort(9160) 
     .setMaxConnsPerHost(40) 
     .setSeeds("cdb03.vip.phx.host.com:9160,cdb04.vip.phx.host.com:9160") 
    ) 
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()  
     .setCqlVersion("3.0.0") 
     .setTargetCassandraVersion("1.2") 
     .setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE)) 
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor()) 
    .buildKeyspace(ThriftFamilyFactory.getInstance()); 

    context.start(); 
    keyspace = context.getEntity(); 

    emp_cf = ColumnFamily.newColumnFamily(
     ModelConstants.COLUMN_FAMILY, 
     StringSerializer.get(), 
     StringSerializer.get()); 
} 

在短期確實只有本地節點astynanx支持自動發現?

爲什麼我問這是因爲RING_DESCRIBE,它會給我所有的節點都來自colo。所以假設如果我從PHX colo運行我的程序,那麼它可能會去SLC colo來獲取數據,並且因爲我看到非常差的寫入性能,因爲PHX和SLC之間的ping時間爲15-20毫秒。

回答

2

隨着NodeDiscoveryType RING_DESCRIBE(或TOKEN_AWARE沒有描述返回節點HostSupplier)Astyanax會發現所有節點,但你也應該使用setLocalDatacenter。使用ConnectionPoolConfigurationImpl設置AstyanaxContext時,使用setLocalDatacenter和所需的DC。這將確保來自其他DC的主機不在連接池中,並且您的請求是本地的。

.withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool") 
     .setPort(9160) 
     .setMaxConnsPerHost(40) 
     .setLocalDatacenter("DC1") 
     .setSeeds("127.0.0.1:9160") 
    ) 

再次,我的理解是TOKEN_AWARE的NodeDiscoveryType(沒有HostSupplier組)或RING_DESCRIBE都將結果在RingDescribeHostSupplier被內Astyanax使用。因此,Astyanax將「知道」所有節點,但連接池將被限制(通過setLocalDatacenter)到指定的DC。

0

嘗試用NodeDiscoveryType.TOKEN_AWARE,如從astyanax文檔可以說,這是desgined用於多區域環形容問題,其中環從其他區域或數據中心

+0

我已經試過這個,但它總是給我所有數據中心的所有節點。 – ferhan 2013-05-09 16:54:12