ceph日常运维管理
常见问题
"mon_osd_full_ratio": "0.95", "mon_osd_nearfull_ratio": "0.85"
自动处理
ceph osd reweight-by-utilization ceph osd reweight-by-pg 105 cephfs_data(pool_name)
手动处理
ceph osd reweight osd.2 0.8
全局处理
ceph mgr module ls ceph mgr module enable balancer ceph balancer on ceph balancer mode crush-compat ceph config-key set "mgr/balancer/max_misplaced": "0.01"
PG状态概述 一个PG在它的生命周期的不同时刻可能会处于以下几种状态中:
Peering(互联中) peering的作用主要是在PG及其副本所在的OSD之间建立互联,并使得OSD之间就这些PG中的object及其元数据达成一致。
Active(活跃的) 处于该状态意味着数据已经完好的保存到了主PG及副本PG中,并且Ceph已经完成了peering工作。
Clean(整洁的) 当某个PG处于clean状态时,则说明对应的主OSD及副本OSD已经成功互联,并且没有偏离的PG。也意味着Ceph已经将该PG中的对象按照规定的副本数进行了复制操作。
Degraded(降级的) 当某个PG的副本数未达到规定个数时,该PG便处于degraded状态,例如:
在客户端向主OSD写入object的过程,object的副本是由主OSD负责向副本OSD写入的,直到副本OSD在创建object副本完成,并向主OSD发出完成信息前,该PG的状态都会一直处于degraded状态。又或者是某个OSD的状态变成了down,那么该OSD上的所有PG都会被标记为degraded。 当Ceph因为某些原因无法找到某个PG内的一个或多个object时,该PG也会被标记为degraded状态。此时客户端不能读写找不到的对象,但是仍然能访问位于该PG内的其他object。
Recovering(恢复中) 当某个OSD因为某些原因down了,该OSD内PG的object会落后于它所对应的PG副本。而在该OSD重新up之后,该OSD中的内容必须更新到当前状态,处于此过程中的PG状态便是recovering。
Backfilling(回填) 当有新的OSD加入集群时,CRUSH会把现有集群内的部分PG分配给它。这些被重新分配到新OSD的PG状态便处于backfilling。
Remapped(重映射) 当负责维护某个PG的acting set变更时,PG需要从原来的acting set迁移至新的acting set。这个过程需要一段时间,所以在此期间,相关PG的状态便会标记为remapped。
Stale(陈旧的) 默认情况下,OSD守护进程每半秒钟便会向Monitor报告其PG等相关状态,如果某个PG的主OSD所在acting set没能向Monitor发送报告,或者其他的Monitor已经报告该OSD为down时,该PG便会被标记为stale。
OSD状态
单个OSD有两组状态需要关注,其中一组使用in/out标记该OSD是否在集群内,另一组使用up/down标记该OSD是否处于运行中状态。两组状态之间并不互斥,换句话说,当一个OSD处于“in”状态时,它仍然可以处于up或down的状态。
OSD状态为in且up 这是一个OSD正常的状态,说明该OSD处于集群内,并且运行正常。
OSD状态为in且down 此时该OSD尚处于集群中,但是守护进程状态已经不正常,默认在300秒后会被踢出集群,状态进而变为out且down,之后处于该OSD上的PG会迁移至其它OSD。
OSD状态为out且up 这种状态一般会出现在新增OSD时,意味着该OSD守护进程正常,但是尚未加入集群。
OSD状态为out且down
# ceph -s cluster: id: 8230a918-a0de-4784-9ab8-cd2a2b8671d0 health: HEALTH_WARN application not enabled on 1 pool(s) services: mon: 3 daemons, quorum cephnode01,cephnode02,cephnode03 (age 27h) mgr: cephnode01(active, since 53m), standbys: cephnode03, cephnode02 osd: 4 osds: 4 up (since 27h), 4 in (since 19h) rgw: 1 daemon active (cephnode01) data: pools: 6 pools, 96 pgs objects: 235 objects, 3.6 KiB usage: 4.0 GiB used, 56 GiB / 60 GiB avail pgs: 96 active+clean
id:集群ID health:集群运行状态,这里有一个警告,说明是有问题,意思是pg数大于pgp数,通常此数值相等。 mon:Monitors运行状态。 osd:OSDs运行状态。 mgr:Managers运行状态。 mds:Metadatas运行状态。 pools:存储池与PGs的数量。 objects:存储对象的数量。 usage:存储的理论用量。 pgs:PGs的运行状态
~]$ ceph -w
~]$ ceph health detail
pg状态 ~]$ ceph pg dump ~]$ ceph pg stat pool状态 ~]$ ceph osd pool stats ~]$ ceph osd pool stats osd状态 ~]$ ceph osd stat ~]$ ceph osd dump ~]$ ceph osd tree ~]$ ceph osd df Monitor状态和查看仲裁状态 ~]$ ceph mon stat ~]$ ceph mon dump ~]$ ceph quorum_status 集群空间用量 ~]$ ceph df ~]$ ceph df detail
查看运行配置 命令格式: # ceph daemon {daemon-type}.{id} config show 命令举例: # ceph daemon osd.0 config show
命令格式: # ceph tell {daemon-type}.{daemon id or *} injectargs --{name}={value} [--{name}={value}] 命令举例: # ceph tell osd.0 injectargs --debug-osd 20 --debug-ms 1
-
-
daemon id:该对象的名称,osd通常为0、1等,mon为ceph -s显示的名称,这里可以输入*表示全部。
-
命令格式: # ceph daemon {daemon-type}.{id} config set {name}={value} 命令举例: # ceph daemon mon.ceph-monitor-1 config set mon_allow_pool_delete false
集群操作
1、启动所有守护进程 # systemctl start ceph.target 2、按类型启动守护进程 # systemctl start ceph-mgr.target # systemctl start ceph-osd@id # systemctl start ceph-mon.target # systemctl start ceph-mds.target # systemctl start ceph-radosgw.target
添加和删除osd
添加 1、格式化磁盘 ceph-volume lvm zap /dev/sd<id> 2、进入到ceph-deploy执行目录/my-cluster,添加OSD # ceph-deploy osd create --data /dev/sd<id> $hostname 删除 1、调整osd的crush weight为 0 ceph osd crush reweight osd.<ID> 0.0 2、将osd进程stop systemctl stop ceph-osd@<ID> 3、将osd设置out ceph osd out <ID> 4、立即执行删除OSD中数据 ceph osd purge osd.<ID> --yes-i-really-mean-it 5、卸载磁盘 umount /var/lib/ceph/osd/ceph-?
扩容pg
ceph osd pool set {pool-name} pg_num 128 ceph osd pool set {pool-name} pgp_num 128
列出存储池 ceph osd lspools 创建存储池 命令格式: # ceph osd pool create {pool-name} {pg-num} [{pgp-num}] 命令举例: # ceph osd pool create rbd 32 32 设置存储池配额 命令格式: # ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}] 命令举例: # ceph osd pool set-quota rbd max_objects 10000 删除存储池 ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it] 重命名存储池 ceph osd pool rename {current-pool-name} {new-pool-name} 查看存储池统计信息 rados df 给存储池做快照 ceph osd pool mksnap {pool-name} {snap-name} 删除存储池的快照 ceph osd pool rmsnap {pool-name} {snap-name} 获取存储池选项值 ceph osd pool get {pool-name} {key} 调整存储池选项值 ceph osd pool set {pool-name} {key} {value} size:设置存储池中的对象副本数,详情参见设置对象副本数。仅适用于副本存储池。 min_size:设置 I/O 需要的最小副本数,详情参见设置对象副本数。仅适用于副本存储池。 pg_num:计算数据分布时的有效 PG 数。只能大于当前 PG 数。 pgp_num:计算数据分布时使用的有效 PGP 数量。小于等于存储池的 PG 数。 hashpspool:给指定存储池设置/取消 HASHPSPOOL 标志。 target_max_bytes:达到 max_bytes 阀值时会触发 Ceph 冲洗或驱逐对象。 target_max_objects:达到 max_objects 阀值时会触发 Ceph 冲洗或驱逐对象。 scrub_min_interval:在负载低时,洗刷存储池的最小间隔秒数。如果是 0 ,就按照配置文件里的 osd_scrub_min_interval 。 scrub_max_interval:不管集群负载如何,都要洗刷存储池的最大间隔秒数。如果是 0 ,就按照配置文件里的 osd_scrub_max_interval 。 deep_scrub_interval:“深度”洗刷存储池的间隔秒数。如果是 0 ,就按照配置文件里的 osd_deep_scrub_interval 。 获取对象副本数 ceph osd dump | grep 'replicated size'
用户管理
Ceph 把数据以对象的形式存于各存储池中。Ceph 用户必须具有访问存储池的权限才能够读写数据。另外,Ceph 用户必须具有执行权限才能够使用 Ceph 的管理命令。
查看用户信息 查看所有用户信息 # ceph auth list 获取所有用户的key与权限相关信息 # ceph auth get client.admin 如果只需要某个用户的key信息,可以使用pring-key子命令 # ceph auth print-key client.admin 添加用户 # ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool' # ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool' # ceph auth get-or-create client.george mon 'allow r' osd 'allow rw pool=liverpool' -o george.keyring # ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key 修改用户权限 # ceph auth caps client.john mon 'allow r' osd 'allow rw pool=liverpool' # ceph auth caps client.paul mon 'allow rw' osd 'allow rwx pool=liverpool' # ceph auth caps client.brian-manager mon 'allow *' osd 'allow *' # ceph auth caps client.ringo mon ' ' osd ' ' 删除用户 # ceph auth del {TYPE}.{ID} 其中, {TYPE} 是 client,osd,mon 或 mds 的其中一种。{ID} 是用户的名字或守护进程的 ID 。
新增一个monitor # ceph-deploy mon create $hostname 注意:执行ceph-deploy之前要进入之前安装时候配置的目录。/my-cluster 删除monitor # ceph-deploy mon destroy $hostname 注意: 确保你删除某个 Mon 后,其余 Mon 仍能达成一致。如果不可能,删除它之前可能需要先增加一个。