Riak集群分区移交等待问题求助:142个Secondary分区移交失败
Riak集群分区移交停滞问题解决指南
问题概况
- 集群规格:24节点、1024分区,Riak KV版本
<<"2.1.7-226">> - 异常:142个分区等待移交超10天,无活跃传输任务;待移交分区被标记为
secondary(预期为primary) - 关键错误:节点
riak@0037-internal.xx.com出现提示移交失败,错误栈:<0.30120.441>@riak_core_handoff_sender:start_fold:282 hinted transfer of riak_kv_vnode from 'riak@0037-internal.xx.com' 994791641816054037097625320706298110058774396928 to 'riak@0029-internal.xx.com' 994791641816054037097625320706298110058774396928 failed because of error:{badmatch,{error,closed}} [{riak_core_handoff_sender,start_fold,5,[{file,"src/riak_core_handoff_sender.erl"},{line,132}]}] <0.9143.441>@riak_core_handoff_sender:start_fold:282 hinted transfer of riak_kv_vnode from 'riak@0037-internal.xx.com' 616571003248974668617179538802181898917346541568 to 'riak@0035-internal.xx.com' 616571003248974668617179538802181898917346541568 failed because of error:{badmatch,{error,closed}} [{riak_core_handoff_sender,start_fold,5,[{file,"src/riak_core_handoff_sender.erl"},{line,132}]}] - 已尝试操作:移除并重新加入涉事节点,无效
分步解决步骤
1. 排查节点间网络连通性
{error,closed}错误大概率是节点间handoff端口不通导致:
- 测试涉事节点(
riak@0037、riak@0029、riak@0035)的8099端口连通性(Riak默认handoff端口):nc -zv riak@0029-internal.xx.com 8099 nc -zv riak@0035-internal.xx.com 8099 - 检查节点防火墙、安全组,确保
8099(handoff)和8087(节点通信)端口无拦截 - 确认所有节点时间同步,时间偏差过大可能导致TCP握手失败
2. 清理陈旧提示移交数据
提示移交失败后残留的无效数据会阻碍后续操作:
- 在
riak@0037-internal.xx.com节点停止Riak:riak stop - 删除对应目标节点的提示移交目录(默认路径):
rm -rf /var/lib/riak/handoff/hinted/riak@0029-internal.xx.com rm -rf /var/lib/riak/handoff/hinted/riak@0035-internal.xx.com - 重启Riak服务:
riak start
3. 强制触发分区移交
自动移交停滞时,手动触发指定分区的移交:
- 先确认集群状态正常:
riak-admin status - 针对报错的分区执行强制移交:
riak-admin handoff trigger riak_kv_vnode 994791641816054037097625320706298110058774396928 riak@0029-internal.xx.com riak-admin handoff trigger riak_kv_vnode 616571003248974668617179538802181898917346541568 riak@0035-internal.xx.com - 实时查看移交进度:
riak-admin handoff status
4. 修复环状态不一致
分区标记异常通常是环状态不同步导致:
- 检查所有节点的环状态一致性:
riak-admin ring status - 若存在不一致,在一个健康节点上重建环:
riak-admin ring rebuild - 等待环同步完成后,再次检查分区状态:
riak-admin cluster partitions
5. 排查节点资源与磁盘情况
磁盘满或资源耗尽会直接导致移交失败:
- 检查涉事节点的磁盘空间:
df -h /var/lib/riak - 查看CPU、内存使用率:
top - 检查Riak日志(默认
/var/log/riak/riak.log),是否有磁盘IO错误、内存溢出等相关报错
6. 升级Riak版本(可选)
Riak 2.1.7存在多个已知的handoff相关bug,升级到该分支的最新补丁版本(如2.1.10)可修复部分底层问题,升级前务必做好全量数据备份。
内容的提问来源于stack exchange,提问作者Patrick Kokou
相关产品推荐
相关产品推荐

