我們正試圖在標準VPC足跡(專用子網上的cassandra節點)上的AWS/EC2上運行cassandra集羣。因爲這是AWS,所以EC2實例始終有可能終止或重新啓動而不會發出警告。我一直在一個測試集羣上模擬這個案例,並且我看到了集羣想要阻止的事情。特別是如果某個節點重新引導某些數據,將暫時缺失,直到該節點完成其重新引導。如果一個節點終止,則看起來有些數據永遠丟失。當節點重新啓動或終止時,Hector無法讀取Cassandra數據
對於我的測試,我只是做了一堆寫入(使用QUORUM一致性)到一些密鑰空間,然後詢問這些密鑰空間的內容,因爲我關閉節點(通過重新啓動或終止)。我只是使用cqlsh SELECT來使用ONE一致性級別來執行羣集的keyspace/column family詢問。
請注意,儘管我在執行時沒有對羣集執行寫入操作,但SELECT行在重新引導時暫時消失,並可能在終止時永久丟失。
我以爲Netflix Priam可能會提供幫助,但遺憾的是,在上次檢查時,它不適用於VPC。
另外,因爲我們使用的是臨時存儲實例,所以沒有相應的「關閉」,因此在實例重啓/終止期間,無法運行任何腳本以在實例消失之前執行nodetool decommission
或nodetool 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
我很確定這不是一致性問題。我已將更多信息添加到我的原始帖子中。請隨時在「更多信息」添加7/19標題下看到詳細信息。 – jspyeatt
據此編輯答案。 – jbellis
我得給這個鏡頭。這將需要一些返工,看看事情進展。謝謝您的幫助。 – jspyeatt