2013-07-18 58 views
1

我們正試圖在標準VPC足跡(專用子網上的cassandra節點)上的AWS/EC2上運行cassandra集羣。因爲這是AWS,所以EC2實例始終有可能終止或重新啓動而不會發出警告。我一直在一個測試集羣上模擬這個案例,並且我看到了集羣想要阻止的事情。特別是如果某個節點重新引導某些數據,將暫時缺失,直到該節點完成其重新引導。如果一個節點終止,則看起來有些數據永遠丟失。當節點重新啓動或終止時,Hector無法讀取Cassandra數據

對於我的測試,我只是做了一堆寫入(使用QUORUM一致性)到一些密鑰空間,然後詢問這些密鑰空間的內容,因爲我關閉節點(通過重新啓動或終止)。我只是使用cqlsh SELECT來使用ONE一致性級別來執行羣集的keyspace/column family詢問。

請注意,儘管我在執行時沒有對羣集執行寫入操作,但SELECT行在重新引導時暫時消失,並可能在終止時永久丟失。

我以爲Netflix Priam可能會提供幫助,但遺憾的是,在上次檢查時,它不適用於VPC。

另外,因爲我們使用的是臨時存儲實例,所以沒有相應的「關閉」,因此在實例重啓/終止期間,無法運行任何腳本以在實例消失之前執行nodetool decommissionnodetool removenode。終止等同於將插頭踢出牆壁。

由於我使用的複製因子爲3並且仲裁/寫入應該表示所有數據都被寫入至少2個節點。所以,除非我完全誤解了一些事情(這是可能的),當我使用一致性級別ONE進行讀取時,丟失一個節點並不意味着我在任何時間段都會丟失任何數據。

問題

爲什麼不與三部作品的複製因子6節點羣集?

我是否需要運行類似12複製因子爲7的節點羣集?不要打擾告訴我,這將解決問題,因爲它不會。

我是否需要在寫入時使用ALL的一致性級別,然後在讀取上使用ONE或QUORUM?

虛擬節點有什麼不太正確的嗎?不太可能

是否有nodetool命令除了removenode,我需要運行時節點終止恢復丟失的數據?正如前面提到的那樣,當重啓發生時,最終丟失的數據會再次出現。

有沒有一些卡桑德拉專家可以看看我的cassandra.yaml文件,併發送我的救贖之路?

更多信息添加7/19

我不認爲這是一個QUORUM VS ONE VS全是問題。我設置的測試在列族的初始羣體之後不執行對密鑰空間的寫操作。因此,數據有足夠的時間(小時),以便按照複製因子的要求將其傳送到所有節點。另外,測試數據集非常小(2列家族,每個值大約有300-1000個值)。換句話說,數據是完全靜態的。

我看到的行爲似乎與ec2實例不在網絡中的事實有關。我之所以這樣說是因爲如果我登錄到一個節點,只是做一個cassandra stop我看到沒有數據丟失。但是,如果我重新啓動或終止,我開始在堆棧跟蹤中獲得以下內容。

CassandraHostRetryService - Downed Host Retry service started with queue size -1 and retry delay 10s 
CassandraHostRetryService - Downed Host retry shutdown complete 
CassandraHostRetryService - Downed Host retry shutdown hook called 
Caused by: TimedOutException() 
Caused by: TimedOutException() 

所以它似乎更多的是網絡通信問題的集羣期待,例如10.0.12.74,是在網絡上已經加入羣集後。如果由於重新啓動或終止而突然無法訪問該IP,則會發生超時。

當我在所有三種情況下(cassandra stop,重新啓動或終止)執行nodetool status時,節點的狀態顯示爲DN。這是你所期望的。最終nodetool status將返回到聯合國cassandra start或重新啓動,但顯然終止始終保持DN。我的配置

這裏的

細節是我配置的一些細節(cassandra.yaml在這個帖子底部):

節點處於VPC的專用子網運行。

帶有num_tokens的Cassandra 1.2.5:256(虛擬節點)。 initial_token :(空白)。我真的希望這是有效的,因爲我們所有的節點都運行在自動調整組中,因此可以動態處理重新分配的想法是有吸引力的。

EC2 m1.在每個可用區中放大一個種子和一個非種子節點。 (所以在集羣中共有6個節點)。

臨時存儲,而不是EBS。

