91.Redis 集群都有哪些方案?

Redis 集群方案如下:

  • 1、Redis Sentinel
  • 2、Redis Cluster
  • 3、Twemproxy
  • 4、Codis
  • 5、客户端分片

关于前四种,可以看看 《Redis 实战(四)集群机制》 这篇文章。

关于最后一种,客户端分片,在 Redis Cluster 出现之前使用较多,目前已经使用比较少了。实现方式如下:

在业务代码层实现,起几个毫无关联的 Redis 实例,在代码层,对 Key 进行 hash 计算,然后去对应的 Redis 实例操作数据。

这种方式对 hash 层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。

? 选择

目前一般在选型上来说:

  • 体量较小时,选择 Redis Sentinel ,单主 Redis 足以支撑业务。

  • 体量较大时,选择 Redis Cluster ,通过分片,使用更多内存。

    关于这个问题,多大体量需要使用 Redis Cluster 呢?朋友的建议是 10G+ 的时候。主要原因是:

    • 1、一次 RDB 时间随着内存越大,会变大越来越久。同时,一次 fork 的时间也会变久。还有,重启通过 RDB 文件,或者 AOF 日志,恢复时间都会变长。
    • 2、体量大之后,读写的 QPS 势必比体量小的时候打的多,那么使用 Redis Cluster 相比 Redis Sentinel ,可以分散读写压力到不同的集群中。

? Redis 集群如何扩容?

  • ~如果 Redis 被当做缓存使用,使用一致性哈希实现动态扩容缩容。~

    删除的原因是,不考虑客户端分片的情况,目前基本已经不在用了。

  • 如果 Redis 被当做一个持久化存储使用,必须使用固定的 keys-to-nodes 映射关系,节点的数量一旦确定不能变化。否则的话(即 Redis 节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有 Redis Cluster、Codis 可以做到这样。

如果是 Redis Cluster 集群的扩容,可以看看 《Redis 开发与运维》 的「10.4 集群 —— 集群伸缩」小节。简单来说,一共三步:

  • 1、准备新节点。
  • 2、加入集群。
  • 3、迁移槽和数据。