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