前言:
由于(yu)對(dui)象(xiang)存儲主要運用于(yu)影(ying)像(xiang)、多媒體等數(shu)據(ju)規模(mo)較大(da)的場景(jing),單個bucket的對(dui)象(xiang)數(shu)量通常(chang)在(zai)千萬甚(shen)至上(shang)億規模(mo),在(zai)對(dui)對(dui)象(xiang)存儲日(ri)常(chang)巡檢和運維的時候,經常(chang)會遇到(dao)對(dui)象(xiang)存儲的索引存儲池出現large objects告警,影(ying)響數(shu)據(ju)訪問速(su)度,甚(shen)至出現slow requests告警,進而(er)導致存儲集群服務異常(chang)。針對(dui)這(zhe)種(zhong)情況,下面我(wo)們介(jie)紹出現這(zhe)種(zhong)告警后的分析(xi)處理(li)方式。
原因分析:
當對象存儲單個bucket存儲的對象數(shu)量(liang)過多,超過閾(yu)值后(hou),將引發集群large omap objects告警,以對象存儲索(suo)引池(chi)為(wei)例:閾(yu)值上(shang)限為(wei) bucket_index_max_shard*osd_deep_scrub_large_omap_object_key_threshold。
如果不及時處理(li),將影(ying)響(xiang)這個(ge)bucket的讀寫性能,甚(shen)至會給集(ji)群故障埋(mai)下隱患。
處理步驟:
處理思路:
向上調整osd_deep_scrub_large_omap_object_key_threshold消除告(gao)警,但是單個(ge)shard的對象數量(liang)過(guo)大時,會影響bucket的查(cha)詢性能,不推薦(jian)。
增(zeng)加(jia)shard數(shu)量(liang)(liang),保持單個shard的(de)閾(yu)值(zhi)不(bu)變(bian),通(tong)過增(zeng)加(jia)shard的(de)操作消除告警(jing),默(mo)(mo)認shard值(zhi)為16,osd_deep_scrub_large_omap_object_key_threshold默(mo)(mo)認值(zhi)為20萬(wan),單個bucket不(bu)產生large omap objects告警(jing)的(de)對(dui)象(xiang)數(shu)量(liang)(liang)為320萬(wan),調整bucket_index_max_shard為128,bucket對(dui)象(xiang)數(shu)量(liang)(liang)閾(yu)值(zhi)變(bian)為2560萬(wan),已經滿足大(da)部分(fen)場景(jing)的(de)需求,同是,對(dui)性能的(de)影響很小(xiao)。所以此次我們采用此方法(fa)來(lai)處理告警(jing),方法(fa)如下:
- 先找到出現問題的pool
ceph health detail

- 找到對應的PG
ceph pg ls-by-pool |awk '{print "ceph pg "$1 " query|grep num_large_omap_objects"}'|sh -x

- 找到對應的OSD

- 查看OSD日志找到bucket
zcat ceph-osd.40.log-20190614.gz |grep omap

- 根據對象ID確定bucket名稱
radosgw-admin bucket stats --bucket-id=8b824a20-985f-11e8-a8d1-0cc47a57b678.225330637.1 > buckets.json
有報錯可以忽(hu)略,查(cha)看buckets.json,根(gen)據關鍵字8b824a20-985f-11e8-a8d1-0cc47a57b678.225330637.1找到bucket名

- 備份原bucket的index為本地文件
100W個對象的index大約占用(yong)1GB備份文件空間
radosgw-admin bi list --bucket=dutestreshard1 > dutestreshard1.list.backup
若(ruo)后續操作出(chu)現問題,恢復index的操作為
radosgw-admin bi put --bucket= < .list.backup
- 修改zonegroup的bucket_index_max_shards
此值不(bu)宜(yi)過(guo)大(da)不(bu)宜(yi)太小(xiao),依據(ju)集群規模和單桶(tong)對象數設計,每個(ge)shard超過(guo)20W條index就會產生告(gao)警
radosgw-admin zonegroup get > zonegroup.json

radosgw-admin zonegroup set < zonegroup.json
radosgw-admin period update --commit
- 關閉所有rgw,避免reshard操作時新數據變更
systemctl stop ceph-radosgw.target
- 執行bucket reshard操作
注意(yi)記錄新老bucket id, 100W對象(xiang)reshard時(shi)間約30秒

- reshard后檢查,bucket id和marker信息應改變
- 啟動rgw,驗證數據正確性和bucket可操作性
systemctl start ceph-radosgw.target
- 刪除reshard前的舊的bucket index instance,
注意此處的(de)bucket-id為第九步的(de)old bucket instance id,刪(shan)除耗時較(jiao)久,耐(nai)心(xin)等(deng)待其(qi)執行完(wan)成
radosgw-admin bi purge --bucket="dutestreshard1" --bucket-id=8b824a20-985f-11e8-a8d1-0cc47a57b678.225330637.1
總結
從(cong)以上(shang)處理步驟(zou)可(ke)以看到我們主要通(tong)過提高bucket的shard數(shu)量(liang)和單個shard的object數(shu)量(liang),來處理large omap objects告警,單個bucket的對象(xiang)數(shu)量(liang)還是存在理論上(shang)閾(yu)值,為(wei)(wei)了(le)保持存儲環境的可(ke)靠(kao)性和數(shu)據安(an)全(quan),在規(gui)劃數(shu)據存儲環境時,應(ying)該根據業務(wu)數(shu)量(liang)規(gui)模(mo),合理規(gui)劃bucket相(xiang)關(guan)(guan)參(can)數(shu),同時,對使用業務(wu)方進行相(xiang)關(guan)(guan)知識(shi)普及,引(yin)導使用者根據業務(wu)類型(xing)、數(shu)據類型(xing)、組(zu)織架構等規(gui)劃不(bu)同的bucket,避免出現超大數(shu)量(liang)規(gui)模(mo)的bucket,為(wei)(wei)數(shu)據存儲服務(wu)可(ke)靠(kao)、安(an)全(quan)、高效保駕護航。