我無法在卡桑德拉的虛擬分區鍵上找到太多內容,但是我能找到的東西往往與您應該完全避免它們的想法一致。虛擬的,我的意思是一個列,其唯一目的是爲所有行包含相同的值,從而將所有數據放在1個節點上,並給出最低可能的基數。例如:虛擬分區鍵總是不好?
dummy | id | name
-------------------------
0 | 01 | 'Oliver'
0 | 02 | 'James'
0 | 03 | 'Nicholls'
的問候,爲什麼你應該避免虛擬分區鍵的兩個要點是:
1)你的數據「熱點」而告終。一個節點上存儲了大量數據,因此該節點周圍的流量更多,並且您在集羣周圍的分佈很差。
2)分區空間是有限的。如果將所有數據放在一個分區上,最終將無法存儲更多數據。
我可以理解這些觀點,我同意你絕對想要避免這些情況,所以我把這個想法放在我的腦海裏,並試圖爲我的桌子考慮一個好的分區鍵。有問題的表存儲站點,並且在我們的系統中有兩種常見的表格查詢方式。請求單個站點或請求所有站點。
這使我處於一種尷尬的境地,因爲該表或者在沒有任何內容或站點ID的情況下被查詢,並且創建一個唯一的字段分區鍵會給我提供非常高的基數和高延遲請求所有請求站點。
因此,我決定只選擇一個任意的字段,它會給出相對較低的基數,即使它沒有反映數據如何被實際查詢,僅僅是因爲它比基數要麼過分高或過低。儘管這種方法也有問題。
我可以將我的數據分配到第x列,但我們有許多客戶,他們都以不同的方式使用我們的系統,因此1個客戶端的x可以給出我以後的結果,但可能給另一個客戶帶來可怕的結果。
在這一點上,我用盡了選擇。我需要一個表格中的字段,這個字段對於所有的客戶端都是一致的,但是這個字段不存在,所以我現在考慮有一個新的字段,它將包含一個從1-3開始的隨機數,然後在該字段上進行分區,這實質上只是一個虛擬領域。唯一的區別是我想稍微隨機化一些值,以避免熱點和無限制的行增長。
我知道這是一個數據建模問題,它隨系統而變化,當然會出現一些情況,你必須選擇兩個邪惡中的較小者(沒有完美的解決方案),但是什麼我真的專注於這個問題是:
虛擬分區鍵是不應該在卡桑德拉考慮的東西,或者是否存在被視爲可接受的情況?如果你認爲前者,那麼你會如何處理這種情況?