Ceph分布式存储平常运维管理手册


做者:过眼风
来源:https://www.cnblogs.com/yuezhiminode

常见问题

nearfull osd(s) or pool(s) nearfull 此时说明部分osd的存储已经超过阈值,mon会监控ceph集群中OSD空间使用状况。若是要消除WARN,能够修改这两个参数,提升阈值,可是经过实践发现并不能解决问题,能够经过观察osd的数据分布状况来分析缘由。算法

配置文件设置阈值
"mon_osd_full_ratio":"0.95",
"mon_osd_nearfull_ratio":"0.85"

处理方式app

#自动处理
ceph osd reweight-by-utilization
ceph osd reweight-by-pg 105 cephfs_data(pool_name)

#手动处理
ceph osd reweight osd.20.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状态概述 一个PG在它的生命周期的不一样时刻可能会处于如下几种状态中:spa

  • Creating(建立中) 在建立POOL时,须要指定PG的数量,此时PG的状态便处于creating,意思是Ceph正在建立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 在该状态下的OSD不在集群内,而且守护进程运行不正常,CRUSH不会再分配PG到该OSD上。

集群监控管理

集群总体运行状态debug

# 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),4in(since 19h)  
 rgw:1 daemon active (cephnode01)  
  
 data:  
 pools:6 pools,96 pgs  
 objects:235 objects,3.6KiB  
 usage:4.0GiB used,56GiB/60GiB 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

集群配置管理(临时和全局,服务平滑重启)

有时候须要更改服务的配置,但不想重启服务,或者是临时修改。这时候就可使用tell和daemon子命令来完成此需求。code

查看运行配置命令格式:
# ceph daemon {daemon-type}.{id} config show 
命令举例:
# ceph daemon osd.0 config show

tell子命令格式

使用 tell 的方式适合对整个集群进行设置,使用 * 号进行匹配,就能够对整个集群的角色进行设置。而出现节点异常没法设置时候,只会在命令行当中进行报错,不太便于查找。对象

命令格式:
# ceph tell {daemon-type}.{daemon id or *} injectargs --{name}={value} [--{name}={value}]
命令举例:
# ceph tell osd.0 injectargs --debug-osd 20 --debug-ms 1
  • daemon-type:为要操做的对象类型如osd、mon、mds等。
  • daemon id:该对象的名称,osd一般为0、1等,mon为ceph -s显示的名称,这里能够输入*表示所有。
  • injectargs:表示参数注入,后面必须跟一个参数,也能够跟多个

daemon子命令

使用 daemon 进行设置的方式就是一个个的去设置,这样能够比较好的反馈,此方法是须要在设置的角色所在的主机上进行设置。blog

命令格式:
# ceph daemon {daemon-type}.{id} config set {name}={value}
命令举例:
# ceph daemon mon.ceph-monitor-1 config set mon_allow_pool_delete false

集群操做

一、启动全部守护进程
# systemctl start ceph.target
二、按类型启动守护进程
# 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

#添加  
一、格式化磁盘  
ceph-volume lvm zap /dev/sd<id>  
二、进入到ceph-deploy执行目录/my-cluster,添加OSD  
# ceph-deploy osd create --data /dev/sd<id> $hostname  
  
#删除  
一、调整osd的crush weight为0  
ceph osd crush reweight osd.<ID>0.0  
二、将osd进程stop  
systemctl stop ceph-osd@<ID>  
三、将osd设置out  
ceph osd out<ID>  
四、当即执行删除OSD中数据  
ceph osd purge osd.<ID>--yes-i-really-mean-it  
五、卸载磁盘  
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 

注:一、扩容大小取跟它接近的2的N次方。二、在更改pool的PG数量时,需同时更改PGP的数量。PGP是为了管理placement而存在的专门的PG,它和PG的数量应该保持一致。若是你增长pool的pg_num,就须要同时增长pgp_num,保持它们大小一致,这样集群才能正常rebalancing。生命周期

Pool操做

#列出存储池  
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

一个集群能够只有一个 monitor,推荐生产环境至少部署 3 个。Ceph 使用 Paxos 算法的一个变种对各类 map 、以及其它对集群来讲相当重要的信息达成共识。建议(但不是强制)部署奇数个 monitor 。Ceph 须要 mon 中的大多数在运行并可以互相通讯,好比单个 mon,或 2 个中的 2 个,3 个中的 2 个,4 个中的 3 个等。初始部署时,建议部署 3 个 monitor。后续若是要增长,请一次增长 2 个。

#新增一个monitor
# ceph-deploy mon create $hostname
注意:执行ceph-deploy以前要进入以前安装时候配置的目录。/my-cluster

#删除monitor
# ceph-deploy mon destroy $hostname
注意:确保你删除某个Mon后,其他Mon仍能达成一致。若是不可能,删除它以前可能须要先增长一个。

jishuroad.jpg

相关文章
相关标签/搜索