东台做网站的公司,长春招聘会最新招聘时间,校园门户网站建设公司,住房和城乡建设部网站诚信评价文章目录 背景处理新节点遗忘旧节点 背景 
集群部署在K8S环境内#xff0c;存储使用的localpv#xff0c;有一台K8S主机节点磁盘故障#xff0c;导致在该节点上的redis节点均出现故障#xff0c;主要表现为持久化失败、集群拓扑异常#xff0c;持久化失败可以临时关闭RDB和… 文章目录 背景处理新节点遗忘旧节点 背景 
集群部署在K8S环境内存储使用的localpv有一台K8S主机节点磁盘故障导致在该节点上的redis节点均出现故障主要表现为持久化失败、集群拓扑异常持久化失败可以临时关闭RDB和AOF持久化、等挂载好新的硬盘后重新创建pvc进行恢复经过观察这些redis节点恢复后operator并不能完成集群自愈需要手动干预主要表现为集群拓扑异常故障的节点没有被清理掉、新的节点没有以正常的角色加入到集群中。 
集群是一个3主3从的规模3个master每个master一个slave这个集群中故障的Pod在创建pvc后进行过重启操作导致现在的拓扑有4个正常的master一个无效的节点原因是恢复的节点没有以slave的角色加入到集群且集群没有forget掉之前故障的节点 处理新节点 
从新的节点上看没有无效的节点 处理新节点比较简单只需要对比下哪个master没有slave将该节点设置为这个master的从节点即可 执行完命令之后其他的节点上能看到该节点的角色变了 监控中的拓扑也正常了现在这种情况集群是可以正常工作的但是强迫症必须要清除掉这个无效的节点。 遗忘旧节点 
如果逐台执行cluster forget来遗忘这个无效的节点由于集群之间会进行通信同步拓扑信息如果不是很快同事执行该操作最后是无法保证成功的所以写了个脚本来模拟同时执行 
bath-forget-nodes.sh 
#!/bin/bashset -e# 查出所有正常的节点排除状态为fail的需要在这些节点上执行forget操作 
nodes_addrs$(redis-cli -a $3 -h $1 -p $2 cluster nodes|grep -v fail| awk {print $2})
echo  -------------normal cluster nodes -----------------
echo  $nodes_addrs   
echo  --------------------------------------------  
for addr in ${nodes_addrs[]}; dohost${addr%:*}port${addr#*:}# 查出所有需要forget的节点del_nodeids$(redis-cli -a $3 -h $host -p $port cluster nodes|grep -E handshake|fail| awk {print $1})for nodeid in ${del_nodeids[]}; doecho  -------------delete nodes info -----------------------  echo delete from host: $host $port, delete node id: $nodeid echo  ------------------------------------------------------   # 执行forget            redis-cli -a $3 -h $host -p $port cluster forget $nodeiddone
done一共是需要3个参数IP、port、密码最好先把执行forget的一行注释掉看看输出是否符合预期。 执行完之后每个节点的拓扑都恢复正常了 大公告成虽然是比较简单的操作还是记录一下好记性不如烂笔头。