2015-04-07 93 views
2

我正在研究卡桑德拉超過2個星期只是有相同的全面掌握。我幾乎讀過關於卡桑德拉的所有網絡,但仍不清楚一些概念。以下是: -卡桑德拉數據同步問題

根據文檔: - 我們根據我們的查詢建模我們的列族。因此,我們需要事先了解我們的查詢,這在現實世界的場景中根本不可能。我們可以事先進行一定的查詢,這些查詢都隨時間而變化。因此,如果我基於以前的查詢設計了一個模型,那麼在我提出新的要求之後,我需要重新設計一個模型。當讀過一個SO線程在未來修復一個糟糕的Cassandra數據模型非常困難。對於如: - 我倒是具有領域user模型說

name, age,phone,imei,address, state,city,registration_type, created_at

目前,我需要(可以說)只有state過濾。我會做一個PK爲state。讓我們命名模型UserByState。 現在2-3個月後,我要求過濾created_at。現在我將創建一個型號爲UserByCreatedAt,PK爲created_at

現在有2個問題: -

a)如果我創建了一個新的模式時,要求進來,然後我需要將數據遷移到新的模式,也就是說,如果我創建了一個新的模式,我還需要在當前模型中包含以前的數據。因此,我需要將數據從UserByState遷移到UserByCreatedAt,即我需要編寫一個腳本將數據從UserByState複製到UserByCreatedAt糾正我,如果我錯了!

如果還有其他新的過濾要求出現,我將創建新模型,然後遷移等。 b)要根據查詢手動創建模型,我需要保持數據同步,即在上述用戶的情況下,我爲2個查詢創建了2個模型。

UserByStateUserByCreatedAt

所以,做我需要辦理2個不同的編寫查詢??,即

UserByState.create(row = value,......) 
UserByCreatedAt.create(row = value,......) 

而且如果我有其他機型,如 'UserByGender' 等。我是否需要手動將不同的寫入查詢應用於不同的模型?或者它是否獨立發生?保持數據同步的問題出現了。

回答

1

在分佈式系統中沒有免費的午餐,您已經達到了一些關鍵的侷限性。

如果您想要水平擴展的非常高效的寫入操作,最終不得不在數據庫的其他部分做出讓步。 Cassandra選擇犧牲查詢模式的靈活性來確保快速訪問定義好的查詢模式。

當大多數用戶遇到需要非常不同且頻繁的查詢模式的情況時,他們會構建第二個表並一次更新。爲了獲得多表寫操作的原子性,可以使用記錄的批處理來確保所有的數據都被寫入或者沒有。記錄的批次增加了成本,所以這仍然是另一個兼顧性能的折衷。除此之外,正常的一致性水平權衡仍然適用。

將數據從舊錶移動到新表Hadoop/Spark是很好的選擇。這些是基於批處理的系統,因此它們不會提供低延遲,但是對於一次性使用非常有用,例如使用新索引和cronjob操作重建表。