写在前面
喜欢ceph的话欢迎关注奋斗的cepher微信公众号阅读更多好文!
本篇的问题以前就遇到过,一直没解决,最近终于摸索出来了。
问题
ceph服务的目录,比如log目录和data目录,通常默认都是使用/var
,某些情况下,操作系统的/var
给的空间不是很大,很容易就被打满,尤其是开启了osd的日志,用完后又忘记关掉了,超大的日志很容易就将目录打满,导致osd异常或者日志无法正常记录:
root@debian:~# df -h /var
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 31G 3.5G 26G 13% /var
另外,mon的data目录就在/var/lib/ceph/mon
下,/var
目录被写满的话,mon就起不来了。
最关键的是,即便ceph允许通过参数指定log的目录与data目录,但是实测发现,无论怎么修改,这个指定的路径就是无法生效:
root@debian:~# ceph daemon /run/ceph/ceph-osd.1.asok config show|grep 'log_file"'
"log_file": "/var/log/ceph/ceph-osd.1.log",
"mon_cluster_log_file": "default=/var/log/ceph/ceph.$channel.log cluster=/var/log/ceph/ceph.log",
root@debian:~# ceph daemon /run/ceph/ceph-mon.debian.asok config show |grep 'mon_data"'
"mon_data": "/var/lib/ceph/mon/ceph-debian",
通过代码跟踪,发现log_file
参数是用来指定服务的日志路径的,它的格式为:
/var/log/ceph/$cluster-$name.log
即不管对于osd还是mon还是rgw,它们打印日志的路径都是可以通过这个参数的形式进行指定,另外mon的data目录是通过mon_data
来指定。
但是实测发现,修改这几个参数是无效的,修改RGW的日志路径发现它直接就不打日志了。
解决
一开始以为是ceph的问题,是不是log_file
需要配合其他参数才能生效呢?查了一圈,没有相关文章,跟踪了一下代码,也没有发现异常,难道大家从来没有遇到需要修改目录的需求吗?=.=
在一番研究后发现,这个问题跟ceph关系不是很大,主要是systemd
的限制,这里以mon为例,默认情况下mon的data目录为/var/lib/ceph/mon/$cluster-$id
,因为mon的目录是存放它的rocksdb的,当集群长时间运行,mon的rocksdb可能会占用非常大的空间,而如果/var
目录被打满了,Mon就无法正常启动。
这种情况下,只能对/var
目录进行扩容,这还有个前提,系统盘使用了lvm,否则连扩容的机会都没有=.=,因此就有了修改目录的需求,接下来对mon的目录进行修改。
首先,将mon进程停掉后,将它的目录拷贝到/home
root@debian:~# systemctl stop ceph-mon@`hostname`.service
root@debian:~# mv /var/lib/ceph/mon/ceph-debian /home/
移动完成后,发现所有者和所属组都是ceph,权限没问题
root@debian:/home/ceph-debian# ll
total 16
-rw------- 1 ceph ceph 77 Feb 19 14:18 keyring
-rw------- 1 ceph ceph 8 Feb 19 14:18 kv_backend
-rw------- 1 ceph ceph 8 Feb 19 14:18 min_mon_release
drwxr-xr-x 2 ceph ceph 4096 May 14 17:26 store.db
接下来修改ceph.conf
,增加参数
root@debian:~# grep 'mon_data' /etc/ceph/ceph.conf
mon_data = /home/ceph-debian
如果这个时候直接拉起mon服务,mon肯定是起不来的,同理,当我们在ceph.conf
中修改了ceph其他服务的log目录,日志也是会失败的,那么怎么解决呢?
在ceph服务的systemd的service文件中,有个关键的参数ProtectHome
,就是它限制了这个服务进程使用其他目录
root@debian:~# systemctl cat ceph-mon@`hostname`.service
# /lib/systemd/system/ceph-mon@.service
[Unit]
......
ProtectHome=true #这个参数限制了ceph进程使用其他的目录
ProtectHostname=true
......
怎么发现的呢?修改配置后,松鼠哥使用命令行运行/usr/bin/ceph-mon -f --cluster ceph --id debian --setuser ceph --setgroup ceph
发现目录是可以被修改的,而使用systemctl就不行,刚开始以为是权限问题,排查一番后权限确认是没有问题的,因此逐个排查,发现就是ProtectHome=true
这个问题。
接下来我们把这个参数改为false,然后reload一下,再拉起mon
root@debian:~# cd /etc/systemd/system/
root@debian:/etc/systemd/system# cp /lib/systemd/system/ceph-mon@.service ceph-mon@`hostname`.service
root@debian:/etc/systemd/system# sed -i 's/ProtectHome=true/ProtectHome=false/g' ceph-mon@debian.service
root@debian:/etc/systemd/system# systemctl daemon-reload
root@debian:/etc/systemd/system# systemctl start ceph-mon@`hostname`.service
root@debian:/etc/systemd/system# systemctl status ceph-mon@`hostname`.service
● ceph-mon@debian.service - Ceph cluster monitor daemon
Loaded: loaded (/etc/systemd/system/ceph-mon@debian.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2024-05-14 17:35:11 CST; 3s ago
Main PID: 4504 (ceph-mon)
Tasks: 27
Memory: 85.4M
CGroup: /system.slice/system-ceph\x2dmon.slice/ceph-mon@debian.service
└─4504 /usr/bin/ceph-mon -f --cluster ceph --id debian --setuser ceph --setgroup ceph
May 14 17:35:11 debian systemd[1]: Started Ceph cluster monitor daemon.
检查它的目录,确实已经被修改了
root@debian:/etc/systemd/system# ls -l /var/lib/ceph/mon/
total 0
root@debian:/etc/systemd/system# ls -l /home/ceph-debian/
total 16
-rw------- 1 ceph ceph 77 Feb 19 14:18 keyring
-rw------- 1 ceph ceph 8 Feb 19 14:18 kv_backend
-rw------- 1 ceph ceph 8 Feb 19 14:18 min_mon_release
drwxr-xr-x 2 ceph ceph 4096 May 14 17:35 store.db
root@debian:/etc/systemd/system# ceph daemon /run/ceph/ceph-mon.debian.asok config show |grep 'mon_data"'
"mon_data": "/home/ceph-debian",
修改日志目录同理,通过将ProtectHome
修改为false,就能够改变它的目录,大家可以试试。
总结
根据调查,当服务设置了ProtectHome=true
,当进程起来后, 部份目录对进程是不可见的,例如home目录,因此即便配置了其他的目录,ceph进程也无法正常使用,所以就达不到更换目录的目的,为什么要限制进程对部份目录的访问呢?可能是为了保护目录,规范程序的运行吧~
喜欢ceph的话欢迎关注奋斗的cepher微信公众号阅读更多好文!