<redis集群>三.redis集群配置和故障恢复

本文探讨了Redis集群的原理、架构、配置过程,涉及节点间通信、选举机制、主从关系设置以及故障恢复策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.redis集群概述

Redis3.0版本以上开始支持cluster,采用的是hashslot(hash槽),可以将多个Redis实例整合在一起,形成一个群集,也就是将数据分散到群集的多台机器上。

2.redis集群原理

Redis Cluster是一个无中心的结构(无中心管理节点),每个节点都保存数据和整个群集的状态。每个节点都会保存其他节点的信息,知道其他节点所负责的槽,并且会与其他节点定时发送心跳信息,能够及时感知群集中异常的节点。(heart-beat)#集群之间状态互通,数据不互通,只有主从之间数据互通

3.架构细节

  1. 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
  2. 节点的失效(fail)在群集中超过半数的主(master)节点检测失效时才生效。
  3. 客户端与 redis 节点直连,不需要中间代理(proxy)层,客户端不需要连接群集所有节点,连接群集中任何一个可用节点即可。
  4. redis-cluster 把所有的物理节点映射到【0-16383】slot 上,cluster 负责维护 node<->slot<->key。
  5. 每个主都至少有一个从

4.选举过程

  1. 选举过程是群集中所有master参与,如果半数以上master节点与当前 master 节点通信超时(cluster—node—timeout),认为当前 master 节点挂掉。以下两种情况为整个群集不可用(cluster_state:fail),当群集不可用时,所有对群集的操作都不可用,收到((error)CLUSTEFDOWN The cluster is down)错误。
  2. 如果群集任意 master挂掉,且当前 master 没有 slave,则群集进入 fail状态,也可以理解成群集的slot映射【0 ~16383】不完整时进入fail状态。\
  3. 如果群集中超过半数的master挂掉,无论是否有slave,群集都进入 fail状态。
  4. 默认情况下,每个群集的节点都使用两个TCP端口.一个是6379,一个是16379;6379服务于客户端的连接,16379 用于群集总线,即使用二进制协议的节点到节点通信通道。节点使用群集总线进行故障检测、配置更新、故障转移授权等。如果开启了防火墙,需要开放这两个端口。

5.配置过程

此实验依托于redis主从同步,为方便将使用一台linux虚拟机进行,主从同步请见上一篇帖子。

1).下载redis

Yum -y install epel-release

Yum -y install redis

2).创建配置文件目录        

Mkdir /etc/redis
Cp /etc/redis.conf /etc/redis/6379.conf         #创建配置文件
Cd /etc/redis
for i in 6380 6381 6382 6383; do cp 6379.conf ${i}.conf;done

        #创建6379,6380,6381,6382,6383,6384配置文件,此命令是用shell脚本的方式

ls #查看一下是否创建成功

批量更改各个配置文件中的port端口号

for i in {0..4};do sed -i "s/port 6379/port 638${i}/" ./638${i}.conf;done
  1. 批量修改Redis配置文件中的数据目录路径

for i in {0..4};do sed -i "s/port 6379/port 638${i}/" ./638${i}.conf;done
  1. 批量修改redis配置文件中的日志目录路径

for i in {6379..6384};do sed -i "s#logfile /var/log/redis/redis.log#logfile /var/log/redis/${i}/redis.log#" ${i}.conf;done
  1. 批量修改Redis配置文件中的PID文件目录

for i in {6379..6384};do sed -i "s#pidfile /var/run/redis_6379.pid#pidfile /var/run/redis_${i}.pid#" ${i}.conf;done
  1. 批量修改Redis配置文件中的protected-mode(保护模式)选项

for i in {6379..6384};do sed -i "s#protected-mode yes#protected-mode no#" ${i}.conf;done
  1. 批量修改进程运行模式

for i in {6379..6384};do sed -i "s#daemonize no#daemonize yes#" ${i}.conf;done
  1. 批量修改redis配置文件中的监听地址

for i in {6379..6384};do sed -i "s#bind 127.0.0.1#bind 192.168.112.161#" ${i}.conf;done
  1. Cd /var/log/redis
Mkdir 6379 638{0..4}  

       #创建四个日志目录

  1. Cd /var/lib/redis
Mkdir 6379 638{0..4} 

#创建四个数据目录

  1. 分别修改配置文件中这些参数
    port
    cluster-enabled yes
    cluster-config-file nodes-【6379~6384】.conf
    cluster-node-timeout 15000

可以直接执行脚本更改完成除了port之外的配置:

for i in {6379..6384};do echo -e "cluster-enabled yes\ncluster-config-file nodes-${i}.conf\ncluster-node-timeout 15000" >> ${i}.conf;done
  1. 批量更改6379-6380的IP地址

