查看部署log可以发现参数配置已经生效,而这个节点有两个IP,public_nwtwork这个参数限定了公网IP的搜索范围,生成的ceph.conf文件内也包含了public_network这个参数。
Q9. 参数是下划线还是空格分隔这里只是简单的提一下这个小困惑,对于以下的两个参数书写方式,哪种会有问题呢:
public_network = 172.23.0.1/24 public network = 172.23.0.1/24 osd_journal_size = 128 osd journal size = 128这两种参数的书写方式其实都是正确的,说到底是因为底层调用的是Python的argparse模块。这两种方式都是等效的,所以不需要担心。
Q10. ceph-deploy mon create-initial如何一次性通过这一步坑哭了多少迫切加入Ceph世界的新人,看到的最多的就是5s,10s,10s, 15s,20s。。。然后报了错。再执行,再报错。所以这里给出以下的预检清单,如果被报错失败所烦恼,请认真执行各个子项,尤其是失败后要执行清理环境:
请确保所有节点都安装了Ceph。
请确保所有节点的防火墙等都关闭了。参考环境预准备一节
请前往各个MON节点清理干净,不论你是否相信这个节点是干净的。参考清理环境一节。
请确保各个MON节点下存在以下目录,并且对于Jewel版本及之后的请确保目录权限为ceph:ceph。参考部署前最后的确认一节。
请在ceph-deploy new生成的ceph.conf内添加public_network配置项,参考Public VS Cluster一节。
这些总结来之不易,我帮过上百个人解决过部署问题和集群故障。我相信在认真确认过之后是肯定可以通过的(反正前三点如果有问题一般是不会建好MON的,为什么不认真确认下呢),我遇到过绝大多数都是因为防火墙没关,或者手动删除了一些目录,或者没有修改权限导致的问题。
相对来说,新环境只要关了防火墙就可以一次性通过,旧环境或者失败的环境只要清理环境就可以通过了。
Q11. mon create-initial 做了什么
简单介绍下流程:
ceph-deploy读取配置文件中的
mon_initial_members的各个主机,然后依次SSH前往各个主机:
将部署目录下的ceph.conf推送到新节点的/etc/ceph/目录下。
创建/var/lib/ceph/mon/$cluster-$hostname/目录。
检查MON目录下是否有done文件,如果有则直接跳到第6步。
将ceph.mon.keyring拷贝到新节点,并利用该秘钥在MON目录下建立MON数据库。
在MON目录下建立done文件,防止重新建立MON。
启动MON进程。
查看/var/run/ceph/$cluster-mon.$hostname.asokSOCKET文件,这个是由MON进程启动后生成的,输出MON状态。
在所有的MON都建立好后,再次前往各个主机,查看所有主机是否运行并且到达法定人群(quorum)。如果有没到到的,直接结束报错。如果都到达了,执行下一步。
调用
auth get-or-create方法创建(如果不存在)或者拉取(已经存在)MON节点上的以下几个keyring到
部署目录
中:
ceph.bootstrap-mds.keyring
ceph.bootstrap-osd.keyring
ceph.bootstrap-rgw.keyring
ceph.client.admin.keyring
指令结束。
Q12. mon create-initial 为什么会失败我不喜欢讲怎么做,我愿意花很大的篇幅介绍为什么会造成各种各样的问题,如果知道了原因,你自然知道该怎么做,所以才会理解Ceph,而不是机械的去敲指令。
综合上面的所有小节,我来总结下这一步失败的基本上所有可能的原因:
所谓MON的quorum,相当于多个MON形成的一个群体,它们之间需要通过网络发送数据包来通讯达成某种协议,如果打开了防火墙,会阻断数据交流。所以不能构成群体,一直等待(5s->10s->10s->15s->20s)其他MON的数据包,既然被阻断了这样的等待是没有意义的,等了30s还没有正常,就可以直接ctrl+z去检查了。
我在配置文件里面添加了pubilc_network,但是有个主机的所有IP都不在公网IP段内,那么这个MON是建不好的,因为没有IP用作MON使用,public_network相当于一个过滤器。
搭好了一台虚拟机后,直接克隆了两台,没有修改主机名,导致socket文件路径名识别错误,报了异常,不过这很少发生。