- 有人知道redis复制和redis分片之间的区别吗?
- 它们有什么用?Redis 将数据存储在内存中,这对复制/分片有何影响?
- 是否可以同时使用它们?
3 回答
分片几乎是复制的对立面,尽管它们是正交的概念并且可以很好地协同工作。
分片,也称为分区,是通过键将数据拆分;而复制,也称为镜像,是复制所有数据。
分片有助于提高性能,减少任何一种资源的命中和内存负载。复制对于获得高可用性读取很有用。如果从多个副本读取,也会降低所有资源的命中率,但所有资源的内存需求保持不变。应该注意的是,虽然您可以写入从属设备,但复制只是主->从属。所以你不能以这种方式扩展写入。
假设您有以下元组:[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 支持开箱即用的复制。
简单来说,这两个概念的根本区别在于,Sharding 用于扩展 Writes,而 Replication 用于扩展 Reads。正如 Alex 已经提到的,复制也是实现 HA 的解决方案之一。
是的,如果您考虑如何在集群中的节点之间复制分片,它们通常会一起使用。
关于您的第三个问题,而不是 RAM-flush 选项,最好使用 Redis Append Only File (AOF)。只需很小的成本(就写入速度而言),您的写入可靠性就会提高很多。它很像 mysql 二进制日志。1 fsync/second 是推荐使用的选项。