Ceph运用之妙

Ceph集群定时Scrub

OSD的Scrub默认策略是每天到每周进行一次,时间区域默认为全天。Deep-Scrub默认策略为每周一次。

场景:晚上22点到第二天7点进行Scrub

ceph tell osd.* injectargs "--osd-scrub-begin-hour 22"
ceph tell osd.* injectargs "--osd-scrub-end-hour 7"

写入配置文件/etc/ceph/ceph.conf,使重启后生效:

[global]
...
[osd]
osd_scrub_begin_hour = 22
osd_scrub_end_hour = 7

Ceph对接OpenStack

Ceph集群可以作为OpenStack的存储后端,分别向Nova、Cinder和Glance组件提供块设备服务。

Ceph数据重建配置策略

  • 场景一:优先保证Recovery带宽(对数据安全性要求比较高、需保证数据副本的完整性及快速恢复集群健康的场景)
ceph tell osd.* injectargs "--osd-recovery-op-priority 63"  // 12.2.0版本默认Recovery的I/O优先级为3,10.2.0版本默认为3,有效值1-63
ceph tell osd.* injectargs "--osd-client-op-priority 3"     // 12.2.0版本默认Client的I/O优先级为63,10.2.0版本默认为63,有效值1-63

待Recovery完成,需还原配置:

ceph tell osd.* injectargs "--osd-recovery-op-priority 3"
ceph tell osd.* injectargs "--osd-client-op-priority 63"
  • 场景二:优先保证Client带宽(对数据安全性要求不是很高、需降低对用户体验影响的场景)
ceph tell osd.* injectargs "--osd-recovery-op-priority 1"
ceph tell osd.* injectargs "--osd-recovery-max-active 1"
ceph tell osd.* injectargs "--osd-recovery-sleep 0.4"

待Recovery完成,需还原配置:

ceph tell osd.* injectargs "--osd-recovery-op-priority 3"
ceph tell osd.* injectargs "--osd-recovery-max-active 3"
ceph tell osd.* injectargs "--osd-recovery-sleep 0"
  • 场景三:完全保证Client带宽(在极端情况下,如果网络带宽及磁盘性能有限,这个时候为了不影响用户体验,不得不在业务繁忙时段关闭数据重建及迁移IO的场景)

在业务繁忙时,完全关闭数据重建及迁移:

ceph osd set norebalance
ceph osd set norecover
ceph osd set nobackfill

在业务空闲时,打开数据重建及迁移:

ceph osd unset norebalance
ceph osd unset norecover
ceph osd unset nobackfill

Ceph集群Full紧急处理

注:集群出现osd full,一般情况是集群的使用率整体较高,此时扩容或者删除数据才是正解。

集群出现full,处于error状态,client端数据无法读写,但是如果集群正在进行数据均衡,还可以继续recovery。

  • 查看当前集群的near_full及full水位

MON节点:

ceph --show-config | grep full_ratio
ceph --admin-daemon /run/ceph/ceph-mon.{your-mon-server}.asok config show | grep full_ratio
ceph daemon {daemon-type}.{id} config show | grep full_ratio

OSD节点:

ceph --show-config | grep full_ratio
ceph --admin-daemon /run/ceph/ceph-osd.{your-osd-server}.asok config show | grep full_ratio
ceph daemon {daemon-type}.{id} config show | grep full_ratio

查看PG状态:

ceph pg dump | grep full_ratio
  • near_full告警处理

如果集群已经有near_full的告警了,而且也有扩容的设备,那么就可以考虑进行集群的扩容,包括增加磁盘或增加存储节点。

  • full告警处理

如果集群已经是full的告警了,此时业务已经无法向集群继续写入数据,而此时暂时无磁盘或存储节点可供扩容,应该先通知业务及时做好数据保存工作,并对集群进行紧急配置删除一些无用的数据,回复集群正常工作状态,待扩容设备到了再进行扩容操作。

紧急配置步骤:

(1)设置OSD禁止读写

ceph osd pause

(2)通知MON和OSD修改full阈值

ceph tell mon.* injectargs "--mon-osd-full-ratio 0.96"
ceph tell osd.* injectargs "--mon-osd-full-ratio 0.96"

(3)通知PG修改full阈值

ceph pg set_full_ratio 0.96 (Luminous版本之前)
ceph osd set-full-ratio 0.96 (Luminous版本)

(4)解除OSD禁止读写

ceph osd unpause

(5)删除相关数据

以下方法进行处理:

A.openstack环境下最好是 nova 或者 glance 删除云盘及虚拟机数据,当然也可以在 ceph 层面删除

B.数据均衡ceph osd df | sort -rnk 7 按照倒序osd使用率,根据VAR值进行调整(自动按照集群osd使用率进行调整):
ceph osd reweight-by-utilization VAR*100
例:ceph osd reweight-by-utilization 131