Ec2Snitch與NetworkTopologyStrategy和所有keyspaces有被auto_bootstraped 3.

非種子節點的複製因子,種子節點都沒有。

樣本cassandra.yaml文件

cluster_name: 'TestCluster' 
num_tokens: 256 
initial_token: 
hinted_handoff_enabled: true 
max_hint_window_in_ms: 10800000 
hinted_handoff_throttle_in_kb: 1024 
max_hints_delivery_threads: 2 
authenticator: org.apache.cassandra.auth.AllowAllAuthenticator 
authorizer: org.apache.cassandra.auth.AllowAllAuthorizer 
partitioner: org.apache.cassandra.dht.Murmur3Partitioner 
disk_failure_policy: stop 
key_cache_size_in_mb: 
key_cache_save_period: 14400 
row_cache_size_in_mb: 0 
row_cache_save_period: 0 
row_cache_provider: SerializingCacheProvider 
saved_caches_directory: /opt/company/dbserver/caches 
commitlog_sync: periodic 
commitlog_sync_period_in_ms: 10000 
commitlog_segment_size_in_mb: 32 
seed_provider: 
- class_name: org.apache.cassandra.locator.SimpleSeedProvider 
parameters: 
- seeds: "SEED_IP_LIST" 
flush_largest_memtables_at: 0.75 
reduce_cache_sizes_at: 0.85 
reduce_cache_capacity_to: 0.6 
concurrent_reads: 32 
concurrent_writes: 8 
memtable_flush_queue_size: 4 
trickle_fsync: false 
trickle_fsync_interval_in_kb: 10240 
storage_port: 7000 
ssl_storage_port: 7001 
listen_address: LISTEN_ADDRESS 
start_native_transport: false 
native_transport_port: 9042 
start_rpc: true 
rpc_address: 0.0.0.0 
rpc_port: 9160 
rpc_keepalive: true 
rpc_server_type: sync 
thrift_framed_transport_size_in_mb: 15 
thrift_max_message_length_in_mb: 16 
incremental_backups: true 
snapshot_before_compaction: false 
auto_bootstrap: AUTO_BOOTSTRAP 
column_index_size_in_kb: 64 
in_memory_compaction_limit_in_mb: 64 
multithreaded_compaction: false 
compaction_throughput_mb_per_sec: 16 
compaction_preheat_key_cache: true 
read_request_timeout_in_ms: 10000 
range_request_timeout_in_ms: 10000 
write_request_timeout_in_ms: 10000 
truncate_request_timeout_in_ms: 60000 
request_timeout_in_ms: 10000 
cross_node_timeout: false 
endpoint_snitch: Ec2Snitch 
dynamic_snitch_update_interval_in_ms: 100 
dynamic_snitch_reset_interval_in_ms: 600000 
dynamic_snitch_badness_threshold: 0.1 
request_scheduler: org.apache.cassandra.scheduler.NoScheduler 
index_interval: 128 
server_encryption_options: 
internode_encryption: none 
keystore: conf/.keystore 
keystore_password: cassandra 
truststore: conf/.truststore 
truststore_password: cassandra 
client_encryption_options: 
enabled: false 
keystore: conf/.keystore 
keystore_password: cassandra 
internode_compression: all 

回答

1

我認爲http://www.datastax.com/documentation/cassandra/1.2/cassandra/dml/dml_config_consistency_c.html將清理了很多本。特別是,QUORUM/ONE是而不是保證返回最新的數據。 QUORUM/QUORUM是。 ALL/ONE也是如此,但這對寫作失敗是不容許的。

編輯一起去新的信息:

CassandraHostRetryService是赫克託的一部分。我假設你正在用cqlsh進行測試,就像一個理智的人一樣。教訓:測試

  • 使用DataStax Java Driver用於構建應用程序,這是更快,更容易使用,並且有更深入的瞭解比赫拜本地協議它是建立在羣集狀態

    1. 使用cqlsh。
  • +0

    我很確定這不是一致性問題。我已將更多信息添加到我的原始帖子中。請隨時在「更多信息」添加7/19標題下看到詳細信息。 – jspyeatt

    +0

    據此編輯答案。 – jbellis

    +0

    我得給這個鏡頭。這將需要一些返工,看看事情進展。謝謝您的幫助。 – jspyeatt