Redis 集群是 Redis 提供的分布式数据库方案,集群痛殴分片(sharding)来进行数据共享,并提供复制和故障转移能力。
集群环境搭建
Redis 集群最少需要 3 个 master 节点,这里我们搭建 3 个 master 节点,3 个 slave 及节点(由于我机器配置受限,直接通过端口的方式模拟集群搭建,本处只是实验方便,生产环境不可采取此方案)。
环境搭建步骤如下:
简单说明,首先我们先要定义集群节点的端口 7000-7005 然后配置文件复制 redis.conf 到对应的配置文件名。
编辑 redis.conf 文件,主要修改以下的几个配置(如果需要设置密码需要配置 requirepass 和 masterauth)
daemonize yes
# 这个端口和上面的配置清单一致即可
port 7000
# 启动集群模式
cluster-enabled yes
# 集群节点信息文件,这里700x最好和port对应上
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
复制代码
服务启动,注意我们需要启动所有的节点,命令如下:
# 启动所有的服务 7000-7005
cd 7000
redis-server ./redis-7000.conf
复制代码
初始化集群,通过 redis-cli --cluster create 命令初始化集群,命令如下 (如果是生产环境,需要节点间 IP 以及端口是否可互相访问):
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1
复制代码
集群状态查询
登录节点 redis-cli -c -h 127.0.0.1 -p 7000, 注意一定要加 -c 表示集群模式。
查询集群状态 cluster info
➜ etc redis-cli -c -h 127.0.0.1 -p 7000
127.0.0.1:7000>
127.0.0.1:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:263
cluster_stats_messages_pong_sent:270
cluster_stats_messages_sent:533
cluster_stats_messages_ping_received:270
cluster_stats_messages_pong_received:263
cluster_stats_messages_received:533
127.0.0.1:7000>
复制代码
其他的集群创建方案 utils/create-cluster 我们可以在参考资料中找到创建方式(参考文档:redis.io/docs/manual…)
集群原理
槽指派机制
Redis Cluster 将所有数据划分为 16384 个 slots (槽位),每个节点负责其中一部分槽位。槽位的信息存储于每个节点中。
当 Redis Cluster 的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存在客户端本地。这样当客户端要查找某个 key 时,可以直接定位到目标节点。同时因为槽位的信息可能会存在客户端与服务器不一致的情况,还需要纠正机制来实现槽位信息的校验调整。
槽位定位算法
Cluster 默认会对 key 值使用 crc16 算法进行 hash 得到一个整数值,然后用这个整数值对 16384 进行与操作来得到具体槽位。
源码位置 src/cluster.c 中的 keyHashSlot 方法
crc16(key,keylen) & 0x3FFF
复制代码
查询某个 key 那个节点上,方法如下:
# 查询 key 所在的槽位
127.0.0.1:7000> cluster keyslot wahaha
(integer) 12318
# 查询所有的 槽分布信息
# 可以得出结论: wahaha 这个 key 在 7002 这个节点上
127.0.0.1:7000> cluster slots
1) 1) (integer) 10923
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 7002
3) "de631f8ac9649f5d9fb12013dc01407f953c3299"
4) 1) "127.0.0.1"
2) (integer) 7004
3) "6ac6065d07eb44b674a181da897401ec4cea9571"
2) 1) (integer) 5461
2) (integer) 10922
3) 1) "127.0.0.1"
2) (integer) 7001
3) "e36fc81472afb04b9c88af1504a8e02647de1b13"
4) 1) "127.0.0.1"
2) (integer) 7003
3) "a89dcff90147f6cc9425ff0c6e4bead7017dc1e1"
3) 1) (integer) 0
2) (integer) 5460
3) 1) "127.0.0.1"
2) (integer) 7000
3) "0acfc8b3dd2223333a03bbcf856dd2a839d2e072"
4) 1) "127.0.0.1"
2) (integer) 7