修改ceph的目录

写在前面

喜欢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微信公众号阅读更多好文!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗的松鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值