2013-05-02 70 views
4

我在我的機器上使用Cassandra 1.2.4(Windows 7)。HUnavailableException:可能沒有足夠的副本來處理一致性級別

我的DC1中有3個節點,在我的機器上。我只使用一個DC(我的機器)。我確實保留了複製因子= 2和「HConsistencyLevel.ONE」。但是,如果其中一個節點關閉,並且我試圖讀取或寫入數據庫,則會出現錯誤 - 「可能沒有足夠的副本來處理一致性級別」。 我的印象是,當我們將一致性級別保持爲「ONE」並且即使一個節點啓動時,寫入/讀取也應該沒有錯誤地發生。但是我得到這個錯誤。有人能糾正我,因爲我在這裏做錯了。我在谷歌搜索,但沒有得到有關這個錯誤很多的幫助,雖然這個錯誤是非常相關的。我希望在發生節點故障時進行讀/寫操作。以下是我的代碼。

String keySpaceName="kspace"; 
String clusterName="Test Cluster"; 
String columFamilyName="ktable"; 
String host="127.0.0.1:9160,127.0.0.2:9161,127.0.0.3:9162"; 
int replicationFactor=2; 

CassandraHostConfigurator cassandraHostConfigurator = new 
CassandraHostConfigurator(host); 
Cluster cluster = HFactory.getOrCreateCluster(clusterName,cassandraHostConfigurator); 
KeyspaceDefinition keyspaceDef = cluster.describeKeyspace(keySpaceName); 

ConfigurableConsistencyLevel configurableConsistencyLevel = new 
ConfigurableConsistencyLevel(); 
Map<String, HConsistencyLevel> clmap = new HashMap<String, HConsistencyLevel>(); 

// Define CL.ONE for ColumnFamily "ktable" 
clmap.put(columFamilyName, HConsistencyLevel.ONE); 
configurableConsistencyLevel.setReadCfConsistencyLevels(clmap); 
configurableConsistencyLevel.setWriteCfConsistencyLevels(clmap); 

if(keyspaceDef==null) 
{ 
KeyspaceDefinition newKeyspace = HFactory.createKeyspaceDefinition(
keySpaceName, ThriftKsDef.DEF_STRATEGY_CLASS,replicationFactor, null); 
cluster.addKeyspace(newKeyspace, true); 
} 
Keyspace keyspace = HFactory.createKeyspace(keySpaceName, cluster, 
configurableConsistencyLevel); 

StringSerializer ss = StringSerializer.get(); 
ColumnFamilyTemplate<String, String> cft = new ThriftColumnFamilyTemplate<String, 
String>(keyspace, columFamilyName, ss, ss); 
ColumnFamilyUpdater<String, String> updater = cft.createUpdater("xkey"); 
UUID uid = new UUID(); 
updater.setValue("id",Long.toString(uid.getClockSeqAndNode()),ss); 
updater.setValue("name", "Catherine", ss); 
updater.setValue("state", "GA", ss); 
cft.update(updater); 
+0

您可以粘貼'show schema;'的模式輸出嗎?在cassandra-cli?在您的腳本運行復制因子1之前是否可以創建密鑰空間? – Richard 2013-05-03 10:07:35

+1

@理查德 - 感謝您的回覆。我在代碼執行前創建了具有複製因子「2」的密鑰空間。 使用placement_strategy ='SimpleStrategy'創建密鑰空間kspace 和strategy_options = {replication_factor:2} and durable_writes = true; 我的問題是 - 即使在節點故障的情況下,我怎樣才能成功地將數據寫入/讀取到cassandra。任何幫助將不勝感激。 關心, 基蘭。 – Kiran 2013-05-03 23:36:52

+0

對我的問題的任何建議將不勝感激。 – Kiran 2013-05-08 21:41:45

回答

0

嘗試改變複製因子等於沒有在羣集可用的節點...它從這類故障生存....在我和RF = 5的例子中,5個節點的集羣可以存活2節點故障,與RF = 4,5節點集羣可以承受1節點故障,RF = 3,5節點集羣可以僅倖免1節點故障....

我不確定這種方法是否有效,但這應該工作總是(即RF =沒有節點)任何建議從專家將不勝感激...

1

更改您的複製因子爲1,即您設置的節點的數量。我在練習這些例子時遇到了同樣的錯誤。

相關問題