Redis 高可用集群原理和实践

本文详细介绍了Redis集群的搭建过程,包括配置文件修改、服务启动和初始化,以及集群状态查询。阐述了集群的工作原理,如槽指派、故障检测与转移机制,以及节点间的gossip通信协议。此外,还讨论了集群的水平扩展,包括添加新节点、数据迁移和节点下线的步骤。最后,提到了集群在面对网络抖动和脑裂问题时的应对策略,以及如何通过配置参数避免数据丢失。
摘要由CSDN通过智能技术生成

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CRMEB定制开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值