2023年11月29日发(作者:)
Ceph常见问题百科全书
Ceph是目前炙手可热的一个统一分布式存储系统,具有优异的性
能、可靠性、可扩展性。其可轻松扩展到数 PB 容量, 支持多种工作
负载的高性能(每秒输入/输出操作[IOPS]和带宽),具有极其高的可
靠性。Ceph对比HDFS优势在于易扩展,无单点。HDFS是专门为
Hadoop这样的云计算而生,在离线批量处理大数据上有先天的优势,
而Ceph是一个通用的实时存储系统,具有相当好的超大数量小文件
处理能力,且现在Hadoop可以利用Ceph作为存储后端。Ceph最
近加入到 Linux 中令人印象深刻的文件系统备选行列,能够在维护
POSIX 兼容性的同时加入了复制和容错功能,成为现在分布式系统的
掌上明珠。
而在Ceph系统的搭建过程中会出现种种意想不到问题,真的是
稀奇古怪的让人意想不到的问题,整个过程中看似每一步都正确,感
觉都对,结果还是出现各种问题,更可恨的是其中遇到的很多问题在
网上并不能搜索到,有的从国外论坛上能搜索到但是并没有答案(正
如硬件开发时候经常出现都对都不对,重启一下全都对的情况)。然
而对于Ceph这块重启并不能解决问题,还需一步一步踏踏实实的进
行研究,分析解决问题,并进行总结。
笔者在此对Ceph开发过程中的血泪经验在此与大家分享,对本
人在Ceph研发过程中遇到的错误进行记录并提出解决方案,一来是
做个总结,二来是为此后进行Ceph开发的大家指出雷区,使大家少
爬一点坑,希望能做出一点微小的贡献。
从基础环境开始在Ceph环境搭建过程中的常见问题有(在此按
照问题出现的频率进行粗略排序)采用系统为Centos7(谨以此作为
示例)
1. 执行命令:#ceph-deploy install admin-node node1
node2 node3
ERROR:[ceph_deploy][ERROR ]RuntimeError: Failed to
execute command: yum -y install epel-release
解决办法:进入/etc/.d中删除和epel-
2. 执行命令:#ceph-deploy install admin-node node1
node2 node3
ERROR:[ceph_deploy][ERROR ] RuntimeError: Failed to
execute command: rpm -Uvh --replacepkgs
解决办法:进入/etc/.d/文件将所有的源改
为网易163源,或者阿里源(经测试网易163源更好用点)编辑ceph
源的配置文件, vim /etc/.d/,更改为如下内容:
[Ceph]
name=Ceph packages for $basearch
baseurl= /ceph /rpm-
jewel/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey= /ceph /keys/
priority=1
[Ceph-noarch]
name=Ceph noarch packages
baseurl= /ceph /rpm-
jewel/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey= /ceph /keys/
priority=1
[ceph-source]
name=Ceph source packages
baseurl= /ceph /rpm-
jewel/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey= /ceph /keys/
priority=1
编辑完成之后保存退出并运行yum clean all && yum
makecache
Ceph官网提供的在一些情况下非常不好
用。在此建议使用网易yum
3. 执行命令:#ceph-deploy install admin-node node1
node2 node3
ERROR:[ceph_deploy][ERROR ] RuntimeError:
NoSectionError: No section: ‘ ceph’
解决办法:安装包冲突,直接移除已经安装的 rpm(把各个节点
的这个包都移除)
yum remove ceph-release -y
4. 执行命令:#ceph-deploy install admin-node node1
node2 node3
ERROR: [ceph1][INFO ] Running command: yum -y install
ceph ceph-radosgw
[ceph1][WARNIN] No data was received after 300 seconds,
disconnecting
[ceph_deploy][ERROR ] RuntimeError: Failed to execute
command: ceph --version
解决办法:同样是因为一些不明状况的网络问题,(官方网址总
是坑人),建议更换网易163源在重新试试
5. 执行命令:# ceph-deploy mon create-initial
ERROR:[ceph1][ERROR ] “ceph auth get-or-create for
keytype admin returned 1
解决办法: 中 public network 配置错误,和
mon_host 不在同一个网段。
配置正确的应该是: mon_host = 192.168.122.18
public network = 192.168.122.18/24
6. 执行命令:#ceph-deploy osd prepare node1:
/var/local/osd0 …
ERROR: error creating empty object store in /var/local/osd0:
(13) Permission denied
[admin-node][ERROR ] RuntimeError: command returned
non-zero exitstatus: 1
[ceph_deploy][ERROR ] RuntimeError: Failedto execute
command: /usr/sbin/ceph-disk -v activate --mark-init systemd --
mount/var/local/osd0
解决办法:权限不够 进入到各节点上运行
chmod 777 /var/local/osd0 或者 chmod –
R 777 /var/local/osd1/
chmod 777 /var/local/osd1
7. 执行命令:#ceph-deploy osd prepare node1:
/var/local/osd0 …
#ceph-deploy osd activate node1:/var/local/osd0 …
ERROR:要是在原有的osd基础之上重新prepare或者activate
osd的话,经常会出现already exist 或者[admin-node][ERROR ]
RuntimeError: command returned non-zero exitstatus: 1之类这样
的错误。
解决办法:产生此类错误的原因均为再重新安装Ceph的过程中
并未将原有的osd进行重新设置,其中还保存有原有的conf信息,并
且在集群conf中依旧保存的是原有信息。采用重写conf命令即可解
决,建议在重装ceph时均采用--overwrite-conf命令
#ceph-deploy --overwrite-conf osd prepare node1:
/var/local/osd0
#ceph-deploy --overwrite-conf osd activate node1:
/var/local/osd0
#ceph-deploy --overwrite-conf mon create-initial
8. ERROR:[admin-node][WARNIN] Anotherapp is
currently holding the yum lock; waiting for it to [admin-
node][WARNIN] Anotherapp is currently holding the yum lock;
waiting for it
解决办法:引发此问题的原因为上一次执行yum操作时由于网络
问题或者源头问题以及防火墙问题等引起上一次yum操作进程并未执
行结束,系统仍在执行该进程,解决办法为关闭此进程。网上博客介
绍采用rm -f /var/run/命令,但只有部分情况适用。终极必
杀技reboot,直接进行reboot,然后进来重新进行操作,包治百病,
屡试不爽。
rm -f /var/run/ 或者 reboot
9. ERROR:由于多次安装Ceph导致环境不知道哪里出了问题
(新旧错误都重叠在一块了)总之怎么样都不能正确进行安装,已经
心灰意冷,准备重新安装。
解决方案:再重新安装之前请留步,相信我环境混乱的情况下安
装出现问题最多的地方是ceph-deploy install admin-node node1
node2 node3 总之能不重新安装就别重新安装,这中间会引发很多
问题。
比较好一点的解决方案,清理Ceph环境,本文在此引用小胖的
大话Ceph 的环境清理!
如果之前部署失败了,不必删除ceph客户端,或者重新搭建虚拟
机,只需要在每个节点上执行如下指令即可将环境清理至刚安装完
ceph客户端时的状态!强烈建议在旧集群上搭建之前清理干净环境,
否则会发生各种异常情况。
ps aux|grep ceph |awk '{print $2}'|xargs kill -9
ps -ef|grep ceph
#确保此时所有ceph进程都已经关闭如果没有关闭,多执
行几次。
umount /var/lib/ceph/osd/*
rm -rf /var/lib/ceph/osd/*
rm -rf /var/lib/ceph/mon/*
rm -rf /var/lib/ceph/mds/*
rm -rf /var/lib/ceph/bootstrap-mds/*
rm -rf /var/lib/ceph/bootstrap-osd/*
rm -rf /var/lib/ceph/bootstrap-rgw/*
rm -rf /var/lib/ceph/tmp/*
rm -rf /etc/ceph/*
rm -rf /var/run/ceph/*
10. 执行命令:#ceph-deploy osd prepare node1:
/var/local/osd0 …
#ceph-deploy osd activate node1:/var/local/osd0 …
ERROR:can not find /etc/ceph/osd 或者can not find
/etc/ceph/mon等错误,运行完环境清理之后在进行Ceph安装部署
时仍然会出现很多问题,如在准备以及激活OSD时候会出现如上错误,
原因是清理环境时候将/ect/ceph/文件夹里边的所有东西都已经清理
啊干净,系统并不能找到合适的位置进行部署。
解决方案:自己手动在/etc/ceph/文件夹下创建osd mds mon等
文件夹
Sudo mkdir /etc/ceph/osd 其他两个如此。
11. 执行命令:ceph osd tree ceph -s ceph health ceph -
w
ERROR:系统卡住什么也不显示,只能手动切断该过程,所有
ceph有关命令全部失效。那么就会报错:ERROR: missing keyring。
也就是说,用户登陆 Ceph 系统失败! Error
connecting to cluster: ObjectNotFound
解决办法:错误原因位系统不能找到Client:
/etc/ceph/g。通常我们执行ceph -s 时,
就相当于开启了一个客户端,连接到 Ceph 集群,而这个客户端默认
是使用 的账户密码登陆连接集群的,所以平时执行的
ceph -s 相当于执行了 ceph -s --name --keyring
/etc/ceph/g。需要注意的是,每次我们在
命令行执行 Ceph 的指令,都相当于开启一个客户端,和集群交互,
再关闭客户端。
采用
12. 执行命令:
sudo yum update && sudo yum install ceph-deploy
ERROR: 在安装ceph-deploy工具时常见的错误有search for
fastest mirror 。。。 302 time out ,或者是404not found等因为
网络的原因无法下载。
解决办法:如problem 2所示更换网易163源
或者直接构建本地源来进行安装(在此采用阿里源)
mkdir -p /var/www/html/ceph/10.2.2
cd /var/www/html/ceph/10.2.2
wget /ceph/rpm-
wget /ceph/rpm-
wget /ceph/rpm-
wget /ceph/rpm-
wget /ceph/rpm-
jewel/el7/x86_64/7.x86_
jewel/el7/x86_64/7.x86_
jewel/el7/x86_64/7.x86_
jewel/el7/x86_64/7.x86_
jewel/el7/x86_64/7.x86_
wget /ceph/rpm-
wget /ceph/rpm-
wget /ceph/rpm-
jewel/el7/x86_64/7.x86_
wget /ceph/rpm-
wget /ceph/rpm-
wget /ceph/rpm-
wget /ceph/rpm-
wget /ceph/rpm-
wget /ceph/rpm-
wget /ceph/rpm-
wget /ceph/rpm-
wget /ceph/rpm-
wget /ceph/rpm-
wget /ceph/rpm-
wget /ceph/rpm-
e6: 1/1/1 up {0=node0=up:creating }, 1 up:standby
解决办法:产生此原因的问题为在ceph集群状态还没有达到
HEALTH_OK的状态下就执行ceph-deploy mds create node 的操作,
解决途径为等ceph状态为HEALTH_OK时在进行。
14. ERROR: HEALTH_ERR
health HEALTH_ERR 192 pgs stuck inactive; 192 pgs stuck
unclean; no osds monmap e1: 1 mons at
{essperf13=209.243.160.45:6789/0}, election epoch 1, quorum 0
essperf13 osdmap e205: 0 osds: 0 up, 0 in pgmap v928: 192 pgs,
3 pools, 0 bytes data, 0 objects 0 kB used, 0 kB / 0 kB avail 192
creating
解决办法:将各个节点上时间进行同步要不然会出现时间漂移错
误,使得mon检测的心跳信息出现问题,解决办法参考NTP服务器
时间同步
15. 启动关闭ceph或者查看ceph状态采用(启动start 关闭
stop 重启 restart 查看状态 status)
ceph重启mon命令以node4的mon为例
**************************************
ceph重启mon命令以node4的mon为例
******************************
ceph重启命令
systemctl restart
16. 重启ceph时应该先启动MON在启动OSD
17. Ceph pool 中的pg数只能从小到大,不能从大到小
18. Pg数应该合适,不宜过大或者过小 pg数计算公式为
Total PGs = ((Total_number_of_OSD * 100) /
max_replication_count) / pool_count
一、Monitor clock skew detected问题
问题描述:
Monitor clock skew detected
[root@admin-node my-cluster]# ceph -s
cluster a7f64266-0894-4f1e-a635-d0aeaca0e993
health HEALTH_ERR
16 pgs are stuck inactive for more than 300 seconds
16 pgs stuck inactive
16 pgs stuck unclean
monmap e1: 1 mons at {node1=192.168.57.141:6789/0}
election epoch 7, quorum 0 node1
osdmap e56: 4 osds: 4 up, 4 in
flags sortbitwise,require_jewel_osds
pgmap v4730: 136 pgs, 10 pools, 1928 bytes data, 173 obje
cts
19804 MB used, 38939 MB / 58744 MB avail
120 active+clean
16 creating
•
1
•
2
•
3
•
4
•
5
•
6
•
7
•
8
•
9
•
10
•
11
•
12
•
13
•
14
处理方法:
添加配置参数:
1 vim /etc/ceph/
2 mon clock drift allowed = 2
3 mon clock drift warn backoff = 30
同步配置文件 ceph-deploy –overwrite-conf node1
重启mon服务**************************************
问题总结:
本问题主要是mon节点服务器,时间偏差比较大导致,本次遇到
问题为测试环境,通过修改ceph对时间偏差阀值,规避的告警信息,
线上业务环境,需要排查服务器时间同步问题,修改时区为中国时区,
同时将所有机器时间进行同步。
二、rgw出现RequestTimeTooSkewed问题
问题描述:
在使用s3 browser 请求rgw的时候,通过抓包发现ceph rgw 出
现RequestTimeTooSkewed错误
-<Error>
<Code>RequestTimeTooSkewedCode>
<RequestId>tx000000032-005a041d16-ac66
-defaultRequestId>
<HostId>ac66-default-defaultHostId>
Error>
•
1
•
2
•
3
•
4
•
5
•
6
处理方法:
在 CentOS 7 中, 引入了一个叫 timedatectl 的设置程序.
用法很简单:
** # timedatectl # 查看系统时间方面的各种状态
timedatectl list-timezones # 列出所有时区
timedatectl set-local-rtc 1 # 将硬件时钟调整为与本地时钟一致,
0 为设置为 UTC 时间
timedatectl set-timezone Asia/Shanghai # 设置系统时区为上
海**
问题总结:
centos需要设置时区(默认英文版本时区为DST) 会导致rgw
请求的时候出现RequestTimeTooSkewed错误。修改为中国时区后,
同步时间后即可正常。
mon故障
mon无法启动
•
现象描述
因为某些原因,导致ceph-mon无法启动。ceph-mon 无法启动,
原因可能是mointor level db 损坏,数据的丢失等。在OS 正常的情
况下(osd运行正常),只是ceph-mon 无法启动。
这种情况下,剔除节点然后再 加入,会导致数据的2次均衡,如
果数据量大,耗时比较久。所以,可以通过重建ceph-mon的方式来
实现
•
处理
1,在当前节点,停掉ceph-mon,导出monmap,然后通过
monmaptool工具手动修改 monmap,修改完 再导入到 剩余的mon
map里,最后通过ceph mon dump验证是否删除成功
ceph-mon -i {mon-id} --extract-monmap {map-path}
# for example,
ceph-mon -i a --extract-monmap /tmp/monmap
monmaptool {map-path} --rm {mon-id}
#for example
monmaptool /tmp/monmap --rm b
ceph-mon -i {mon-id} --inject-monmap {map-path}
# for example,
ceph-mon -i a --inject-monmap /tmp/monmap
2,删除成功后,开始重新添加 ,通过ceph-mon leader 导出 现
有的monmap
ceph -m 10.10.10.62 mon getmap -o monmap
3,在/data/目录生成ceph-mon 目录,mon-id 是5个字符串,
ceph-mon -i wsgws --mkfs --monmap monmap
4,将新的ceph-mon 加入monmap
ceph mon add wsgws 10.10.10.61:6789
4,重启 ezs3-agent 会将 新的mon加入到
OSD故障
FAILED assert(0 == "unexpected error")
•
现象描述
ceph 0.67版本,osd的日志中有 如下报错
-3> 2017-10-18 16:44:55.365325 7fdb5a6c0bc0 0 filestore(/
data/osd.13) error (39) Directory not empty not handled on op
eration 21 (28581659019.0.0, or op 0, counting from 0)
-2> 2017-10-18 16:44:55.365340 7fdb5a6c0bc0 0 filestore(/
data/osd.13) ENOTEMPTY suggests garbage data in osd data di
r
-1> 2017-10-18 16:44:55.365343 7fdb5a6c0bc0 0 filestore(/
data/osd.13) transaction dump:
{ "ops": [
{ "op_num": 0,
"op_name": "rmcoll",
"collection": "24.36_TEMP"}]}
0> 2017-10-18 16:44:55.367380 7fdb5a6c0bc0 -1 os/FileSto
: In function 'unsigned int FileStore::_do_transaction(Object
Store::Transaction&, uint64_t, int)' thread 7fdb5a6c0bc0 time 20
17-10-18 16:44:55.365391
os/: 2471: FAILED assert(0 == "unexpected error
")
•
处理
可以看到日志 提示 24.36_TEMP 中存在垃圾数据,手动进入该目
录,发现有个文件,删除即可。
unfound object处理
•
现象描述
ceph 0.67的版本,osd故障恢复后,发现集群有2个unfound
object
•
处理
1,确认unfoud 所在pg
root@Storage-b6:/etc/cron.d# ceph health detail |grep
unfound
HEALTH_WARN 1219 pgs backfill; 1 pgs backfilling; 1079 pgs
degraded; 2 pgs recovering; 1222 pgs stuck unclean; recovery
3661003/50331903 degraded (7.274%); 3/25061739 unfound
(0.000%); recovering 5 o/s, 25439KB/s; noout flag(s) set
pg 17.2c3 is active+recovering+degraded, acting [20,2], 1
unfound
pg 17.2b1 is active+recovering+degraded, acting [20,2], 2
unfound
unable to open OSD superblock on /data/osd.2
2,如果想要确认具体是哪些 object,可以用
ceph pg 17.2b1 list_missing
3,标记object
ceph pg 2.5 mark_unfound_lost revert
这个命令不一定是 roll back,如果object 是新的,ceph object
有版本信息吗?
•
参考
/
unable to open OSD superblock on /data/osd
•
现象描述
2017-10-10 12:00:15.534831 7fda0e7b97c0 -1 ^[[0;31m **
ERROR: unable to open OSD superblock on /data/osd.2: (2) No
such file or directory^[[0m
2017-10-10 14:14:58.196144 7f71363c27c0 0 ceph version
0.94.9-1061-g9bcd143
(9bcd143a70b819086b9e58e0799ba93364d7ee31), process
ceph-osd, pid 7250
2017-10-10 14:14:58.198476 7f71363c27c0 -1 ^[[0;31m **
ERROR: unable to open OSD superblock on /data/osd.2: (2) No
such file or directory^[[0m
该报错说明osd盘并没有mount上,所以superblock文件无法
打开(superblock ),df -h检查 osd盘确实没有mount上。
检查/var/log/中有如下报错
Oct 10 14:14:54 142 kernel: [ 120.133734] EXT4-fs (dm-0):
ext4_check_descriptors: Checksum for group 32640 failed
(58283!=0)
Oct 10 14:14:54 142 kernel: [ 120.133739] EXT4-fs (dm-0):
group descriptors corrupted!
Oct 10 14:14:54 142 kernel: [ 120.214674] EXT4-fs (dm-1):
ext4_check_descriptors: Inode bitmap for group 34688 not in
group (block 2037277037)!
Oct 10 14:14:54 142 kernel: [ 120.214679] EXT4-fs (dm-1):
group descriptors corrupted!
tune2fs 检查dm设备,发现并没有EXT-4 错误记录,也说明
tune2fs 也有不及时的时候。
•
处理方法
e2fsck -p /dev/dm-0 提示不行
e2fsck -y /dev/dm-0 进行勉强修复,后面需要reformat osd进
行彻底修复
•
原因说明
检查disk cache policy是disabled的,之前设备关机有强制关
机(raid卡passthrough的converger环境)
mds故障
mds/: 216: FAILED
assert(inode_(in->vino()) == 0)
mds 状态为replay,一直无法恢复,ceph 的版本为 0.67的老版
本
-4> 2017-10-06 21:21:23.199440 7f5c63631700 0
(609) _fetched badness: got (but i already had) [inode 100
0004e2b0 [2,head] /shareroot/block-hz/routinebackup/2017-09
-29/log/check_img.5b8ebf83-30c9-4
g auth v296 s=0 n(v0 1=1+0) (iversion lock) 0x368f050] mode 3
3188 mtime 2017-09-29 05:09:03.364737
-3> 2017-10-06 21:21:23.199470 7f5c63631700 0 log [ERR]
: loaded dup inode 1000004e2b0 [2,head] v4917497405 at ~md
s0/stray9/1000004e2b0, but inode v296 alre
ady exists at /shareroot/block-hz/routinebackup/2017-09-29/lo
g/check_img.5b8ebf83-30c9-4
-2> 2017-10-06 21:21:23.199478 7f5c63631700 0
(609) _fetched badness: got (but i already had) [inode 100
0004e2b1 [2,head] /shareroot/block-hz/routinebackup/2017-09
-29/log/check_45b4c0-717f-4ae4-b709-0
auth v298 s=0 n(v0 1=1+0) (iversion lock) 0x3695590] mode 33
188 mtime 2017-09-29 05:09:03.413889
-1> 2017-10-06 21:21:23.199500 7f5c63631700 0 log [ERR]
: loaded dup inode 1000004e2b1 [2,head] v4917497407 at ~md
s0/stray9/1000004e2b1, but inode v298 alre
ady exists at /shareroot/block-hz/routinebackup/2017-09-29/lo
g/check_45b4c0-717f-4ae4-b709-0
0> 2017-10-06 21:21:23.201731 7f5c63631700 -1 mds/MDC
: In function 'void MDCache::add_inode(CInode*)' thread
7f5c63631700 time 2017-10-06 21:21:23.199831
mds/: 216: FAILED assert(inode_(in->
vino()) == 0)
•
处理方法
中 加入可以把mds config:
mds_wipe_ino_prealloc=true
重启mds,然后 再 删除该配置项
mds/: 1397: FAILED
assert(mds->n == cmapv)
active mds 的log 中有该assert
•
处理方法
因为ceph 的版本0.67,重新 build 了mds 的binary,拿掉 该
assert


发布评论