问题描述
集群有两个io节点,各挂载一块盘(于/data
),将二者放入一个存储池(在io1执行):
gluster peer probe io2
在其上建立卷(在两个io节点的/data
目录下个建立一个share
文件夹),指定传输方式为rdma(远程直接内存访问Remote Direct Memory Access):
gluster volume create share transport rdma io1:/data/share io2:/data/share
gluster volume start share #启用该卷
了客户端挂载卷到指定目录(这里时/share):
mount -t glusterfs -o transport=rdma io1:/share /share
执行后,提示Mount failed. Please check the log file for more details
。
解决
借问搜索引擎,有类似情况,未能找到解决方案。
在客户端上检查日志/var/log/glusterfs/share.log
发现挂载时连接io1存在问题,有类似语句:Transport endpoint is not connected
,也就是连接在问题,不过在客户端上ping测试io1节点上的IB卡的地址却正常,使用默认传输方式(TCP)建立的卷能正常挂载。
其实原因很简单,属于疏忽级问题:
该集群中各个节点的/etc/hosts
文件中仅添加了ip和hostname对应的解析,以本文为例,主机名io1
其实是对应的该节点上某个以太网卡的地址,而非“无限带宽”(Infinband)网卡的地址。在挂载时指定传输类型(transport)为rdma时,系统却无法通过io
这个主机地址进行IB方式的传输。
因此在创建卷的时候应该使用各个io节点的IB地址(IPoIB)(或者在hosts文件中为IB地址单独创建解析,如io1上命名为ib.io1
),挂载卷的时候也如此。
删除先前的卷
gluster volume stop share
gluster volume delete share
重新创建卷
gluster volume create share transport rdma ib.io1:/data/share ib.io2:/data/share
gluster volume start share #启用该卷
提示,重新创建的卷和先前创建的卷同名(即使该卷已经删除过),可能会提示类似:volume create: share: failed: parent directory /data is already part of a volume
,这种情况可按以下方法解决:
setfattr -x trusted.glusterfs.volume-id /data/share #这里/data/share换成你实际的路径
setfattr -x trusted.gfid /data/share #同上 可能会提示not attributes 无妨
rm /data/share/.glusterfs -rf
然后重新创建卷。
如果还遇到问题,可以直接删除/var/lib/glusterd
文件夹,卸载glusterfs-server,删掉卷文件夹(本文中是/data/share
),然后重装来过。
客户端挂载
mount -t glusterfs -o transport=rdma ib.io1:/share /share
如果要自动挂载,在/etc/fstab添加:
ib.io1:/share.rdma /share glusterfs default 0 0
一切顺利。