C.手动调整某一个osd的权重:
例:ceph osd reweight 1 0.95
-----------------------------------

(6)将配置还原

ceph tell mon.* injectargs "--mon-osd-full-ratio 0.95"
ceph tell osd.* injectargs "--mon-osd-full-ratio 0.95"
ceph pg set_full_ratio 0.95 (Luminous版本之前)
ceph osd set-full-ratio 0.95 (Luminous版本)
  • 另外一种full告警处理

数据再平衡,命令如下:

ceph osd crush reweight <osd> <weight>

调整每个osd的weigh值,使数据重新分布,例如:

ceph osd crush reweight osd.0 1.05
ceph osd crush reweight osd.1 0.95

osd缺省的weight值为1,调整以后数据会向weigh值高的osd上重新分布,把一些比较空闲的osd weight值调高,接收数据,使用率高的osd weight调低,释放数据。

Ceph快照在增量备份的应用

  • 容灾:目的是为了保障业务的连续性,侧重的是业务连续,发生灾难时切换备用生产数据,接管生产数据。
  • 备份:目的是为了保障数据的安全性,侧重的是数据安全,发生灾难后用转存的数据进行恢复。

Ceph集群异常watcher处理

在Ceph集群日常运维中,管理员可能会遇到有的image删除不了的情况。

有一种情况是由于image下有快照信息,只需将快照信息清除,然后再删除该image即可。

还有一种情况是因为该image仍旧被一个客户端在访问,具体表现为该image中有watcher,如果该客户端出现了异常那么就会出现无法删除该image的情况。

  • 查看当前image上的watcher
rbd status test_img
或:
rbd info test_img | grep block_name_prefix

将rbd_data.替换为rbd_header.即为image的header对象。再进一步查看该image对象的watcher信息:

rados listwatchers -p rbd rbd_header.*
  • 案例实战

将查到的异常客户端加入到OSD的黑名单即可:

ceph osd blacklist add <watcher-info>

再次查看该image的watcher信息:

rbd status test_img
或:
rados listwatchers -p rbd rbd_header.*

如果异常客户端的watcher信息不存在了,就可以对该image进行删除操作了。

查看运行时配置

格式:ceph daemon {daemon-type}.{id} config show | less
例如:ceph daemon osd.0 config show | less

修改运行时配置

格式:ceph daemon <mon/osd/mds>.<id> config set <参数名> <参数值>
例如:
ceph daemon osd.0 config set osd_scrub_begin_hour 22
ceph daemon osd.0 config set osd_scrub_end_hour 7

关于backfill参数建议

涉及的所有参数:

mon_osd_full_ratio = 0.95
osd_backfill_full_ratio = 0.85
osd_max_backfills = 1

获取最少的OSD的PG数目:

ceph osd df | awk '{print $9}' | awk 'NF' | grep -v PGS | sort

最好满足:

((osd_max_backfills / $min_pg) + osd_backfill_full_ratio) < mon_osd_full_ratio

生产建议:

mon_osd_full_ratio = 0.88
osd_backfill_full_ratio = 0.78
osd_max_backfills = 1

查看每个osd的pg个数

ceph pg dump | awk '  
 /^pg_stat/ { col=1; while($col!="up") {col++}; col++ }  
 /^[0-9a-f]+\.[0-9a-f]+/ { match($0,/^[0-9a-f]+/); pool=substr($0, RSTART, RLENGTH); poollist[pool]=0;  
 up=$col; i=0; RSTART=0; RLENGTH=0; delete osds; while(match(up,/[0-9]+/)>0) { osds[++i]=substr(up,RSTART,RLENGTH); up = substr(up, RSTART+RLENGTH) }  
 for(i in osds) {array[osds[i],pool]++; osdlist[osds[i]];}  
}  
END {  
 printf("\n");  
 printf("pool :\t"); for (i in poollist) printf("%s\t",i); printf("| SUM \n");  
 for (i in poollist) printf("--------"); printf("----------------\n");  
 for (i in osdlist) { printf("osd.%i\t", i); sum=0;  
 for (j in poollist) { printf("%i\t", array[i,j]); sum+=array[i,j]; poollist[j]+=array[i,j] }; printf("| %i\n",sum) }  
 for (i in poollist) printf("--------"); printf("----------------\n");  
 printf("SUM :\t"); for (i in poollist) printf("%s\t",poollist[i]); printf("|\n");  
}'

列出所有rbd锁

$ for I in `rbd ls`; do echo "ImageID: $I"; echo $I | xargs rbd lock ls 2>/dev/null; echo; done

查看osd使用空间

$ ceph osd df | awk '{print $7}' | grep -v USE | grep -v '^$' | sort -rn
posted @ 2020-10-30 16:10  Varden  阅读(780)  评论(0编辑  收藏  举报