Riak KV集群迁移后首次读键报404/503错误排查问询
环境与迁移背景
- 双数据中心配置:site1(节点IP 10.10.1.1~10.10.1.10)、site2(节点IP 10.10.2.1~10.10.2.10),光纤互联延迟<1ms
- 本地hosts映射:site1与site2均将本地节点IP映射为
node01.server~node10.server - 迁移步骤:
- 停止site1中10.10.1.10节点的Riak服务
- 复制该节点的leveldb、ring、cluster_meta等文件到site2的10.10.2.10节点
- 修改site1其余9个运行节点的/etc/hosts,将
node10.server映射为10.10.2.10 - 在site2的10.10.2.10节点以相同节点名启动Riak
- 等待数据传输完成
- 对site1其余节点重复上述步骤,完成全集群迁移
迁移后出现的问题
- 键读取异常:首次执行
curl -w'\n' -i http://node04.server:8098/buckets/spgs_gamelog_40_1968_0/keys/20049355203返回404(Object Not Found)或503(Service Unavailable,提示R-value unsatisfied: 1/2),重复读取则返回200 OK及正常键值数据 - 添加
notfound_ok=false&r=3&pr=1参数无效 - 日志警告信息:
- 向量时钟不一致:
riak_kv_vnode:log_key_amnesia:4493 Inbound clock entry for <<157,70,93,96,209,34,165,36>> in <<"spgs_gamelog_40_1968_0">>/<<"20049355203">> greater than local.Epochs: {In:70316435 Local:0}. Counters: {In:1 Local:0} - 邮箱超时:
2024-05-23 02:58:04.915 [warning] <0.5795.5043>@riak_kv_put_fsm:join_mbox_replies:1226 soft-limit mailbox check timeout
- 向量时钟不一致:
- 已排查:执行
find . -name "LOG" -exec grep -l 'Compaction error' {} \;未发现LevelDB压缩错误;怀疑MTU差异(原集群MTU 1500,新集群MTU 9000,应用服务器MTU 1500)可能影响
问题解答
1. Riak客户端是否支持读取修复后立即成功读取键?
默认情况下,Riak的读取修复是异步触发的:当读取发现节点间数据不一致时,会触发修复流程,但该流程不会阻塞当前读取请求的响应,因此首次读取可能因部分节点数据未同步返回异常,修复完成后再次读取即可正常返回。
若需要让读取修复同步完成后再返回结果,可调整Bucket的read_repair参数为true(默认是legacy,异步修复),同时配合合适的r/pr参数(如r=quorum),确保读取请求等待修复完成后拿到一致数据。注意,同步读取修复会增加读取延迟,需根据业务场景权衡。
2. 若LevelDB分区损坏该如何处理?
- 确认损坏范围:通过
riak-admin status查看vnode状态,结合LevelDB的LOG文件定位损坏的分区目录(通常在/var/lib/riak/leveldb/下,对应vnode ID) - 利用副本恢复:找到该分区的其他健康副本节点,复制对应LevelDB目录到损坏节点,替换损坏的分区文件后重启Riak节点
- 强制移除损坏分区(极端情况):若所有副本都损坏,可执行
riak-admin force-remove <vnode-id>移除该分区,但会导致数据丢失,仅作为最后手段 - 事后验证:修复后执行
riak-admin bucket-type status <bucket-type>和riak-admin keys <bucket>验证数据完整性
3. 问题排查及解决方向
(1)时钟与数据一致性问题
日志中的log_key_amnesia警告说明节点间向量时钟不一致,迁移后的节点数据版本与原有集群存在冲突:
- 检查迁移过程中是否完整复制了所有LevelDB数据文件(含所有vnode分区数据),避免遗漏导致节点数据不完整
- 执行全集群的
riak-admin repair命令,触发全量数据修复,同步所有节点的向量时钟和数据版本
(2)MTU不匹配问题
新集群MTU为9000,应用服务器为1500,可能导致数据包分片异常或丢失:
- 临时测试:将site2节点的MTU改为1500,重启Riak服务,验证读取异常是否消失
- 若确认是MTU问题,统一集群与应用服务器的MTU值(要么都用1500,要么在应用服务器侧配置支持9000MTU的路径MTU发现)
(3)集群迁移流程优化
当前直接修改hosts映射并复制节点文件的方式,可能导致集群状态不一致:
- 采用Riak官方推荐的滚动迁移流程:先将site2节点通过
riak-admin join加入现有集群完成合并,再逐步移除site1节点,避免直接复制文件带来的状态冲突 - 检查迁移后集群ring状态:执行
riak-admin ring-status确认所有节点的ring分片一致,无pending状态
(4)邮箱超时与性能问题
join_mbox_replies超时说明集群内部消息处理阻塞,可能是数据修复过程中资源不足:
- 检查节点CPU、内存、磁盘IO使用率,确认是否存在资源瓶颈
- 调整Riak的
vm.args中的邮箱队列大小参数(如+P 1048576),缓解消息堆积问题
内容的提问来源于stack exchange,提问作者Grant Ng
相关产品推荐
相关产品推荐

