一、问题重现
我们已有9台部署有glusterfs3.7.2
的服务器(qserver0
, qserver1
, … qserver8
),现在想新加入3台服务器(qserver9
, qserver0
, qserver11
)。11台机器的ip分别是:192.168.0.130
, 192.168.0.131
, …, 192.168.0.141
。我们一直都通过以下方式来安装glusterfs
:
-
step1:将以下内容新建到文件
/etc/yum.repos.d/glusterfs-epel.repo
中Place this file in your /etc/yum.repos.d/ directory
[glusterfs-epel]
name=GlusterFS is a clustered file-system capable of scaling to several petabytes.
baseurl=http://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/EPEL.repo/epel-releasever/ basearch/
enabled=1
skip_if_unavailable=1
gpgcheck=1
gpgkey=http://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/rsa.pub
[glusterfs-noarch-epel]
name=GlusterFS is a clustered file-system capable of scaling to several petabytes.
baseurl=http://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/EPEL.repo/epel-$releasever/noarch
enabled=1
skip_if_unavailable=1
gpgcheck=1
gpgkey=http://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/rsa.pub
[glusterfs-source-epel]
name=GlusterFS is a clustered file-system capable of scaling to several petabytes. - Source
baseurl=http://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/EPEL.repo/epel-$releasever/SRPMS
enabled=0
skip_if_unavailable=1
gpgcheck=1
gpgkey=http://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/rsa.pub step2:用以下命令安装
glusterfs
sudo yum install glusterfs-server
但此时的LATEST
版本已经是glusterfs3.7.18
了。
为保持一致性,我们直接将旧的9台机器update到gluster3.7.18。然后再从qserver8中添加qserver11节点:
sudo gluster peer probe 192.168.0.141
此时查看peer状态
sudo gluster peer status
qserver8
机器上如下: qserver11
机器上如下:
[当时没有截图,汗。。。]也是State: Peer Rejected (Connected)的状态
二、问题探索
发现1:
通过对比qserver0
~qserver8
和qserver11
中的/var/lib/glusterfs
中的内容,我们发现qserver0
~qserer8
中的/var/lib/glusterfs/vols/{vol_name}/cksum
的值都相同,但qserver11
中的cksum
值和他们不同。
怀疑1:cksum
的不同是问题的根源,考虑手动修改cksum
发现2:
我在qserver11
上手动将cksum
修改为和qserver8
一致,再重新启动glusterd
:
sudo systemctl restart glusterd
发现重启服务失败,/var/log/glusterfs/etc-glusterfs-glusterd.vol.log
中记录错误如下:
初步发现此时只能将/var/lib/glusterfs
整个文件夹删除再重新启动
结论1:一旦通过qserver8
将qserver11
porbe之后,qserver11
上的glusterd
就无法重启了。所以不能手动修改qserver11
的cksum
,考虑曲线救国,修改qserver0
~qserver8
上的cksum
发现3:
先对qserver8
进行尝试
修改
qserver8
的cksum
和qserver11
上的一致,再重启qserver8
上的glusterd
,发现qserver8
上的cksum
又恢复了原来的值。由此可知,glusterd
在重启时会计算并重写cksum
。进一步阅读
glusterfs-3.7.18
源码,发现cksum
是对/var/lib/glusterfs/vols/{vol_name}/info
的内容进行计算。对比
qserver8
和qserver11
的/var/lib/glusterfs/vols/{vol_name}/info
内容,发现qserver11
中缺少一行quota-version=0
怀疑2:glusterfs-3.7.2
的info
内容会存在quota-version=0
,但glusterfs-3.7.18
的info
内容并不会存在quota-version=0
。而glusterfs
在从3.7.2
升级到3.7.18
时,并不会更新已存在的info
的内容,从而导致了这种不一致。
发现4:
将qserver8
中的info
中的quota-version=0
全部删去,再重新probe qserver11
。发现 qserver8
和qserver11
正常连接:Status: Peer in Cluster(Connected) qserver8
和qserver0
~qserver7
连接异常: State: Peer Rejected (Connected)
结论2:由此我们可以印证,确实是因为info
不一致导致cksum
不一致,再导致rejected(connected)
发现5:
就在我考虑将qserver0
~qserver7
也都像qserver8
那样修改时,发现一个问题:
sudo gluster volume status {vol_name}
qserver8
上的volume
信息出错了,也就是说qserver8
其实是脱离了qserver0
~qserver7
了。如果将qserver0
~qserver7
也都修改了,虽然qserver0
~qserver8
和qserver11
互相peer in cluster了,但他们原来的volume都异常了
结论3:我们只能再次回归到qserver11
上,看看为什么怀疑1中发现的qserver11
就无法重启了。只要解决了qserver11
重启, 问题也就解决了
发现6:
通过修改glusterfs
的日志打印级别至DEBUG
sudo vim /usr/lib/systemd/system/glusterd.service
对照/var/log/glusterfs/etc-glusterfs-glusterd.vol.log
和glustetfs-3.7.18
的源代码,log
中提示是因为无法找到qserver2
。找到glusterfs-3.7.18
中对应的源码,知道glusterd
在启动的时候,会将/var/lib/glusterd/vols/{vol_name}/
中的brick
信息的hostname
,用peers
来解析。
因为peers
中只有probe失败之后的qserver8
信息,自然无法解析qserver2
结论4:只要补全qserver11
中/var/lib/glusterd/peers
中的信息即可
三、问题解决
step1:
qserver8
:
sudo gluster peer probe 192.168.0.141
step2:
qserver11
:
根据qserver8
上的内容将qserver8
上的 /var/lib/glusterd/peers
信息补全
step3:
qserver11
:
将/var/lib/glusterd/vols/{vol_name}/info
中的quota-version=0
去掉
step4:
qserver11
:
sudo systemctl restart glusterd