发布时间:2025-12-09 18:35:54 浏览次数:4
Ubuntu系统下,基于ceph-deploy部署集群后,可以用这种方法来操控集群。
列出节点上所有Ceph进程:
initctl list | grep ceph启动节点上所有Ceph进程:
start ceph-all启动节点上特定类型的Ceph进程:
sudo start ceph-osd-allsudo start ceph-mon-allsudo start ceph-mds-all停止特定类型的Ceph进程的某个实例:
sudo start ceph-osd id={id}sudo start ceph-mon id={hostname}sudo start ceph-mds id={hostname}停止特定类型的Ceph进程的某个实例:
sudo stop ceph-osd id={id}sudo stop ceph-mon id={hostname}sudo stop ceph-mds id={hostname}在 CentOS 、 Redhat 、 Fedora 和 SLES 发行版上可以通过传统的 sysvinit 运行 Ceph , Debian/Ubuntu 的较老的版本也可以用此方法。
命令格式:
# 启动、重启或停止sudo /etc/init.d/ceph [options] [start|restart|stop] [daemonType|daemonID]# 示例:# -a 表示在所有节点执行sudo /etc/init.d/ceph -a startsudo /etc/init.d/ceph -a stopsudo /etc/init.d/ceph start osdsudo /etc/init.d/ceph -a stop osdsudo /etc/init.d/ceph start osd.0sudo /etc/init.d/ceph stop osd.0执行 ceph status或则 ceph **-**s可以查看集群的状态:
active+clean:说明集群健康运行
undersized+degraded:如果有OSD节点宕机,可能进入此状态。降级后还是可以正常读写数据
undersized+degraded+peered:如果超过min size要求的OSD宕机,则不可读写,显示为此状态。min size默认2,副本份数默认3。执行下面的命令可以修改min size:
ceph osd pool set rbd min_size 1peered相当于已经配对(PG - OSDs),但是正在等待OSD上线
remapped+backfilling:默认情况下,OSD宕机5分钟后会被标记为out状态,Ceph认为它已经不属于集群了。Ceph会按照一定的规则,将已经out的OSD上的PG重映射到其它OSD,并且从现存的副本来回填(Backfilling)数据到新OSD
执行 ceph health可以查看简短的健康状态。
执行 ceph **-**w可以持续的监控发生在集群中的各种事件。
执行命令 ceph df可以查看集群的数据用量及其在存储池内的分布情况:
GLOBAL:# 已用存储空间总量(包括所有副本)SIZE AVAIL RAW USED %RAW USED 323G 318G 4966M 1.50 # 这一段显示的数值,不包含副本、克隆、快照的用量POOLS:# 大概使用率 # 大概对象数NAME ID USED %USED MAX AVAIL OBJECTS rbd 1 3539M 1.14 300G 1018通过PG这个中间层,Ceph确保了数据不会被绑死在某个特定的OSD。要追踪错误根源,你需要检查归置组、以及底层的OSD。
执行下面的命令,获取最简短的OSD状态:
ceph osd stat# 输出12 osds: 12 up, 12 in执行 ceph osd dump则可以获得详细信息,包括在CRUSH map中的权重、UUID、是in还是out:
osd.0 up out weight 0 up_from 70 up_thru 172 down_at 65 last_clean_interval [51,60) 10.5.39.13:6800/48 10.5.39.13:6801/48 10.5.39.13:6802/48 10.5.39.13:6803/48 exists,up 354a6547-3437-46d6-a928-f5633eb7f059osd.1 up in weight 1 up_from 74 up_thru 327 down_at 63 last_clean_interval [55,60) 10.5.39.42:6800/48 10.5.39.42:6801/48 10.5.39.42:6802/48 10.5.39.42:6803/48 exists,up 0fb4bb77-7c84-45ac-919a-2cc350fc62b9执行 ceph osd tree可以在OSD树中打印各OSD的位置、状态、权重。如果OSD的in数量大于up数量,可以通过此命令快速定位:
# 仅仅包含out的OSDceph osd tree out# ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF # -1 4.89999 root default # -2 0 host k8s-10-5-38-25 # 2 hdd 0 osd.2 DNE 0执行命令 ceph pg stat可以查看全局性的PG统计信息。
可以获取PG列表:
# 输出的第一列为PG IDceph pg dump# 导出为JSONceph pg dump -o {filename} --format=json执行下面的命令可以查看PG到OSD的映射关系:
# PG ID 格式为 存储池号.归置组ID,归置组ID为一个十六进制数字ceph pg map 1.13d# 输出osdmap e790 pg 1.13d (1.13d) -> up [4,6,5] acting [4,6,5]执行 ceph status也可以看到PG的统计性信息。
执行 ceph pg 1.13d query可以查看某个PG的非常细节的信息。
导出monmap:
ceph mon getmap -o monmap打印monmap的内容:
monmaptool --print monmap从monmap中删除一个MON:
monmaptool monmap --rm xenon添加一个MON到monmap中:
monmaptool monmap --add Xenon 10.0.5.1:6789导入monmap到MON节点:
ceph-mon -i Xenon --inject-monmap monmap一旦启动了 OSD ,其状态就变成了 up+in ,此时可以通过ceph -w来观察数据迁移。归置组状态会变为active, some degraded objects,最终变回active+clean
# Debian/Ubuntu 上用 Upstart:start ceph-osd id={osd-num}# CentOS/RHEL 上用 sysvinit:/etc/init.d/ceph start osd.{osd-num}# 基于systemd的系统systemctl start ceph-osd@14.service删除OSD之前,应该评估集群容量,保证操作之后,集群不会到达 near full 比率
# 首先从CRUSH map中移除ceph osd crush remove {name}# 删除其认证密钥ceph auth del osd.{osd-num}# 删除OSDceph osd rm {osd-num}踢出OSD后,Ceph会进行数据迁移,达到再平衡。归置组状态会变为active, some degraded objects,最终变回active+clean。
ceph osd out {osd-num}对于某些小型测试集群,踢出一个OSD即导致CRUSH进入临界状态,某些归置组一直卡在active+remapped状态。如果遇到这种情况,你可以:
# 把被踢出的集群重新加进来ceph osd in {osd-num}# 将其权重标记为0,而非踢出ceph osd crush reweight osd.{osd-num} 0等待数据迁移完毕后,再将OSD踢出。
你可能需要更新CRUSH map才能让新进入的OSD接受数据:
ceph osd in {osd-num}标记OSD为lost,可能导致数据丢失,谨慎:
ceph osd lost {id} [--yes-i-really-mean-it]Ceph不允许向满的 OSD 写入数据,以免丢失数据。在运营着的集群中,你应该能收到集群空间将满的警告。mon osd full ratio 默认为 0.95 ,也就是说达到 95% 时它将阻止客户端写入数据; mon osd backfillfull ratio 默认为 0.90 ,也就是说达到容量的 90% 时它会阻塞,防止回填启动; OSD 将满比率默认为 0.85 ,也就是说达到容量的 85% 时它会产生健康警告。
使用下面的命令临时修改设置,否则你可能没有机会清理不需要的RBD以腾出空间:
ceph osd set-nearfull-ratio 0.95ceph osd set-full-ratio 0.99ceph osd set-backfillfull-ratio 0.99首先,在/var/lib/ceph/mds/mds.N创建一个数据挂载点。N是MDS的ID,通常就是主机名。
然后,修改Ceph配置,添加一个mds段。修改完毕后进行配置分发:
[mds.N]host = {hostname}如果启用了CephX,需要创建认证密钥:
sudo ceph auth get-or-create mds.N mon 'profile mds' mgr 'profile mds' mds 'allow *' osd 'allow *' > \/var/lib/ceph/mds/ceph-N/keyring执行下面的命令将目标mds标记为宕机:
ceph mds fail <mds name>移除MDS的/var/lib/ceph/mds/ceph-NAME下对应目录,然后,删除/etc/systemd/system/ceph-mds.target.wants/下的对应项目:
systemctl stop ceph-mds@Neon.servicesystemctl disable ceph-mds@Neon.servicerm -rf /var/lib/ceph/mds/ceph-Neon如果服务是通过/etc/init.d/ceph加载的,则:
service ceph stopupdate-rc.d ceph disable查看守护进程的简短状态:
ceph mds stat你可以使用多种方式来引用一个MDS守护进程:
ceph mds fail 5446 # 基于GIDceph mds fail myhost # 基于名称ceph mds fail 3:0 # 基于FSCID:rankceph mds fail myfs:0 # 基于文件系统名称:rank和MDS进程的Standby行为相关的配置项包括:
# 如果设置为true则standby会持续的从Rank中读取元数据日志,从而维持一个有效的元数据缓存,这可以加速Failovermds_standby_replay = true# 仅仅作为具有指定名称的MDS的Standbymds_standby_for_name = Carbon# 仅仅作为指定Rank的Standbymds_standby_for_rank# 仅仅作为指定文件系统的Standbymds_standby_for_fscid如果不进行任何配置,没有持有Rank的那些MDS进程,可以作为任何Rank的Standby。
配置示例:
# a、b两个MDS互备,负责Rank 0[mds.a]mds standby replay = truemds standby for rank = 0[mds.b]mds standby replay = truemds standby for rank = 0标记当前活动MDS为失败,触发故障转移:
ceph mds fail 0要创建一个文件系统,你至少需要两个存储池,一个存放数据,另外一个存放元数据。注意:
示例:
# ceph fs new <fs_name> <metadata> <data># 示例,可以使用现有的存储池ceph fs new cephfs rbd-ssd rbd-hdd# Error EINVAL: pool 'rbd-ssd' already contains some objects. Use an empty pool instead.# 出现上述错误,可以:ceph fs new cephfs rbd-ssd rbd-hdd --force创建了文件系统之后,在Luminous版本中,集群状态中显示:
mds: cephfs-1/1/1 up {0=Carbon=up:active}查看CephFS的详细状态,包括MDS列表、Rank列表等:
ceph fs status要获取某个文件系统的信息,可以:
ceph fs get cephfs如果集群中有多个文件系统,而客户端在挂载时没有明确指定使用哪个,则使用默认文件系统:
ceph fs set-default cephfsEC池可以作为Ceph的数据池,但是需要启用overwirte:
ceph osd pool set my_ec_pool allow_ec_overwrites true注意:EC池不能用来存储元数据。
CephFS支持对任何一个子目录进行配额。但是,需要注意以下限制:
设置配额(设置为0则移除配额):
setfattr -n ceph.quota.max_bytes -v 100000000 /some/dir # 按字节数setfattr -n ceph.quota.max_files -v 10000 /some/dir # 按文件数查看配额:
getfattr -n ceph.quota.max_bytes /some/dirgetfattr -n ceph.quota.max_files /some/dir你可以直接使用Linux内核提供的驱动来挂载CephFS:
mkdir /mnt/cephfsmount -t ceph 10.0.1.1:6789:/ /mnt/cephfs如何启用了CephX,需要指定访问密钥,否则会报22错误:
mount -t ceph 10.0.1.1:6789:/ /mnt/cephfs -o name=admin,secret=AQDRNBZbCp3WMBAAynSCCFPtILwHeI3RLDADKA==# 或者指定包含密钥的文件mount -t ceph 10.0.1.1:6789:/ /mnt/cephfs -o name=admin,secretfile=/etc/ceph/admin.secret如果报can’t read superblock,说明客户端内核不支持。
要实现自动挂载,你需要修改fstab:
{ipaddress}:{port}:/ {mountpoint} {fs-type} [name=username,secret=key|secretfile=file],[{mount.options}]# 示例10.0.1.1:6789:/ /mnt/cephfs ceph name=admin,secretfile=/etc/ceph/cephfs.key,noatime,_netdev 0 2要在用户空间挂载CephFS,你需要:
将Ceph配置文件拷贝到客户端,命名为/etc/ceph/ceph.conf
将Keyring拷贝到客户端,命名为/etc/ceph/ceph.keyring:
sudo scp -i ~/Documents/puTTY/gmem.key root@xenon.gmem.cc:/etc/ceph/ceph.client.admin.keyring /etc/ceph/ceph.keyring执行挂载:
sudo ceph-fuse -m 10.0.1.1:6789 /mnt/cephfs# ceph-fuse[847]: starting ceph client # 2018-06-07 19:18:25.503086 7fa5c44e1000 -1 init, newargv = 0x7fa5cd643b40 newargc=9 # ceph-fuse[847]: starting fuse如果有多个CephFS,你可以为ceph-fuse指定命令行选项–client_mds_namespace,或者在客户端的ceph.conf中添加client_mds_namespace配置。
要实现自动挂载,你需要修改fstab:
none /mnt/ceph fuse.ceph ceph.id={user-ID}[,ceph.conf={path/to/conf.conf}],_netdev,defaults 0 0# 示例none /mnt/ceph fuse.ceph ceph.id=admin,_netdev,defaults 0 0none /mnt/ceph fuse.ceph ceph.id=admin,ceph.conf=/etc/ceph/ceph.conf,_netdev,defaults 0 0创建存储池之后,在管理节点上,使用rbd工具来初始化池:
rbd pool init <pool-name>要取消配额,设置为0即可。
镜像就是块设备,所谓块是一系列连续的字节序列(例如512KB)。基于块的存储接口,是磁盘、CD、软盘、甚至磁带都使用的,是存储对象最广泛使用的方式。
Ceph的块设备具有以下特点:thin-provisioned(精简配备)、可改变大小、跨越多OSD存储。
如果不指定池名称,则列出默认池中的镜像。
下面的命令可以列出池中延迟删除的镜像:
rbd trash ls {poolname}注意:rbd info输出的是thin provisioning的大小,不是实际磁盘空间占用。
除了上面的命令,还可以:
rbd diff k8s/kubernetes-dynamic-pvc | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }'可以看到什么客户端在使用(watch)镜像:
rbd status k8s/kubernetes-dynamic-pvc-ca081cd3-01a0-11eb-99eb-ce0c4cdcd662# Watchers:# watcher=192.168.106.18:0/756489925 client.254697953 cookie=18446462598732840981如果不指定存储池,则在默认池中创建镜像。
从Jewel开始,RBD镜像可以异步的跨越两个集群进行镜像(Mirroring)。通过配置,你可以镜像池中的所有、或者一部分镜像。
mode取值:
Dump出所有PG:
pg dump {all|summary|sum|delta|pools|osds|pgs|pgs_brief [all|summary|sum|delta|pools|osds|pgs|pgs_brief...]}# 示例ceph pg dump [--format {format}] # format取值plain或jsonDump出卡在指定状态中的PG的统计信息:
# threshold默认30秒ceph pg dump_stuck inactive|unclean|stale|undersized|degraded [--format {format}] [-t|--threshold {seconds}]参考官网的算法进行计算。
执行调整之前,必须保证集群处于健康状态。
为避免调整PG数量导致业务性能受到严重影响,应该调整一些参数:
ceph tell osd.* injectargs '--osd-max-backfills 1'ceph tell osd.* injectargs '--osd-recovery-max-active 1'其它相关的参数还包括:
osd_backfill_scan_min = 4 osd_backfill_scan_max = 32 osd recovery threads = 1 osd recovery op priority = 1推送修改后的配置文件后,重启RGW服务:
systemctl restart ceph-radosgw.serviceRGW在index_pool池中存放桶(Bucket)索引数据,此池默认名为.rgw.buckets.index。
从0.94版本开始,支持对桶索引进行分片,避免单个桶中对象数量过多时出现性能瓶颈:
# 每个桶的最大索引分片数,默认0,表示不支持分片rgw_override_bucket_index_max_shards = 0你可以在global段配置上面的选项。
要使用RGW的RESTful接口,你需要:
要创建S3接口用户,需要在网关机上执行:
radosgw-admin user create --uid="rgw" --display-name="rgw"access_key、secret_key会打印在屏幕上,要访问网关,客户端必须提供这两个key:
{"user_id": "rgw","display_name": "rgw","email": "","suspended": 0,"max_buckets": 1000,"auid": 0,"subusers": [],"keys": [{"user": "rgw","access_key": "IN01UCU1M1996LK6OM88","secret_key": "AuuAbroSUlWLykbQHCbFLVO6RU2ozUEjIFkYeoqc"}],"swift_keys": [],"caps": [],"op_mask": "read, write, delete","default_placement": "","placement_tags": [],"bucket_quota": {"enabled": false,"check_on_raw": false,"max_size": -1,"max_size_kb": 0,"max_objects": -1},"user_quota": {"enabled": false,"check_on_raw": false,"max_size": -1,"max_size_kb": 0,"max_objects": -1},"temp_url_keys": [],"type": "rgw"}要创建Swift子用户,需要在网关机上执行:
radosgw-admin subuser create --uid=alex --subuser=alex:swift --access=full你需要为Swift子用户创建secret key:
radosgw-admin key create --subuser=alex:swift --key-type=swift --gen-secret现在,你可以用自己熟悉的语言的S3、Swift客户端来验证用户是否可用。
要创建桶,你需要使用合法的User ID + AWS Access Key发起请求,Ceph没有提供对应的命令行。需要注意以下约束:
我们可以使用MinIO客户端创建桶:
# 添加配置# access_key secret_keymc config host add rgw https://rgw.gmem.cc:7480 IN01UCU1M1996LK6OM88 AuuAbroSUlWLykbQHCbFLVO6RU2ozUEjIFkYeoqc# 创建桶mc mb rgw/test现在通过Rgw命令行可以看到这个桶:
radosgw-admin buckets list# [# "test"# ]Ceph默认开启了cephx协议,加密认证需要消耗少量的资源。
启用cephx后,Cephe会自动在包括/etc/ceph/ceph.$name.keyring在内的位置寻找钥匙串,你可以指定keyring选项来修改默认路径,但是不推荐
在禁用了cephx的集群上,启用它的步骤为:
修改配置文件global段:
auth cluster required = noneauth service required = noneauth client required = none然后重启Ceph集群。
任何时后你都可以Dump、反编译、修改、编译、注入CURSH map。如果要完全基于手工方式管理,不使用自动生成的CRUSH map,可以设置:
osd crush update on start = false执行命令 ceph osd crush dump,可以将整个CRUSH导出为可读形式:
# 下面的输出时安装后最初的状态,没有任何OSD{ # 设备列表,最初为空 "devices": [], # 桶类型定义列表 "types": [ { "type_id": 0, "name": "osd" }, { "type_id": 1, "name": "host" }, { "type_id": 2, "name": "chassis" }, { "type_id": 3, "name": "rack" }, { "type_id": 4, "name": "row" }, { "type_id": 5, "name": "pdu" }, { "type_id": 6, "name": "pod" }, { "type_id": 7, "name": "room" },{"type_id": 8,"name": "datacenter"},{"type_id": 9,"name": "region"},{"type_id": 10,"name": "root"}],# 桶列表,可以形成树状结构"buckets": [{"id": -1,"name": "default","type_id": 10,"type_name": "root","weight": 0,"alg": "straw2","hash": "rjenkins1","items": []}# 加入一个OSD节点(基于目录),自动生成如下两个Bucket:{ "id": -2, "name": "k8s-10-5-38-25", "type_id": 1, "type_name": "host", "weight": 55050, "alg": "straw2", "hash": "rjenkins1", "items": [ { "id": 0, "weight": 55050, "pos": 0 } ] }, { "id": -3, "name": "k8s-10-5-38-25~hdd", "type_id": 1, "type_name": "host", "weight": 55050, "alg": "straw2", "hash": "rjenkins1", "items": [ {"id": 0,"weight": 55050,"pos": 0}]},],# 规则列表"rules": [{"rule_id": 0,"rule_name": "replicated_rule",# 所属规则集"ruleset": 0,# 此规则是否用于RAID,取值replicated 或 raid4"type": 1,# 如果Pool的副本份数不在此范围内,则CRUSH不会使用当前规则"min_size": 1,"max_size": 10,"steps": [{# 选择一个桶,并迭代其子树"op": "take","item": -1,"item_name": "default"},{# 在上一步的基础上,确定每个副本如何放置"op": "chooseleaf_firstn",# 取值0,此Step适用pool-num-replicas个副本(所有)# 取值>0 & < pool-num-replicas,适用num个副本# 取值<0,适用pool-num-replicas -num个副本"num": 0,"type": "host"},{"op": "emit"}]}],# 可微调参数,以及一些状态信息"tunables": { "choose_local_tries": 0, "choose_local_fallback_tries": 0, "choose_total_tries": 50, "chooseleaf_descend_once": 1, "chooseleaf_vary_r": 1, "chooseleaf_stable": 1, "straw_calc_version": 1, "allowed_bucket_algs": 54, # 使用的Profile,执行ceph osd crush tunables hammer后此字段改变,连带其它tunables字段自动改变 "profile": "jewel", "optimal_tunables": 1, "legacy_tunables": 0, "minimum_required_version": "jewel", "require_feature_tunables": 1, "require_feature_tunables2": 1, "has_v2_rules": 0, "require_feature_tunables3": 1, "has_v3_rules": 0, "has_v4_buckets": 1, "require_feature_tunables5": 1,"has_v5_rules": 0},"choose_args": {}}执行下面的命令,导出当前Map:
ceph osd getcrushmap -o curshmap然后,需要反编译为文本:
crushtool -d curshmap -o curshmap.src源文件内容示例:
# begin crush maptunable choose_local_tries 0tunable choose_local_fallback_tries 0tunable choose_total_tries 50tunable chooseleaf_descend_once 1tunable chooseleaf_vary_r 1tunable straw_calc_version 1tunable allowed_bucket_algs 54# devices# typestype 0 osdtype 1 hosttype 2 chassistype 3 racktype 4 rowtype 5 pdutype 6 podtype 7 roomtype 8 datacentertype 9 region.Values.storageclass.fsTypetype 10 root# bucketsroot default {id -1 # do not change unnecessarily# weight 0.000alg straw2 hash 0 # rjenkins1}# rulesrule replicated_rule {id 0type replicatedmin_size 1max_size 10step take defaultstep chooseleaf firstn 0 type hoststep emit}# end crush map我们可以根据实际需要,对源文件进行修改,例如将算法改为straw,解决CentOS 7上CEPH_FEATURE_CRUSH_V4 1000000000000特性不满足的问题:
sed -i 's/straw2/straw/g' curshmap.src修改源文件完毕后,执行下面的命令编译:
crushtool -c curshmap.src -o curshmap最后,注入最新编译的Map:
ceph osd setcrushmap -i curshmap# 会输出修订版号默认情况下,Ceph自动根据硬件类型,设置OSD的设备类型为hdd, ssd或nvme。你可以手工进行设置:
# 你需要移除当前设置的设备类型,才能重新设置ceph osd crush rm-device-class <osd-name> [...]# 示例ceph osd crush rm-device-class osd.3 osd.4 osd.5 osd.6 osd.7 osd.8 osd.0 osd.10 osd.1 osd.12 osd.2 osd.13 ceph osd crush set-device-class <class> <osd-name> [...]# 示例ceph osd crush set-device-class ssd osd.3 osd.4 osd.5 osd.6 osd.7 osd.8 osd.0 osd.10 osd.1 osd.12 osd.2 osd.13列出集群中的CRUSH rule:
ceph osd crush rule lsDump出规则的内容:
ceph osd crush rule dump创建一个规则,仅仅使用指定类型的设备:
ceph osd crush rule create-replicated <rule-name> <root> <failure-domain> <class># 示例:仅仅使用ssd类型的设备,失败域为host,也就是数据副本必须位于不同的主机上ceph osd crush rule create-replicated replicated_rule_ssd default host ssdceph osd crush rule create-replicated replicated_rule_hdd default host hdd为存储池指定所使用的规则:
ceph osd pool set <pool-name> crush_rule <rule-name># 修改规则ceph osd pool set rbd-ssd crush_rule replicated_rule_ssd# 创建存储池时指定规则ceph osd pool create rbd-ssd 384 replicated replicated_rule_ssdCRUSH rule的语法如下:
rule <rulename> {ruleset <ruleset>type [ replicated | erasure ]min_size <min-size>max_size <max-size># 根据桶名称来选取CRUSH子树,并迭代,可限定设备类型step take <bucket-name> [class <device-class>]# choose:选择指定数量、类型的桶# chooseleaf:选择指定数量、类型的桶,并选择每个这些桶的一个叶子节点step [choose|chooseleaf] [firstn|indep] <N> <bucket-type>step emit}示例一,将主副本存放在SSD中,第二副本存放在HDD中:
rule ssd-primary-affinity {ruleset 0type replicatedmin_size 2max_size 3# 选择名为SSD的桶step take ssd# 在上述桶中的host类型的子树中选择叶子节点,存储1个副本(第一个)step chooseleaf firstn 1 type host# 执行step emit# 选择名为HDD的桶step take hdd# 在上述桶中的host类型的子树中选择叶子节点,存储N-1个副本(所有其它副本)step chooseleaf firstn -1 type hoststep emit}示例二,在第一个机架上存储两个副本,第二个机架上存储一个副本:
rule 3_rep_2_racks {ruleset 1type replicatedmin_size 2max_size 3step take default# 选择一个Rack,存储2个副本step choose firstn 2 type rack# 在上述选定的Rack中选择Hoststep chooseleaf firstn 2 type hoststep emit}如果要添加OSD到CRUSH map中,执行:
ceph osd crush set {name} {weight} root={root} [{bucket-type}={bucket-name} ...]# 示例ceph osd crush set osd.14 0 host=xenial-100ceph osd crush set osd.0 1.0 root=default datacenter=dc1 room=room1 row=foo rack=bar host=foo-bar-1使用CRUSH rule,可以限定某个Pool仅仅使用一部分OSD:
# SSD主机host ceph-osd-ssd-server-1 {id -1alg strawhash 0item osd.0 weight 1.00item osd.1 weight 1.00}# HDD主机host ceph-osd-hdd-server-1 {id -3alg strawhash 0item osd.4 weight 1.00item osd.5 weight 1.00}# HDD的根桶root hdd {id -5alg strawhash 0item ceph-osd-hdd-server-1 weight 2.00}# SSD的根桶root ssd {id -6alg strawhash 0item ceph-osd-ssd-server-1 weight 2.00}# 仅仅使用HDD的规则rule hdd {ruleset 3type replicatedmin_size 0max_size 10step take hdd# 选择step chooseleaf firstn 0 type hoststep emit}# 仅仅使用SSD的规则rule ssd {ruleset 4type replicatedmin_size 0max_size 4step take ssdstep chooseleaf firstn 0 type hoststep emit}# 在SSD上存储主副本,其它副本存放在HDDrule ssd-primary {ruleset 5type replicatedmin_size 5max_size 10step take ssdstep chooseleaf firstn 1 type hoststep emitstep take hddstep chooseleaf firstn -1 type hoststep emit}前提条件:
步骤,针对每个需要改变尺寸的OSD,一个个的处理:
修改Cephe配置,设置 osd_journal_size = NEWSIZE
禁止数据迁移(防止OSD进入out状态): ceph osd set noout
停止目标OSD实例
刷出缓存: ceph-osd **-**i OSDID **–flush-**journal
删除日志:
# 基于Helm部署时,需要到宿主机上的osd_directory下寻找对应目录cd /var/lib/ceph/osd/ceph-osd.OSDIDrm journal创建一个新的日志文件: ceph-osd **–**mkjournal **-**i OSDID
启动OSD
验证新的日志尺寸被使用:
# Helm安装的情况下,需要在OSD容器中执行ceph --admin-daemon /var/run/ceph/ceph-osd.OSDID.asok config get osd_journal_size确保集群处于OK状态,所有PG处于active+clean状态
处理完所有OSD后,执行: ceph osd unset noout,清除noout标记要动态、临时(重启后消失)的修改组件的参数,可以使用tell命令。
可以将RBD上的Watcher加入黑名单,这样可以解除RBD的Watcher,再其它机器上挂载RBD:
rbd status kubernetes-dynamic-pvc-22d9e659-6e31-11e8-92e5-c6b9f35768f0 # Watchers: # watcher=10.0.3.1:0/158685765 client.3524447 cookie=18446462598732840965# 添加到黑名单ceph osd blacklist add 10.0.3.1:0/158685765# blacklisting 10.0.3.1:0/158685765 until 2018-08-21 18:04:31.855791 (3600 sec)rbd status kubernetes-dynamic-pvc-22d9e659-6e31-11e8-92e5-c6b9f35768f0# Watchers: none