Redis集群模式!
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
批量操作 支持有限:
- 类似
mset
、mget
操作,目前只支持对具有相同slot
值的key
执行 批量操作。- 对于 映射为不同
slot
值的key
由于执行mget
、mget
等操作可能存在于多个节点上,因此不被支持。
key
事务操作 支持有限:
- 只支持 多
key
在 同一节点上 的 事务操作,当多个key
分布在 不同 的节点上时 无法 使用事务功能。不支持 多数据库空间:
- 单机 下的
Redis
可以支持16
个数据库(db0 ~ db15
),集群模式 下只能使用 一个 数据库空间,即db0
。