for i in { 6379..6384} ; do sed -i “s#bind 127.0.0.1#bind 192.168.12.161#” ${i}.conf; done

也可以进入6379-6380.conf找到bind字段更改,此处更改的IP地址可根据实际情况指定的IP来定

  1. 启动服务

for((i=6379;i<=6384;i++));do redis-server /etc/redis/${i}.conf;done

#批量启动

Netstat -anput | awk ‘/redis/{print $7}’ 

#查看一下服务是否启动

#for i in `netstat - anptu / awk ' /redis/[ print $7) ' | awk -F / ' { print $1) '` ; do kill -9$i; done 

#可用此脚本批量停止服务,此时不使用,启动即可

  1. 构建集群

将其他节点加入集群

redis- cli -h 192.168.112.161 - p 6379 cluster meet 192.168.112.161 6380

redis- cli -h 192.168.112.161 - p 6379 cluster meet 192.168.112.161 6381

redis- cli -h 192.168.112.161 - p 6379 cluster meet 192.168.112.161 6382

redis- cli -h 192.168.112.161 - p 6379 cluster meet 192.168.112.161 6383

redis- cli -h 192.168.112.161 - p 6379 cluster meet 192.168.112.161 6384

或者可以执行脚本批量加入:

for i in {6380..6384};do redis-cli -h 192.168.112.161 -p 6379 cluster meet 192.168.112.161 $i;done
  1. 分配slot(槽) #不能重复分配!

redis-cli -p 6379 cluster addslots {0..5461}

redis-cli -p 6381 cluster addslots {5462..10922}

redis-cli -p 6383 cluster addslots {10923..16383}
  1. 建立主从关系

登录6379redis,执行cluster nodes #查看所有群集节点,查看master节点ID,复制

登出执行:

redis-cli -p 6379 cluster addslots {0..5461}

redis-cli -p 6381 cluster addslots {5462..10922}

redis-cli -p 6383 cluster addslots {10923..16383}

#此时6380为6379的从

redis-cli -p 6382 cluster replicate 5cca472f9816273103769adb32b3a1b562f42655 

#此时6382为6381的从

redis-cli -p 6384 cluster replicate 6d7219fd6db32e6014955edbeda26af6b59b9078

#此时6384为6383的从

登录6379redis,执行CLUSTER NODES #再次查看节点,是否已经配置上主从

执行CLUSTER INFO查看状态是否OK

  1. 相关指令

重置集群命令:cluster reset

#数据的key不能相同

  1. 测试及故障恢复

kill -9 杀死其中一个redis进程

在6379中进入6379数据库执行set f2 123查看是否可以随机分配槽

更换到6383中就可以执行成功了

故障恢复:

启动杀死的redis进程

通过 cluster nodes查看节点状态

通过 cluster info 查看集群状态

登录所有从节点cluster failover

### 解决因可疑活动导致请求被阻止的问题 当账户或IP地址因可疑活动被阻止时,通常是因为GitHub检测到异常行为并采取了安全措施。以下是具体的解决方案: #### 1. 验证身份 如果收到类似 `Hi ***! You've successfully authenticated` 的消息,则表明SSH密钥验证已通过[^3]。然而,如果是其他类型的访问受限问题(如OAuth登录失败),则需要进一步确认。 #### 2. 检查授权回调URL设置 对于OAuth集成GitHub登录的情况,确保在应用配置中正确设置了 **Authorization callback URL** 参数值。此参数允许自定义,并指向GitHub登录成功后的回调地址[^1]。如果该URL不匹配实际部署环境中的路径,可能会触发安全警告。 #### 3. 处理Git克隆权限问题 当执行命令 `git clone git@github.com:` 出现错误提示 `Permission denied (publickey)` 时,这通常是由于未正确配置SSH密钥所致[^2]。可以通过以下方法修复: - 确认本地机器上是否存在有效的SSH密钥文件(位于~/.ssh/目录下)。如果没有,请运行以下命令生成新的SSH密钥对: ```bash ssh-keygen -t rsa -b 4096 -C "your_email@example.com" ``` - 将公钥内容复制至GitHub账户的安全设置页面(Settings -> SSH and GPG keys -> New SSH key)。 - 测试连接是否正常: ```bash ssh -T git@github.com ``` #### 4. 更新NPM镜像源 有时依赖包管理工具也可能引发网络层面的误判。例如,在使用Node.js项目时,建议切换国内镜像加速下载速度,从而减少超时风险: ```bash npm config set registry https://registry.npm.taobao.org ``` 注意:部分旧版本库可能已被废弃,需留意官方公告以避免潜在隐患[^4]。 #### 5. 联系支持团队 最后,若上述操作均无法解决问题,可以直接联系GitHub客服说明具体情况。提供受影响邮箱地址(如hi@cursor.com)、时间范围以及具体报错日志有助于加快处理进度。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值