欢迎你们前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~javascript
本文为长篇连续剧,将分多个篇幅发表,主要介绍了从动手部署环境到后期运营故障处理过程当中常见的问题,内容由浅入深,是居家旅行运维Ceph的必备良药。java
绝大多数MON建立的失败都是因为防火墙没有关致使的,亦或是SeLinux没关闭致使的。必定必定必定要关闭每一个每一个每一个节点的防火墙(执行一次就好,没安装报错就忽视):node
CentOSpython
sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
# iptables -F
service iptables stop
复制代码
MON部署不上的第二大问题就是在旧的节点部署MON,或者在这个节点部署MON失败了,而后从新new
再mon create-initial
,请查看要部署MON的节点上的/var/lib/ceph/mon/
目录下是否为空,若是不为空,说明已经在这个目录部署过MON,再次部署会检测子目录下的done
文件,因为有了这个文件,就不会再创建新的MON数据库,而且不会覆盖之,致使了部署时的各类异常,这里就不赘述了,直接给出万能清理大法:linux
对于任何须要新部署MON的节点,请到这个节点下执行以下指令,确保环境已经清理干净:数据库
ps aux|grep ceph |awk '{print $2}'|xargs kill -9
ps -ef|grep ceph
#确保此时全部ceph进程都已经关闭!!!若是没有关闭,多执行几回。
rm -rf /var/lib/ceph/mon/*
rm -rf /var/lib/ceph/bootstrap-mds/*
rm -rf /var/lib/ceph/bootstrap-osd/*
rm -rf /var/lib/ceph/bootstrap-rgw/*
rm -rf /etc/ceph/*
rm -rf /var/run/ceph/*
复制代码
请直接复制粘贴,遇到过好些个本身打错打漏删了目录的。bootstrap
这里介绍的都是个案,不过仍是须要提一下:后端
hostname
都设置正确,而且添加至/etc/hosts
文件中,而后同步到全部节点下。克隆出来的虚拟机或者批量建的虚拟机有可能发生此情形。/var/lib/ceph/
/var/lib/ceph/mon/
/var/lib/ceph/osd/
/etc/ceph/
/var/run/ceph/
jewel
,请确认权限均为ceph:ceph
,若是是root:root
,请自行chown
。官网指导方法是使用ceph-deploy install nodeX
,可是由于是国外的源,速度慢得使人发指,因此咱们换到阿里的源,而且使用yum install
的方式安装,没差啦其实,这样反而还快点,毕竟多个节点一块儿装。安全
不少安装失败的都是由于没有添加epel源请在每一个存储节点都执行如下指令,来安装Ceph:
yum clean all
rm -rf /etc/yum.repos.d/*.repo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo sed -i '/aliyuncs/d' /etc/yum.repos.d/epel.repo sed -i 's/$releasever/7.2.1511/g' /etc/yum.repos.d/CentOS-Base.repo echo " [ceph] name=ceph baseurl=http://mirrors.aliyun.com/ceph/rpm-hammer/el7/x86_64/ gpgcheck=0 [ceph-noarch] name=cephnoarch baseurl=http://mirrors.aliyun.com/ceph/rpm-hammer/el7/noarch/ gpgcheck=0 " > /etc/yum.repos.d/ceph.repo yum install ceph ceph-radosgw -y 复制代码
这里是安装的hammer
版本的Ceph,若是须要安装jewel
版本的,请执行:
sed -i 's/hammer/jewel/' /etc/yum.repos.d/ceph.repo
yum install ceph ceph-radosgw -y
复制代码
若是安装了jewel
版本的Ceph,想要换回hammer
版本的Ceph,能够执行下面的指令:
卸载Ceph客户端
rpm -qa |grep `ceph -v |awk '{print $3}'` |xargs rpm -e --nodeps
复制代码
更改ceph.repo里面的Ceph版本
sed -i 's/jewel/hammer/' /etc/yum.repos.d/ceph.repo
yum install ceph ceph-radosgw -y
复制代码
这里我要开启话唠模式:
① Ceph-deploy 是什么?
Ceph-deploy是Ceph官方给出的用于部署Ceph的一个工具,这个工具几乎所有是Python写的脚本,其代码位于/usr/lib/python2.7/site-packages/ceph_deploy
目录下(1.5.36
版本)。最主要的功能就是用几个简单的指令部署好一个集群,而不是手动部署操碎了心,敲错一个地方就可能失败。因此对于新人来讲,或者说以个人经验,接触Ceph少于一个月的,又或者说,集群规模不上PB的,都没有必要手动部署,Ceph-deploy彻底足够了。
② Ceph-deploy怎么装?
这个包在ceph的源里面:
yum install ceph-deploy -y
复制代码
③Ceph-deploy装在哪?
既然Ceph-deploy只是个部署Ceph的脚本工具而已,那么这个工具随便装在哪一个节点均可以,并不须要单独为了装这个工具再搞个节点,我通常习惯放在第一个节点,之后好找部署目录。
④Ceph-deploy怎么用?
详细的指令暂时不介绍,下面会有,在安装好后,须要在这个节点新建一个目录,用做部署目录
,这里是强烈建议建一个单独的目录的,好比我习惯在集群的第一个节点下建一个/root/cluster
目录,为了之后好找。Ceph-deploy的全部的指令都须要在这个目录下执行。包括new,mon,osd
等等一切ceph-deploy的指令都须要在这个部署目录下执行!最后一遍,全部的ceph-deploy
的指令都要在部署目录下执行!不然就会报下面的错:
[ceph_deploy][ERROR ] ConfigError: Cannot load config: [Errno 2] No such file or directory: 'ceph.conf'; has ceph-deploy new been run in this directory?
复制代码
⑤ Ceph-deploy怎么部署集群?
咱们暂且把部署目录所在的节点叫作部署节点。Ceph-deploy经过SSH到各个节点,而后再在各个节点执行本机的Ceph指令来建立MON或者OSD等。因此在部署以前,你须要从部署节点ssh-copy-id
到各个集群节点,使其能够免秘钥登录。
⑥Ceph-deploy部署的日志在哪里?
就在部署目录下面的ceph-deploy-ceph.log
文件,部署过程当中产生的全部的日志都会保存在里面,好比你大半年前敲的建立OSD的指令。在哪一个目录下执行ceph-deploy指令,就会在这个目录下生成log,若是你跑到别的目录下执行,就会在执行目录里生成log再记下第四点的错。固然,这个LOG最有用的地方仍是里面记录的部署指令,你能够经过cat ceph-deploy-ceph.log |grep "Running command"
查看到建立一个集群所需的全部指令,这对你手动创建集群或者建立秘钥等等等等有着很大的帮助!!!
⑦ Ceph-deploy版本
写这段时的最新的版本号为1.5.36
,下载连接为ceph-deploy-1.5.36-0.noarch.rpm, 以前的1.5.35
里面有点bug在这个版本被修复了,若是使用1.5.25
部署遇到了问题,能够更新至这个版本,会绕过一些坑。更新到1.5.36
以后,腰也不酸了,退了不疼了,Ceph也能部署上了。
进入部署目录,执行ceph-deploy new node1 node2 node3
,会生成两个文件(第三个是ceph-deploy-ceph.log
,忽视之):
[root@blog cluster]# ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
复制代码
new
后面跟的是你即将部署MON的节点的hostname
,推荐三个就够了,须要是奇数个MON节点。不要由于只有两个节点就搞两个MON,两个节点请用一个MON,由于两个MON挂掉一个,集群也就挂了,和一个MON挂掉一个效果是同样的。生成的ceph.conf
默认状况下长成这样:
[root@blog cluster]# cat ceph.conf
[global]
fsid = 13b5d863-75aa-479d-84ba-9e5edd881ec9
mon_initial_members = blog
mon_host = 1.2.3.4
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
复制代码
会调用uuidgen
生成一个fsid
,用做集群的惟一ID,再将new
后面的主机加入到mon_initial_members
和mon_host
里面,剩下的三行你们都是同样的,默认开启CephX认证。下面有一节会专门介绍这个,须要注意的是,部署的时候,千万不要动这三行 下面会有一节介绍之。还有一个文件ceph.mon.keyring
:
[root@blog cluster]# cat ceph.mon.keyring
[mon.]
key = AQB1yWRYAAAAABAAhMoAcadfCdy9VtAaY79+Sw==
caps mon = allow *
复制代码
除了key
的内容不同,剩下的都会是同样的。由于是开启了CephX认证了,因此MON直接的通信是须要一个秘钥的,key
的内容就是秘钥。是否是对Ceph里面的明文认证感到吃惊,有总比没有强。若是,你再次执行new
,会生成新的ceph.conf
和新的ceph.mon.keyring
,并将以前的这两个文件给覆盖掉,新旧文件惟一不一样的就是fsid
和key
的内容,可是对Ceph来讲,这就是两个集群了。这里说一下我我的很是很是很是反感的一个问题,有的朋友喜欢在/etc/ceph/
目录下面执行ceph-deploy的命令,这么作和在部署目录下面作通常是没有差异的,由于这两个目录下面都有ceph.conf
和ceph.client.admin.keyring
,可是我仍是强烈推荐建立独立的部署目录,由于/etc/ceph
目录是Ceph节点的运行目录,为了体现各自的功能性,也为了安全性,请不要在**/etc/ceph**
目录下部署集群!!!
Ceph-deploy的log仍是颇有看头的,查看ceph-deploy new blog
(blog是个人一台主机)的log:
[root@blog cluster]# ceph-deploy new blog
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (1.5.36): /usr/bin/ceph-deploy new blog
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] func : <function new at 0x288e2a8>
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x28eccf8>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] ssh_copykey : True
[ceph_deploy.cli][INFO ] mon : ['blog']
[ceph_deploy.cli][INFO ] public_network : None
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] cluster_network : None
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.cli][INFO ] fsid : None
[ceph_deploy.new][DEBUG ] Creating new cluster named ceph
复制代码
能够看到有不少的参数被列出来了,好比:mon : ['blog']
,也有不少参数是False或者None, 这些参数可否被设置呢? 由于这里咱们能够看到有fsid : None
这个参数,难道集群的fsid
能够被指定吗?抱着这些疑惑,我就去看完了ceph-deploy的全部代码,答案是:能够设置。全部上面的参数均可以使用参数的形式进行设置,只须要在前面加上两个--
,好比对于fsid
能够执行:
ceph-deploy new blog --fsid xx-xx-xx-xxxx
复制代码
若是想要查看每一个执行可指定的参数,能够-h
:
[root@blog cluster]# ceph-deploy new -h
usage: ceph-deploy new [-h] [--no-ssh-copykey] [--fsid FSID]
[--cluster-network CLUSTER_NETWORK]
[--public-network PUBLIC_NETWORK]
MON [MON ...]
...
optional arguments:
-h, --help show this help message and exit
--no-ssh-copykey do not attempt to copy SSH keys
--fsid FSID provide an alternate FSID for ceph.conf generation
--cluster-network CLUSTER_NETWORK
specify the (internal) cluster network
--public-network PUBLIC_NETWORK
specify the public network for a cluster
复制代码
这里就能够看到能够指定--cluster-network
,--public-network
,等等,若是optional arguments
里面没有介绍这个参数,能够直接使用--xxarg
的方式指定,好比--overwrite-conf
,--verbose
等等,能不能设置这些参数,本身动手试一下就知道了。须要注意的是,参数的位置根据指令而异,好比--overwrite-conf
参数是跟在ceph-deploy
后面的,而--public-network
是跟在new
后面的:
ceph-deploy --overwrite-conf --verbose new blog --fsid a-a-a-a
[root@blog cluster]# cat ceph.conf |grep fsid
fsid = a-a-a-a
复制代码
若是非要在刚刚生成的ceph.conf里面添加什么的话,那么可能就要加public_network或者cluster_network了。那么这两个配置项有什么用呢?这里简单得介绍下Ceph的Public(外网或者叫公网或者前端网)和Cluster(内网或者叫集群网或者叫后端网)这两个网络,在Ceph中,存在如下三种主要的网络通信关系:
一般,咱们会将外网配置为千兆网,而内网配置成万兆网,这是有必定缘由的:
借用官网的这张图来讲明集群的网络走势:再假设你的节点有两个网段172.23.0.1和3.3.4.1,还记得咱们上一节ceph-deploy new
的时候是能够指定public_network
和cluster_network
的吗!若是不指定这两个参数,那么ceph-deploy怎么知道用哪一个IP做为这个节点的mon_host
的IP呢,其实他是随便选的,若是它选了172网段可是你想使用3.3网段做为这个节点的mon_host
的IP,那么只须要指定--public-network 172.23.0.0/24
就能够了,其中的/24
就至关于一个掩码,表示前面的IP的前24位,也就是172.23.0.XXX
,只要你的主机上有一个处于这个范围内的IP,那么就会选择这个IP做为公网IP。相似的,/16
表示范围:172.23.XXX.XXX
。 若是想指定内网IP,那么只要指定--cluster-network 3.3.4.1/24
就能够了。
**通常状况下,会在new生成的ceph.conf文件里加入public_network配置项以指定公网IP。固然你的MON主机上须要有至少一个IP在公网范围内。**除了在生成的ceph.conf
文件中加入公网IP的方式,咱们还可使用参数的方式来指定公网IP:
[root@ceph-1 cluster]# ceph-deploy new ceph-1 --public-network 172.23.0.0/24
[ceph_deploy.cli][INFO ] Invoked (1.5.36): /usr/bin/ceph-deploy new ceph-1 --public-network 172.23.0.0/24
[ceph_deploy.cli][INFO ] ceph-deploy options:
...
[ceph_deploy.cli][INFO ] public_network : 172.23.0.0/24
...
[ceph-1][DEBUG ] IP addresses found: [u'172.23.0.101', u'10.0.2.15']
[ceph_deploy.new][DEBUG ] Resolving host ceph-1
[ceph_deploy.new][DEBUG ] Monitor ceph-1 at 172.23.0.101
[ceph_deploy.new][DEBUG ] Monitor initial members are ['ceph-1']
[ceph_deploy.new][DEBUG ] Monitor addrs are [u'172.23.0.101']
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...
[root@ceph-1 cluster]# cat ceph.conf
[global]
fsid = d2a2bccc-b215-4f3e-922b-cf6019068e76
public_network = 172.23.0.0/24
mon_initial_members = ceph-1
mon_host = 172.23.0.101
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
复制代码
查看部署log能够发现参数配置已经生效,而这个节点有两个IP,public_nwtwork
这个参数限定了公网IP的搜索范围,生成的ceph.conf文件内也包含了public_network
这个参数。
这里只是简单的提一下这个小困惑,对于如下的两个参数书写方式,哪一种会有问题呢:
public_network = 172.23.0.1/24
public network = 172.23.0.1/24
osd_journal_size = 128
osd journal size = 128
复制代码
这两种参数的书写方式其实都是正确的,说究竟是由于底层调用的是Python的argparse
模块。这两种方式都是等效的,因此不须要担忧。
这一步坑哭了多少迫切加入Ceph世界的新人,看到的最多的就是5s,10s,10s, 15s,20s。。。而后报了错。再执行,再报错。因此这里给出如下的预检清单,若是被报错失败所烦恼,请认真执行各个子项,尤为是失败后要执行清理环境:
ceph:ceph
。参考部署前最后的确认一节。ceph-deploy new
生成的ceph.conf
内添加public_network
配置项,参考Public VS Cluster一节。这些总结来之不易,我帮过上百我的解决过部署问题和集群故障。我相信在认真确认过以后是确定能够经过的(反正前三点若是有问题通常是不会建好MON的,为何不认真确认下呢),我遇到过绝大多数都是由于防火墙没关,或者手动删除了一些目录,或者没有修改权限致使的问题。
相对来讲,新环境只要关了防火墙就能够一次性经过,旧环境或者失败的环境只要清理环境就能够经过了。
Q11. mon create-initial 作了什么
简单介绍下流程:
ceph-deploy读取配置文件中的
mon_initial_members
复制代码
的各个主机,而后依次SSH前往各个主机:
/etc/ceph/
目录下。/var/lib/ceph/mon/$cluster-$hostname/
目录。done
文件,若是有则直接跳到第6步。ceph.mon.keyring
拷贝到新节点,并利用该秘钥在MON目录下创建MON数据库。/var/run/ceph/$cluster-mon.$hostname.asok
SOCKET文件,这个是由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
指令结束。
我不喜欢讲怎么作,我愿意花很大的篇幅介绍为何会形成各类各样的问题,若是知道了缘由,你天然知道该怎么作,因此才会理解Ceph,而不是机械的去敲指令。
综合上面的全部小节,我来总结下这一步失败的基本上全部可能的缘由:
ctrl+z
去检查了。pubilc_network
,可是有个主机的全部IP都不在公网IP段内,那么这个MON是建很差的,由于没有IP用做MON使用,public_network
至关于一个过滤器。done
文件,MON数据库里面仍是记录着以前fsid,keyring等等,和新集群是两套彻底不一样的,因此这个节点的MON天然到达不了MON群体。/var/lib/ceph/mon
下的东西,而没有清理那些keyring,也有可能会由于收集了旧集群的秘钥而发生稀奇古怪的问题。/var/lib/ceph/mon
目录,或者其余的OSD目录或者/var/run/ceph
目录,而后又重建了目录,依然部署不上,是由于Jewel的全部Ceph指定都是运行在ceph:ceph
用户下的,天然不能在root权限目录下创建任何文件,修改权限便可。hostname
来命名至目录/var/lib/ceph/mon/${cluster}-${hostname}
的,而检测SOCKET文件则是用ceph.conf
里面的mon_initial_members
里面的名字来检测的 ,若是mon_initial_members
里面的名字和真是的主机名不一致,就会报错。 一旦你运行了ceph-deploy mon create-initial
指令,而且失败了,有极大的可能性已经在某些节点创建好了MON的数据库,再次执行可能会由于旧的环境致使再次失败,因此若是失败了,执行一下第二节中的清理环境
便可。清理完毕后,再执行ceph-deploy mon create-initial
。
相关阅读
此文已由做者受权腾讯云+社区发布,更多原文请点击
搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!
海量技术实践经验,尽在云加社区!