CEPH状态检查-故障定位
常见故障定位诊断的手段:
监视器
运行日志
套接字管理
诊断信息
监视器
检查集群状态:
ceph -s
cluster:
id: f60e6370-14ff-44cc-b99c-70b17df8549c
health: HEALTH_OK
services:
mon: 1 daemons, quorum ecos75r018-meijia-31-161 (age 2w)
mgr: ecos75r018-meijia-31-161(active, since 4w)
osd: 3 osds: 3 up (since 100m), 3 in (since 17h)
data:
pools: 2 pools, 192 pgs
objects: 47.70k objects, 184 GiB
usage: 552 GiB used, 2.5 TiB / 3.0 TiB avail
pgs: 192 active+clean
ceph health or ceph health detail
HEALTH_OK
HEALTH_OK表示集群状态健康,出现HEALTH_WARN甚至HEALTH_ERR表示集群处于非正常状态
检查osd节点状态:
ceph osd tree or ceph osd status
ceph osd tree:
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 3.00000 root default
-7 1.00000 host ecos75r018-meijia-31-161
2 hdd 1.00000 osd.2 up 1.00000 1.00000
-3 1.00000 host ecos75r018-meijia-31-162
0 hdd 1.00000 osd.0 up 1.00000 1.00000
-5 1.00000 host ecos75r018-meijia-31-163
1 hdd 1.00000 osd.1 up 1.00000 1.00000
ceph osd status:
+----+--------------------------+-------+-------+--------+---------+--------+---------+-----------+
| id | host | used | avail | wr ops | wr data | rd ops | rd data | state |
+----+--------------------------+-------+-------+--------+---------+--------+---------+-----------+
| 0 | ecos75r018-meijia-31-162 | 183G | 840G |0 | 0 |3 | 0 | exists,up |
| 1 | ecos75r018-meijia-31-163 | 183G | 840G |0 | 0 |0 | 0 | exists,up |
| 2 | ecos75r018-meijia-31-161 | 183G | 840G |0 | 0 |0 | 0 | exists,up |
+----+--------------------------+-------+-------+--------+---------+--------+---------+-----------+
状态为UP表示正常,为down表示异常
运行日志
如果没有改默认路径,可以在/var/log/ceph/下找到运行日志
ls /var/log/ceph
如果设置了日志路径,在log_file参数指定的路径下查看运行日志
套接字管理
通过套接字管理可以检索运行时的信息,套接字列表:
ls /var/run/ceph
[root@ecos75r018-meijia-31-163 ceph]# ls /var/run/ceph/
ceph-osd.1.asok
列出所有可查看的运行信息:
ceph daemon osd.1 help
or
ceph daemon {socket-file} help
例如查看运行时的配置参数:
ceph daemon osd.1 config show
ceph daemon osd.1 config show | grep mon_osd_full_ratio
诊断信息
要查看诊断信息,配合less、more、grep或tail使用dmesg,例如:
dmesg | grep scsi
故障处理前置操作
停止自动重均衡
在你周期性地维护集群的子系统、或解决某个失败域的问题(如一机架)。如果你不想在停机维护OSD时让CRUSH自动重均衡,需提前设置noout:
ceph osd set noout
在集群上设置noout后,你就可以停机维护失败域内的OSD了
stop ceph-osd id={num}
Note:在定位同一故障域内的问题时,停机 OSD 内的归置组状态会变为 degraded
维护结束后,重启OSD
start ceph-osd id={num}
最后,解除 noout 标志
ceph osd unset noout
OSD没运行
通常情况下,简单的重启ceph-osd进程就可以重回集群并恢复数据
systemctl restart ceph-osd@{osd-id}.service
or
systemctl restart ceph-osd@{hostname}.service
OSD启动失败
如果你重启了集群,但其中一个OSD起不来,依次检查:
配置文件:如果你新装的 OSD 不能启动,检查下配置文件,确保它合理性(比如host而非hostname,等等);
检查路径:检查你配置的路径,以及它们自己的数据和日志路径。如果你分离了 OSD 数据和日志、而配置文件和实际挂载点存在出入,启动 OSD 时就可能出错。如果你想把日志存储于一个块设备,应该为日志硬盘分区并为各 OSD 分别分配一分区。
检查最大线程数:如果你的节点有很多 OSD ,也许就会触碰到默认的最大线程数限制(如通常是32k个),尤其是在恢复期间。你可以用 sysctl 增大线程数,把最大线程数更改为支持的最大值(即 4194303),看看是否有用。例如:
sysctl -w kernel.pid_max=4194303
如果增大最大线程数解决了这个问题,你可以把此配置 kernel.pid_max 写入配置文件 /etc/sysctl.conf,使之永久生效,例如:
kernel.pid_max = 4194303
内核版本:确认你在用的内核版本以及所用的发布版。Ceph 默认依赖一些第三方工具,这些工具可能有缺陷或者与特定发布版和/或内核版本冲突(如 Google perftool )。检查下操作系统推荐确保无内核问题。
OSD服务挂掉
ceph-osd 挂掉时,监视器可通过活着的 ceph-osd 了解到此情况,且通过 ceph health 命令报告:
ceph health
HEALTH_WARN 1/3 in osds are down
而且,有 ceph-osd 进程标记为 in 且 down 的时候,你会得到警告,你可以用下面的命令得知哪个 ceph-osd 进程挂了:
ceph health detail
HEALTH_WARN 1/3 in osds are down
osd.0 is down since epoch 23, last address 192.168.106.220:6800/11080
如果是硬盘问题或其它错误使 ceph-osd 不能正常运行或重启,查看日志文件/var/log/ceph/中的错误信息。
如果守护进程因心跳失败、或者底层文件系统无响应而停止,查看dmesg获取硬盘或者内核错误。
磁盘没有剩余空间
Ceph 不允许向写满的OSD写入数据,以免丢失数据。在运营着的集群中,你应该能收到集群空间将满的警告。mon osd full ratio 默认为 0.95 、或达到 95% 时它将阻止客户端写入数据。mon osd nearfull ratio 默认为 0.85 、也就是说达到容量的 85% 时它会产生健康警告。
满载集群问题一般产生于测试 Ceph 在小型集群上如何处理 OSD 失败时。当某一节点利用率较高时,集群能够很快掩盖将满和占满率。如果你在测试小型集群上的 Ceph 如何应对 OSD 失败,应该保留足够的空间,然后试着临时降低 mon osd full ratio 和 mon osd nearfull ratio 值。
ceph health 会显示将满的 ceph-osds :
ceph health
HEALTH_WARN 1 nearfull osds
osd.2 is near full at 85%
或者:
ceph health
HEALTH_ERR 1 nearfull osds, 1 full osds
osd.2 is near full at 85%
osd.3 is full at 97%
处理这种情况的最好方法就是增加新的ceph-osd,这允许集群把数据重分布到新OSD里。
如果因满载而导致OSD不能启动,你可以试着删除那个OSD上的一些归置组数据目录
如果你准备从填满的OSD中删除某个归置组,注意不要删除另一个OSD 上的同名归置组,否则你会丢数据。必须在多个OSD上保留至少一份数据副本。
OSD龟速或无响应
一个容易反复出现的问题是OSD龟速或无响应。在深入性能问题前,你应该先确保不是其他故障。例如,确保你的网络运行正常、且OSD在运行,还要检查 OSD 是否被恢复流量拖住了
网络问题
Ceph 是一个分布式存储系统,所以它依赖于网络来互联OSD、复制对象、恢复错误、和检查心跳。网络问题会导致OSD延时和FLapping(反复地被标记为down,然后又up)
确保Ceph进程和Ceph依赖的进程连接了或在监听
netstat -a | grep ceph
netstat -l | grep ceph
sudo netstat -p | grep ceph
检查网络统计信息。
netstat -s
驱动器配置
一个存储驱动器应该只用于一个OSD。如果有其它进程共享驱动器,顺序读和顺序写吞吐量会成为瓶颈,包括日志记录、操作系统、监视器、其它 OSD 和非Ceph进程。
Ceph在日志记录完成之后才会确认写操作,所以使用ext4或XFS文件系统时高速的SSD对降低响应延时很有吸引力。相反,btrfs文件系统可以同时读写。
给驱动器分区并不能改变总吞吐量或顺序读写限制。把日志分离到单独的分区可能有帮助,但最好是另外一块硬盘的分区
坏扇区和碎片化硬盘
检修下硬盘是否有坏扇区和碎片。这会导致总吞吐量急剧下降。
监视器和OSD并存
监视器是普通的轻量级进程,但它们会频繁调用fsync() ,这会妨碍其它工作量,特别是监视器和 OSD 共享驱动器时。另外,如果你在OSD主机上同时运行监视器,遭遇的性能问题可能和这些相关:
运行较老的内核(低于3.0)
v0.48 版运行在老的 glibc 之上
运行的内核不支持 syncfs(2) 系统调用
在这些情况下,同一主机上的多个OSD会相互拖垮对方。它们经常导致爆炸式写入。
进程共存
共存于同一套硬件、并向Ceph写入数据的进程(像基于云的解决方案、虚拟机和其他应用程序)会导致OSD延时大增。一般来说,我们建议用一主机跑 Ceph 、其它主机跑其它进程,实践证明把Ceph和其他应用程序分开可提高性能、并简化故障排除和维护。
日志记录级别
如果你为追踪某问题提高过日志级别、但结束后忘了调回去,这个OSD将向硬盘写入大量日志。如果你想始终保持高日志级别,可以考虑给默认日志路径挂载个硬盘,即 /var/log/ceph/$cluster-$name.log 。
恢复节流
根据你的配置,Ceph可以降低恢复速度来维持性能,否则它会不顾OSD性能而加快恢复速度。检查下OSD是否正在恢复。
内核版本问题
检查下你在用的内核版本。较老的内核也许没有包含能提高Ceph性能的功能。
内核与SYNC FS问题
试试在一主机上只运行一个OSD,看看能否提升性能。老内核未必支持有 syncfs(2) 系统调用的glibc 。
文件系统问题
推荐基于xfs或ext4部署集群,btrfs有很多诱人的功能,但文件系统内的缺陷可能导致性能问题。
内存不足
建议为每OSD进程至少规划1GB内存。你也许注意到了,通常情况下OSD仅会用一小部分(如 100-200MB)。你也许想用这些空闲内存跑一些其他应用,如虚拟机等等,然而当OSD进入恢复状态时,其内存利用率激增,如果没有可用内存,此OSD的性能将差的多。