最近按照ceph的官方文档来部署ceph,发现遇到了不少的问题,其中很多问题都是安装部署的时候遇到的坑,在这里提出来和大家一起分享探讨,如有不足之处欢迎评论。
存储集群部署
在controllernode上我们使用刚刚创建出来的普通用户Bob_Hou来登录,在该普通用户的家目录下创建一个用于我们来部署ceph是存放ceph-deploy释放出来文件的的目录。
mkdir /home/Bob_Hou/my-cluster
cd ./my-cluster/
禁用 requiretty
在某些发行版(如 CentOS )上,执行 ceph-deploy 命令时,如果你的 Ceph 节点默认设置了 requiretty 那就会遇到报错。可以这样禁用此功能:执行 sudo visudo ,找到 Defaults requiretty 选项,把它改为Defaults:ceph !requiretty ,这样 ceph-deploy 就能用 ceph 用户登录并使用 sudo 了。
每个ceph节点都需要执行。
visudo
Defaults:ceph !requiretty
否则会报错 IOError cannot send (already closed)
创建集群
清除信息操作
再创建集群前如果在某些地方碰到麻烦,想从头再来,可以用下列命令清除配置:
ceph-deploy purge {ceph-node} [{ceph-node}](连ceph安转包一起清除)
ceph-deploy purgedata {ceph-node} [{ceph-node}] (清楚各个节点上残留的配置文件)
ceph-deploy forgetkeys(清除秘钥环信息)
在管理节点上,进入刚创建的放置配置文件的my_cluster目录,用 ceph-deploy 执行如下步骤。
ceph-deploy new ceph-1(这里我们先用ceph-1作为mon的节点)
在当前目录下用 ls 和 cat 检查 ceph-deploy 的输出,应该有一个 Ceph 配置文件、一个 monitor 密钥环和一个日志文件。ls可以看到有ceph的配置文件个和mon的秘钥环。
修改ceph.conf配置文件
把 Ceph 配置文件里的默认副本数从 3 改成 2 ,这样只有两个 OSD 也可以达到 active + clean 状态。把下面这行加入 [global] 段:
osd pool default size = 2
如果你有多个网卡,可以把 public network 写入 Ceph 配置文件的 [global] 段下:
public network = 192.168.1.0/24
如果是3.10的内核请把这个加上:
rbd_default_features = 1
安装ceph,所有节点都必须安装
ceph-deploy install ceph-1 ceph-2 ceph-3 controllernode
错误1:sudo: sorry, you must have a tty to run sudo
这个需要你把visudo中的requiretty选项配置。
错误2:sudo: no tty present and no askpass program specified
由于账号没有开启免密码导致。
错误3:yum安装超时
请参照之前的文档来修改下你的yum源。或者在每个节点上预先执行yum安装命令,如果预先执行了yum安装了ceph的话,这里脚本检测到你有软件包就会跳过安装步骤。
错误4:解析yum安装地址出错
检查/etc/resolv.conf 域名解析。
配置初始monitors,并收集所有秘钥
ceph-deploy mon create-initial
当这一步操作成功完成之后my_cluster会成功出现下面的秘钥环
如果你之前安装过ceph但是没有及时清理掉配置文件的话,初始化监控会报错。会说已有的配置文件已经存在,需要使用–overwirte-conf来强制替换文件。
ceph-deploy mon create-initial --overwrite-conf
添加三个 OSD
为了快速安装,这里我们使用文件夹形式来添加OSD而不是以硬盘。
ssh ceph-1
mkdir /ceph-1
chown -R ceph:ceph /ceph-1/
ssh ceph-2
mkdir /ceph-2
chown -R ceph:ceph /ceph-2/
ssh ceph-3
mkdir /ceph-3
chown -R ceph:ceph /ceph-3/
然后,从管理节点执行 ceph-deploy 来准备 OSD,并且激活。
ceph-deploy osd prepare ceph-1:/ceph-1 ceph-2:/ceph-2 ceph-3:/ceph-3
ceph-deploy osd activate ceph-1:/ceph-1 ceph-2:/ceph-2 ceph-3:/ceph-3
部署jewel版本osd激活权限报错:
[ceph_deploy.osd][DEBUG ] activating host ceph-2 disk /ceph-2
[ceph_deploy.osd][DEBUG ] will use init type: systemd [ceph-2][DEBUG ]
find the location of an executable [ceph-2][INFO ] Running command:
/usr/sbin/ceph-disk -v activate –mark-init systemd –mount /ceph-2
[ceph-2][WARNIN] main_activate: path = /ceph-2 [ceph-2][WARNIN]
activate: Cluster uuid is 5cdb403b-af80-4c98-bacc-edd800024cdf
[ceph-2][WARNIN] command: Running command: /usr/bin/ceph-osd
–cluster=ceph –show-config-value=fsid [ceph-2][WARNIN] activate: Cluster name is ceph [ceph-2][WARNIN] activate: OSD uuid is
a0dc326a-e5ac-438c-8214-a5f74006156e [ceph-2][WARNIN] allocate_osd_id:
Allocating OSD id… [ceph-2][WARNIN] command: Running command:
/usr/bin/ceph –cluster ceph –name client.bootstrap-osd –keyring
/var/lib/ceph/bootstrap-osd/ceph.keyring osd create –concise
a0dc326a-e5ac-438c-8214-a5f74006156e [ceph-2][WARNIN] command: Running
command: /usr/sbin/restorecon -R /ceph-2/whoami.12486.tmp
[ceph-2][WARNIN] command: Running command: /usr/bin/chown -R ceph:ceph
/ceph-2/whoami.12486.tmp [ceph-2][WARNIN] activate: OSD id is 0
[ceph-2][WARNIN] activate: Initializing OSD… [ceph-2][WARNIN]
command_check_call: Running command: /usr/bin/ceph –cluster ceph
–name client.bootstrap-osd –keyring /var/lib/ceph/bootstrap-osd/ceph.keyring mon getmap -o
/ceph-2/activate.monmap [ceph-2][WARNIN] got monmap epoch 1
[ceph-2][WARNIN] command: Running command: /usr/bin/timeout 300
ceph-osd –cluster ceph –mkfs –mkkey -i 0 –monmap
/ceph-2/activate.monmap –osd-data /ceph-2 –osd-journal
/ceph-2/journal –osd-uuid a0dc326a-e5ac-438c-8214-a5f74006156e
–keyring /ceph-2/keyring –setuser ceph –setgroup ceph [ceph-2][WARNIN] Traceback (most recent call last): [ceph-2][WARNIN]
File “/usr/sbin/ceph-disk”, line 9, in [ceph-2][WARNIN]
load_entry_point(‘ceph-disk==1.0.0’, ‘console_scripts’, ‘ceph-disk’)()
[ceph-2][WARNIN] File
“/usr/lib/python2.7/site-packages/ceph_disk/main.py”, line 5009, in
run [ceph-2][WARNIN] main(sys.argv[1:]) [ceph-2][WARNIN] File
“/usr/lib/python2.7/site-packages/ceph_disk/main.py”, line 4960, in
main [ceph-2][WARNIN] args.func(args) [ceph-2][WARNIN] File
“/usr/lib/python2.7/site-packages/ceph_disk/main.py”, line 3329, in
main_activate [ceph-2][WARNIN] init=args.mark_init,
[ceph-2][WARNIN] File
“/usr/lib/python2.7/site-packages/ceph_disk/main.py”, line 3149, in
activate_dir [ceph-2][WARNIN] (osd_id, cluster) = activate(path,
activate_key_template, init) [ceph-2][WARNIN] File
“/usr/lib/python2.7/site-packages/ceph_disk/main.py”, line 3254, in
activate [ceph-2][WARNIN] keyring=keyring, [ceph-2][WARNIN] File
“/usr/lib/python2.7/site-packages/ceph_disk/main.py”, line 2747, in
mkfs [ceph-2][WARNIN] ‘–setgroup’, get_ceph_group(),
[ceph-2][WARNIN] File
“/usr/lib/python2.7/site-packages/ceph_disk/main.py”, line 2694, in
ceph_osd_mkfs [ceph-2][WARNIN] raise Error(‘%s failed : %s’ %
(str(arguments), error)) [ceph-2][WARNIN] ceph_disk.main.Error: Error:
[‘ceph-osd’, ‘–cluster’, ‘ceph’, ‘–mkfs’, ‘–mkkey’, ‘-i’, u’0’,
‘–monmap’, ‘/ceph-2/activate.monmap’, ‘–osd-data’, ‘/ceph-2’,
‘–osd-journal’, ‘/ceph-2/journal’, ‘–osd-uuid’,
u’a0dc326a-e5ac-438c-8214-a5f74006156e’, ‘–keyring’,
‘/ceph-2/keyring’, ‘–setuser’, ‘ceph’, ‘–setgroup’, ‘ceph’] failed :
2017-02-05 23:38:31.647941 7f3664382800 -1 filestore(/ceph-2) mkfs:
write_version_stamp() failed: (13) Permission denied [ceph-2][WARNIN]
2017-02-05 23:38:31.647978 7f3664382800 -1 OSD::mkfs:
ObjectStore::mkfs failed with error -13 [ceph-2][WARNIN] 2017-02-05
23:38:31.648077 7f3664382800 -1 ** ERROR: error creating empty object
store in /ceph-2: (13) Permission denied [ceph-2][WARNIN]
[ceph-2][ERROR ] RuntimeError: command returned non-zero exit status:
1 [ceph_deploy][ERROR ] RuntimeError: Failed to execute command:
/usr/sbin/ceph-disk -v activate –mark-init systemd –mount /ceph-2
解决办法:
解决办法很简单,将ceph集群需要使用的所有磁盘权限,所属用户、用户组改给ceph。
chown -R ceph:ceph /ceph-3/
chown -R ceph:ceph /ceph-2/
注意如果你之前部署过ceph但是没有完全清除残留数据的话重新部署OSD的时候会有报错。
查看此时keyring
ceph auth list
再查看ceph-2上bootstrap-osd的keyring值。
你会发现之前部署残留的配置文件还在,需要把里面的key值修改为现有你在部署的keyring值。
用 ceph-deploy 把配置文件和 admin 密钥拷贝到管理节点和 Ceph 节点,这样你每次执行 Ceph 命令行时就无需指定 monitor 地址和 ceph.client.admin.keyring 了。ceph-deploy 和本地管理主机( admin-node )通信时,必须通过主机名可达。
#ceph-deploy admin controllernode ceph-1 ceph-2 ceph-3
确保你对 ceph.client.admin.keyring 有正确的操作权限。
chmod +r /etc/ceph/ceph.client.admin.keyring
添加monitors
ceph存储集群需要至少一个monitor才能运行。未达到高可用,典型的ceph存储集群会运行多个monitors,这样在单个monitor失败时不会影响ceph存储集群的可用性。ceph使用PASOX算法,此算法要求有多半monitor(即1,2:3.3:4.3:5,4:6)形成法定人数。
新增两个监视器到ceph集群:
ceph-deploy mon add ceph-2
ceph-deploy mon add ceph-3
新增monitor后,ceph会自动开始同步并形成法定人数,可以用下面的命令来检查法定人数状态:
#ceph quorum_status --format json-pretty
{
"election_epoch": 6,
"quorum": [
0,
1,
2
],
"quorum_names": [
"ceph-1",
"ceph-2",
"ceph-3"
],
"quorum_leader_name": "ceph-1",
"monmap": {
"epoch": 3,
"fsid": "c2f1de7a-ece6-4b4c-8253-272fed45075c",
"modified": "2017-03-06 14:16:22.712704",
"created": "2017-03-06 13:57:50.832909",
"mons": [
{
"rank": 0,
"name": "ceph-1",
"addr": "192.168.1.9:6789\/0"
},
{
"rank": 1,
"name": "ceph-2",
"addr": "192.168.1.10:6789\/0"
},
{
"rank": 2,
"name": "ceph-3",
"addr": "192.168.1.12:6789\/0"
}
]
}
}
当你的ceph集群运行着多个monitor时,各个monitor主机上应该配置NTP,而且要确保这些monitor位于NTP服务同一级。
创建块设备
.确认使用了合适的内核版本
#lsb_release -a
uname -r
2.在管理节点上,通过ceph-deploy吧ceph安装到ceph-client节点
这一步官档给的不是很有必要,因为之前已经执行过了
#ceph-deploy install ceph-celint
3.在管理节点上,用ceph-deploy把Ceph配置文件和ceph.client.admin.keyting拷贝到ceph-client。
同上,这部之前已经执行不需要考虑再执行
#ceph-deploy admin ceph-client
ceph-deploy 工具会把密钥环复制到 /etc/ceph 目录,要确保此密钥环文件有读权限(如 sudochmod +r /etc/ceph/ceph.client.admin.keyring )
配置块设备
1.创建一个名为foo的rbd设备
#rbd create foo --size 4096 -m 192.168.1.9 -k /etc/ceph/ceph.client.admin.keyring
2.在ceph-client节点上,把image映射为块设备
rbd map foo -n client.admin -m 192.168.1.9,192.168.1.10,192.168.1.12 -k /etc/ceph/ceph.client.admin.keyring
在map块设备时候报错:
查看当前内核版本
[root@ceph-1 ceph-1]# uname -r
3.10.0-123.el7.x86_64
这里有两个办法,之前已经提到过如果你的内核版本为3.10的话我们可以通过降低ceph块设备的功能来使得内核支持,或者通过设计内核的办法来满足J版本rbd的功能。
首先说一下升级内核的方法
1.导入key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
2.安装elrepo的yum源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
- 安装内核
yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y
4.查看设置默认启动顺序
awk -F \' '$1=="menuentry "{print $2}' /etc/grub2.cfg
显示结果应该是升级后的最新版本的内核在上面,执行以下命令:
grub2-set-default 0
5.重启
reboot
查看内核支持rbd模块
[root@ceph-1 ~]# lsmod | grep rbd
rbd 86016 0
libceph 294912 1 rbd
第二种办法就是关闭一些rbd的功能,来使得3.10的内核能够支持。详情请见
rbd: image foo: image uses unsupported features: 0x38
在ceph-client节点上,创建文件系统后就可以使用块设备了
格式化磁盘
#mkfs.ext4 -m0 /dev/rbd/rbd/foo
在ceph-client节点上挂载此文件系统
sudo mkdir /mnt/ceph-block-device
sudo mount /dev/rbd/rbd/foo /mnt/ceph-block-device
cd /mnt/ceph-block-device
文件系统的创建
1.创建元数据服务器
至少需要一个元数据服务器才能使用CephFS,执行下列命令创建元数据服务器:
#ceph-deploy mds create ceph-1
当前生产环境下的ceph只能运行一个元数据服务器。你可以配置多个,但现在我们还不会为多个元数据服务器的集群提供商业支持。
添加RGW例程
要使用ceph的ceph对象网关,必须部署RGW例程。用下列方法创建新的RGW例程:
#ceph-deploy rgw create ceph-1
注意:这个功能是Hammer版和ceph-deploy v1.5.23才开始有的
RGW例程默认会监听7480端口,可以更改该节点ceph.conf内与RGW相关的配置。
这里我们到ceph-1下,进入/etc/ceph/ceph.conf
[client]
rgw frontends = civeweb port=80
2.创建文件系统
虽然已经创建了元数据服务器,但如果你没有创建存储池和文件系统,他是不会变为活动状态的。
虽然已创建了元数据服务器(存储集群快速入门),但如果你没有创建存储池和文件系统,它是不会变为活动状态的。
#ceph osd pool create cephfs_data <pg_num>
#ceph osd pool create cephfs_metadata <pg_num>
#ceph fs new <fs_name> cephfs_metadata cephfs_data
3.创建密钥文件
Ceph 存储集群默认启用认证,你应该有个包含密钥的配置文件(但不是密钥环本身)。用下述方法获取某一用户的密钥:
-
在密钥环文件中找到与某用户对应的密钥,例如:
cat ceph.client.admin.keyring -
找到用于挂载 Ceph 文件系统的用户,复制其密钥。大概看起来如下所示:
[client.admin]
key = AQCj2YpRiAe6CxAA7/ETt7Hcl9IyxyYciVs47w==
-
打开文本编辑器。
-
把密钥粘帖进去,大概像这样:
AQCj2YpRiAe6CxAA7/ETt7Hcl9IyxyYciVs47w== -
保存文件,并把其用户名 name 作为一个属性(如 admin.secret )。
-
确保此文件对用户有合适的权限,但对其他用户不可见。
内核驱动
把 Ceph FS 挂载为内核驱动。
sudo mkdir /mnt/mycephfs
sudo mount -t ceph {ip-address-of-monitor}:6789:/ /mnt/mycephfs
Ceph 存储集群默认需要认证,所以挂载时需要指定用户名 name 和创建密钥文件一节中创建的密钥文件 secretfile ,例如:
sudo mount -t ceph 192.168.0.1:6789:/ /mnt/mycephfs -o name=admin,secretfile=admin.secret
Ceph 存储集群默认要求认证,需指定相应的密钥环文件,除非它在默认位置(即 /etc/ceph ):
#sudo ceph-fuse -k ./ceph.client.admin.keyring -m 192.168.0.1:6789 ~/mycephfs
CEPH 对象存储快速入门
从 firefly(v0.80)起,Ceph 存储集群显著地简化了 Ceph 对象网关的安装和配置。网关守护进程内嵌了 Civetweb,无需额外安装 web 服务器或配置 FastCGI。此外,可以直接 使用 ceph-deploy 来安装网关软件包、生成密钥、配置数据目录以及创建一个网关实例。
Tip Civetweb 默认使用 7480 端口。要么直接打开 7480 端口,要么在你的 Ceph 配置文件中设置首选端口(例如 80 端口)。
要使用 Ceph 对象网关,请执行下列步骤:
安装 CEPH 对象网关
-
在 client-node 上执行预安装步骤。如果你打算使用 Civetweb 的默认端口 7480 ,必须通过 firewall-cmd 或iptables 来打开它。详情见预检。
-
从管理节点的工作目录,在 client-node 上安装 Ceph 对象网关软件包。例如:
-
ceph-deploy install –rgw [ …]
新建 CEPH 对象网关实例
从管理节点的工作目录,在 client-node 上新建一个 Ceph 对象网关实例。例如:
#ceph-deploy rgw create
一旦网关开始运行,你就可以通过 7480 端口来访问它(比如
http://client-node:7480
)。
配置 CEPH 对象网关实例
-
通过修改 Ceph 配置文件可以更改默认端口(比如改成 80 )。增加名为 [client.rgw.] 的小节,把 替换成你自己 Ceph 客户端节点的短名称(即 hostname -s 的输出)。例如,你的节点名就是client-node ,在 [global] 节后增加一个类似于下面的小节:
-
[client.rgw.client-node]rgw_frontends = “civetweb port=80”
-
Note 确保在 rgw_frontends 键值对的 port= 中没有空格。
-
为了使新端口的设置生效,需要重启 Ceph 对象网关。
sudo systemctl restart ceph-radosgw.service -
你应该可以生成一个未授权的请求,并收到应答。例如,一个如下不带参数的请求:
http://:80
应该收到这样的应答:
<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>anonymous</ID>
<DisplayName></DisplayName>
</Owner>
<Buckets>
</Buckets>
</ListAllMyBucketsResult>