シャーディングは、ほぼ複製の正反対の概念ですが、それらは直交する概念であり、連携して機能します。
パーティション分割とも呼ばれるシャーディングは、データをキーで分割します。レプリケーションは、ミラーリングとも呼ばれ、すべてのデータをコピーすることです。
シャーディングは、パフォーマンスを向上させ、1つのリソースでのヒットとメモリの負荷を軽減するのに役立ちます。レプリケーションは、読み取りの高可用性に役立ちます。複数のレプリカから読み取る場合、すべてのリソースのヒット率も低下しますが、すべてのリソースのメモリ要件は同じです。スレーブに書き込むことはできますが、レプリケーションはマスター->スレーブのみであることに注意してください。したがって、この方法で書き込みをスケーリングすることはできません。
次のタプルがあるとします:[1:Apple]、[2:Banana]、[3:Cherry]、[4:Durian]、2つのマシンAとBがあるとします。シャーディングを使用すると、キー2,4をマシンA;レプリケーションでは、マシン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に複製されます。
Key-Valueストア(Redisはその一例にすぎません)はシャーディングをサポートしますが、特定のクロスキー関数は機能しなくなります。 Redisはそのままの状態でレプリケーションをサポートします。
簡単に言えば、2つの概念の基本的な違いは、書き込みをスケーリングするためにシャーディングが使用され、読み取りをスケーリングするためにレプリケーションが使用されることです。 Alexがすでに述べたように、レプリケーションもHAを実現するためのソリューションの1つです。
はい。クラスター内のノード間でシャードを複製する方法を検討する場合、通常は両方が一緒に使用されます。
3番目の質問に関しては、RAMフラッシュオプションの代わりに、Redis Append Only File(AOF)を使用することをお勧めします。 (書き込み速度の点で)わずかなコストで、書き込みの信頼性が大幅に向上します。これは、mysqlバイナリログに非常に似ています。 1 fsync /秒は、使用する推奨オプションです。