2010-01-26 41 views

回答

102

Sharding幾乎是複製的對立面,儘管它們是正交的概念並且可以很好地協同工作。

分片(也稱爲分區)正在按鍵分割數據;而複製也稱爲鏡像,即複製所有數據。

分片可用於提高性能,減少任何資源的命中和內存負載。複製對讀取的高可用性很有用。如果您從多個副本中讀取數據,則還會降低所有資源的命中率,但所有資源的內存要求保持不變。應該注意的是,儘管您可以寫入從站,但複製只有主站 - >從站。所以你不能用這種方式來擴展寫入。假設你有以下元組:[1:Apple],[2:Banana],[3:Cherry],[4:Durian],並且我們有兩臺機器A和B.對於Sharding,我們可能存儲密鑰機器A上2,4;和機器B上的鍵1,3。通過複製,我們在機器A上存儲鍵1,2,3,4和在機器B上存儲1,2,3,4。

分片通常通過執行一致的散列在鑰匙上。上面的例子是用下面的哈希函數h(x){return x%2 == 0?A:B}實現的。

要結合這些概念,我們可能會複製每個分片。在上述情況下,機器A的所有數據(2,4)可以在機器C上覆制,機器B的所有數據(1,3)可以在機器D上覆制。

任何鍵 - 值存儲(其中Redis只是其中一個示例)支持分片,但某些交叉鍵功能將不再起作用。 Redis支持開箱即用的複製。

+6

很酷。我認爲答案不僅限於redis – joetsuihk 2010-03-11 04:48:44

+3

良好的答案(一般),但並沒有真正回答問題imho :) – 2010-04-22 11:17:05

+2

我認爲這個答案提供了一個很好的迴應提問者問。大大簡化,但正確的解釋。 +1 – 2011-12-09 04:06:08

14

簡而言之,這兩個概念之間的根本區別在於,分片用於縮放寫入,而複製用於縮放讀取。正如Alex已經提到的,Replication也是實現HA的解決方案之一。

是的,如果考慮如何在集羣中的節點上覆制碎片,它們通常都會一起使用。

關於你的第三個問題,而不是RAM刷新選項,使用Redis Append Only File(AOF)是一個更好的主意。只需很小的成本(就寫入速度而言),您可以獲得更多的寫入可靠性。這很像mysql二進制日誌。建議使用1 fsync /秒。