53
  1. 有人知道redis复制和redis分片之间的区别吗?
  2. 它们有什么用?Redis 将数据存储在内存中,这对复制/分片有何影响?
  3. 是否可以同时使用它们?
4

3 回答 3

139

分片几乎是复制的对立面,尽管它们是正交的概念并且可以很好地协同工作。

分片,也称为分区,是通过键将数据拆分;而复制,也称为镜像,是复制所有数据。

分片有助于提高性能,减少任何一种资源的命中和内存负载。复制对于获得高可用性读取很有用。如果从多个副本读取,也会降低所有资源的命中率,但所有资源的内存需求保持不变。应该注意的是,虽然您可以写入从属设备,但复制只是主->从属。所以你不能以这种方式扩展写入。

假设您有以下元组:[1:Apple]、[2:Banana]、[3:Cherry]、[4:Durian],我们有两台机器 A 和 B。使用 Sharding,我们可能将密钥 2,4 存储在机器A;和机器 B 上的密钥 1,3。通过复制,我们将密钥 1,2,3,4 存储在机器 A 上,将 1,2,3,4 存储在机器 B 上。

分片通常是通过对密钥执行一致的哈希来实现的。上面的例子是用下面的哈希函数 h(x){return x%2==0?A:B} 实现的。

为了结合这些概念,我们可能会复制每个分片。在上述情况下,机器 A 的所有数据 (2,4) 都可以复制到机器 C 上,机器 B 的所有数据 (1,3) 都可以复制到机器 D 上。

任何键值存储(Redis 只是其中一个示例)都支持分片,尽管某些交叉键功能将不再起作用。Redis 支持开箱即用的复制。

于 2010-02-24T00:01:52.523 回答
25

简单来说,这两个概念的根本区别在于,Sharding 用于扩展 Writes,而 Replication 用于扩展 Reads。正如 Alex 已经提到的,复制也是实现 HA 的解决方案之一。

是的,如果您考虑如何在集群中的节点之间复制分片,它们通常会一起使用。

关于您的第三个问题,而不是 RAM-flush 选项,最好使用 Redis Append Only File (AOF)。只需很小的成本(就写入速度而言),您的写入可靠性就会提高很多。它很像 mysql 二进制日志。1 fsync/second 是推荐使用的选项。

于 2010-11-09T05:43:53.167 回答
0

一起使用复制和分片

如果您想要高可用性和更高的性能,可以同时使用复制和分片来提供此功能。使用分片,您将拥有两个或更多具有基于键的特定数据的实例。然后,您可以复制这些实例中的每一个以生成一个既可复制又可分片的数据库,这将同时提供可靠性和速度!

在此处输入图像描述

于 2021-07-14T12:20:17.533 回答