业务在使用cephfs共享存储的时候遇到一个诡异的问题,容器内执行了cp操作之后,在其他挂载目录能看到新的文件,但是数据内容为空,大小为0。但是在容器里观察和宿主机上观察一切正常。
A、B均挂载了同一个cephfs
宿主机A容器里执行cp aaa bbb
容器里:
B机器:
由于ceph是一个网络存储,拿到这个问题我的第一想法就是在A机器上抓包,看下cephfs的返回是否一样。于是用wireshark解析了抓到的包
好像对ceph协议的支持不怎么完善,此路不通。
于是选择根据日志去排查问题。
首先打开mds的日志:
ceph tell mds.* injectargs --debug-ms 5/5
确实有创建新文件的请求:
但是没有具体文件内容和大小的日志
然后打开osd的日志:
ceph tell osd.* injectargs --debug-osd 10/10
但是没有发现关联到新文件的日志,所以没法确认文件的内容是否被写入了
正当一筹莫展的时候,同事有了重大发现,当替换成其他镜像进行同样的操作时问题消失,查看了有问题的镜像系统为alpine,换成centos和ubuntu均没有该问题。我们又做了另一个试验,升级的client的内核,ceph官方推荐在4.*的内核下使用cephfs client的kernel模式,但是我们是用centos的默认3.10内核。我们把client的内核升级到4.14.15,再进行一样的操作问题也消失了!!!
到这里问题似乎付出了水面,初步判断是alpine的cp命令在3.10内核下面会触发cephfs的bug导致写入内容失败,我们方案是升级到4.*的内核。ceph的日志着实难懂,后续搞清楚了之后再补上结论 : )