作者:过眼风
来源:https://www.cnblogs.com/yuezhimi
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"
处理方式
#自动处理 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在它的生命周期的不同时刻可能会处于以下几种状态中:
单个OSD有两组状态需要关注,其中一组使用in/out标记该OSD是否在集群内,另一组使用up/down标记该OSD是否处于运行中状态。两组状态之间并不互斥,换句话说,当一个OSD处于“in”状态时,它仍然可以处于up或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),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
~]$ 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子命令来完成此需求。
查看运行配置命令格式: # ceph daemon {daemon-type}.{id} config show 命令举例: # ceph daemon osd.0 config show
使用 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 进行设置的方式就是一个个的去设置,这样可以比较好的反馈,此方法是需要在设置的角色所在的主机上进行设置。
命令格式: # 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
#添加 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-?
ceph osd pool set{pool-name} pg_num 128 ceph osd pool set{pool-name} pgp_num 128
注:1、扩容大小取跟它接近的2的N次方。2、在更改pool的PG数量时,需同时更改PGP的数量。PGP是为了管理placement而存在的专门的PG,它和PG的数量应该保持一致。如果你增加pool的pg_num,就需要同时增加pgp_num,保持它们大小一致,这样集群才能正常rebalancing。
#列出存储池 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,推荐生产环境至少部署 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仍能达成一致。如果不可能,删除它之前可能需要先增加一个。