代理主机
类似 nginx,选用一台主机作为代理主机
代理主机对每组 redis 主从复制进行反向代理
为了健壮,代理主机也需要是集群的
无中心化集群
redis 3.0 后出现,目前通用集群方案,如下图
最佳实践
节点配置文件
注意打开 bind
配置
# inclue 引入原始配置文件
# 相当于用原始配置文件作为模板,然后进行增量配置
include /etc/redis/redis.conf
prot 6379
pidfile /var/run/redis_6379.pid
dbfilename dump6379.rdb
dir "/redis/cluster01"
logfile "/redis/cluster01/reis_err_6379.log"
# 集群配置
cluster-enabled yes
cluster-config-file nodes-6379.conf
# 节点失联时间
cluster-node-timeout 15000
启动节点
redis-server redis3679.conf
组建集群
cd /opt/redis-6.0.8/src
redis-cli --cluster create --cluster-replicas 1 192.1658.3.11:6379 192.168.3.11:6380 [...所有主机列表]
docker 版集群
参考 云原生 | Docker - [Redis 集群搭建]
Redis Assistant (看上去很不错,但收费)
Another Redis Desktop Manager
无法连接时,查看防火墙相关配置,参考 firewall-cmd 指令
`redis-cli --cluster create --cluster-replicas 1 […所有主机 ip:端口 列表]``
添加主节点
redis-cli --cluster add-node 新主节点Ip端口 集群中节点Ip端口
添加从节点
redis-cli --cluster add-node 新从节点Ip端口 集群中节点Ip端口 --cluster-slave --cluster-master-id 主节点node-id
redis-cli --cluster reshard 集群中节点Ip端口
redis-cli --cluster rebalance 集群中节点Ip端口
当每个节点的 key 都很少时,使用此命令无效,并提示
*** No rebalancing needed! All nodes are within the 2.00% threshold.
redis-cli --cluster del-node 集群中节点Ip端口
cluster keyslot key_name
cluster countkeysinslot slot_no
只能查看当前节点的插槽
cluster getkeysinslot slot_no n
从 slot_no 号 hash 槽上获取前 n 个 key
每个主节点并不包含所有数据
集群中的主节点分别负责一部分数据(key)的存储
具体一个 key 存放在哪个节点是由 hash 槽 算法决定
hash 槽相关说明参考 微服务架构 | 分布式存储 -算法
多 key 操作指令会受到影响
集群模式下,一口气操作多个 key 的指令会受到影响,比如 mset
因为涉及到的多个 key 可能经过计算 hash 槽后,分属于不同的主节点
可以通过对 keys 设置组来解决,如 mset k1(kk) v1 k2(kk) v2 k3(kk) v3
lua 脚本执行受到影响
lua 脚本在执行过程中很有可能遇到跨节点的操作
即,所有可能重定向节点 redirected
的操作都会受到影响
不同节点配置差异产生的问题
主要集中在两方面
maxmemory
hash-max-ziplist-entries
,配置了 hash 的压缩表大小主从复制带来的问题
rel_backlog_size
指定,默认 1M,可以加大此配置新老环境的迁移问题
如果有陈年老系统,可能最早不是使用的 redis 集群
而迁移需要保证数据的完整性,只能局限于整体迁移时,难度较大
主节点宕机
一段 hash 槽节点全部宕机
cluster-require-full-coverage