
16384个固定虚拟槽位(2^14)。 CRC16(key) mod 16384 算法实现均匀分布。 槽位分配信息存储于每个节点。
[Master Node A] ↔ [Slave Node A1]
↑ ↑ ↖
[Master Node B] ↔ [Slave Node B1]
↓ ↓ ↙
[Master Node C] ↔ [Slave Node C1]
每秒1次PING/PONG心跳。 使用TCP端口(基础端口+10000)进行通信。 故障检测采用多节点投票机制。
MOVED重定向:永久重定向 ASK重定向:临时重定向 Smart Client实现示例(python):
class ClusterClient:
def execute(self, command):
while True:
node = self.slot_map[hash(command.key)]
try:
return node.conn.execute(command)
except MovedError as e:
self.update_slot_map(e.new_slot, e.new_node)
最小规模:3主3从。 推荐规模:N主+N从(N≥5)。 分片策略:业务特性决定分片维度。
2. 配置文件
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-require-full-coverage no
cluster-node-timeout 5000
redis-cli --cluster create \
192.168.1.101:6379 \
192.168.1.102:6379 \
192.168.1.103:6379 \
192.168.1.104:6379 \
192.168.1.105:6379 \
192.168.1.106:6379 \
--cluster-replicas 1
redis-cli -p 7000 cluster nodes
使用Hash Tag强制同slot。
{user1000}.profile
{user1000}.orders
拆分大Key为多个子Key。
机房A: M1, M2, S3
机房B: M3, S1, S2
cluster-announce-ip 10.1.1.1
cluster-announce-port 6379
cluster-announce-bus-port 16379
CONFIG SET maxmemory 32gb
CONFIG SET maxmemory-policy allkeys-lru
随着业务的发展,可能需要向集群添加新的节点或移除旧的节点。Redis集群支持在线扩容和缩容,可以通过 redis-cli --cluster reshard 命令重新分配哈希槽,但需要注意数据迁移的问题。
redis-cli --cluster reshard 127.0.0.1:7000 \
--cluster-from 0 --cluster-to 1 \
--cluster-slots 1000 --cluster-yes
redis-cli -h 192.168.1.101 DEBUG SEGFAULT
合理设置集群的参数,可以有效提升集群的性能。如:cluster-node-timeout(建议15-60秒)。
配置多数派检测:
cluster-require-full-coverage no
cluster-replica-no-failover no
io-threads 4
io-threads-do-reads yes
ACL SETUSER clusteruser on >password ~{*} +@all
apiVersion: redis.redis.opstreelabs.in/v1beta1
kind: RedisCluster
metadata:
name: redis-cluster
spec:
clusterSize: 6
image: redis:7.0
resources:
requests:
memory: 4Gi
自动分片与故障转移:支持分片和自动故障转移,确保高可用性。 水平扩展:可以通过添加更多节点来扩展集群。 高性能:数据和请求被分散到多个节点,提升整体吞吐量。
部分命令受限:跨槽位的命令(如 KEYS、事务)可能受限。 客户端要求:客户端需要支持 Redis 集群协议。 运维复杂度高:集群的配置和管理相对复杂。

文章转载自老王两点中,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。