Redis集群模式!

Redis 3.0之前,使用 哨兵Sentinel)机制来监控各个节点之间的状态。

3.0版本正式推出,解决了 Redis分布式 方面的需求。

数据分区

Redis Cluster采用 虚拟槽分区,所有的 根据 哈希函数 映射到 0~16383 整数槽内。

  • 计算公式:slot = CRC16(key)& 16383
  • 每个节点负责维护一部分槽以及槽所映射的 键值数据

为什么Redis集群的最大槽数是16384个?

2^14^=16384、2^16^=65536

  • 如果槽位是65536个,发送心跳信息的消息头是65536/8/1024 = 8k

  • 如果槽位是16384个,发送心跳信息的消息头是16384/8/1024 = 2k

因为Redis每秒都会发送一定数量的心跳包,如果消息头是8k,有些太大了,浪费网络资源。

Redis的集群主节点数量一般不会超过1000个。

  • 集群中节点越多,心跳包的消息体内的数据就越多,如果节点过多,也会造成网络拥堵。

因此Redis的作者不建议Redis Cluster的节点超过1000个,对于节点数在1000个以内的Redis Cluster,16384个槽位完全够用。

集群的功能限制

key 批量操作 支持有限:

  • 类似 msetmget 操作,目前只支持对具有相同 slot 值的 key 执行 批量操作
  • 对于 映射为不同 slot 值的 key 由于执行 mgetmget 等操作可能存在于多个节点上,因此不被支持。

key 事务操作 支持有限:

  • 只支持 key同一节点上事务操作,当多个key分布在 不同 的节点上时 无法 使用事务功能。

不支持 多数据库空间:

  • 单机 下的Redis可以支持16个数据库(db0 ~ db15),集群模式 下只能使用 一个 数据库空间,即db0