rgw bucket reshard流程
ceph version
ceph version 12.2.10
ceph.conf
| 配置項 | 說明 |
| "rgw_dynamic_resharding": "true" | 是否開啟自動分片 |
| "rgw_reshard_num_logs": "16" | 分片并發數 |
| "rgw_bucket_index_max_aio": "8" | 一次下發的op數 |
| "rgw_reshard_thread_interval": "600" | 執行reshard間隔 |
| "rgw_max_objs_per_shard": "100000" | 每個bucket的索引的最大對象數 |
| "rgw_override_bucket_index_max_shards": "0" | bucket的初始化索引個數,若小于1 則以zone配置項bucket_index_max_shards為準 |
測試reshad命令
執行reshard前,有1個shard,一共5個文件:
查看bucket index 對象,有1個對象,對象omap屬性有這5個文件信息:
開始執行reshard命令,結果提示需要手動刪除舊的bucket index對象:
執行完成:
執行完成,查看bucket index有3個對象,2個新增的bucket index里分布了共5個文件信息:
手動刪除舊的bucket index對象:
再次查看查看bucket index只剩2個對象了
注意:bucket元數據新舊對象同時存在
初始化RGWReshard
ceph配置項rgw_dynamic_resharding=True且為master zone的rgw節點,rgw在初始化階段會創建RGWReshard對象并啟動進程:
rgw_rados.cc : int RGWRados::init_complete()
啟動工作進程ReshardWorker
ReshardWorker處理函數
rgw_reshard.cc:
void *RGWReshard::ReshardWorker::entry()
1.檢查能否進行reshard,若zg里有多個zone,如配置了multi容災則不能reshard:
?
2.一共有rgw_reshard_num_logs(16)個rehsard log,每個reshard log保存在omap里,依次遍歷各個reshard log里的分片任務并取出執行,每個rehsard log最多取出1000個任務執行。
do{
???for( i =0;i < rgw_reshard_num_logs(16);i ++)
???{
??for reshard_entires in list(保存在omap里reshard.num的分片任務)
??{
?????處理reshard_entires;執行成功則把reshard_entires從omap里刪除
??}
???}
????sleep(600); ?
}while (!reshard->going_down());
3.具體分片任務執行過程:
RGWBucketReshard::execute(.....)
(1)新生成一個new_bucket_id,更新信息到reshard log對應的reshard任務里(若任務被中斷后重新啟動,將跳過new_bucket_id != None的reshard 任務,不處理該任務)
(2)構造一個新的bucket index對象名字列表:.dir.${bucket_id}.0 ?~ ?dir.${bucket_id}.n
(3)下發創建初始化新bucket index 對象的命令[create,call rgw.bucket_init_index]創建新bucket index對象的omap header(對應存儲池:default.rgw.buckets.index)
(4)構造新bucket meta對象名為.bucket.meta.${bucket_name}:${bucket_id}。(對應存儲池:default.rgw.data.root)
(5)下發命令創建初始化bucket meta對象[create,call version.inc,writefull 0~391,setxattr user.rgw.acl (127)],該對象中有2個屬性version和acl)
(6)更新omap里reshard log的該bucket 的分片任務的bucket_id
(7)更新bucket index的狀態為RESHARD_IN_PROGRESS
(8)更新bucket meta對象狀態為RESHARD_IN_PROGRESS
(9)到omap里列出所有bi log里的條目,條目名形如0x0000000000002fbb'.3_kb_file'(在測試里index 對象中看到形如<80>0_00000000012.2134179.5的被過濾掉了),根據條目的idx,即文件名hash并對新shard num總數取模后計算出該文件條目應該記錄在哪個bucket index shard下并重新統計桶的已使用量,每達到RESHARD_SHARD_WINDOW(64)個文件則依次下發更新omap命令并更桶的使用量
(10)完成所有shard更新后,更新桶的創建時間為當前時間,更新user_uid_pool存儲池里${user name}.buckets對象的omap中的該bucket屬性值
(11)更新狀態為RESHARD_DONE
(12)把舊的bucket index對象刪除(沒報錯,但測試結果中顯示并未刪除)
(13)reshard過程中若出錯,則會嘗試把新建的bucket index對象刪除
dynamic reshard
自動動態調整bucket index數量
put/post 命令都會檢查是否需要進行自動分片:
rgw_rados.cc : check_bucket_shards :
1.檢查conf參數rgw_dynamic_resharding,為false則不需要進行自動分片并return
2.計算當前bucket的總對象數是否大于num_shards * conf.rgw_max_objs_per_shard(即桶索引個數x每個索引的最大對象數)
3.若計算結果為true則需要自動分片,計算新的索引個數=當前bucket的總對象數*2/conf.rgw_max_objs_per_shard ,調整最后結果取min(新的索引個數,65521)
4.把bucket的分片任務加入shard log中等待處理
bucket reshard命令
例:radosgw-admin bucket reshard --bucket=xxx --num-shards=64
rgw_admin.cc
?
1.校驗參數:
要求num_shards <= 65521
要求num_shards > 該bucket 當前的shard num
2.構造分片對象RGWBucketReshard br 并立即執行分片任務br.execute
reshard add命令
例: radosgw-admin reshard add --bucket=xxx?--num-shards=64
1.校驗參數:
要求num_shards <= 65521
要求num_shards > 該bucket 當前的shard num
2.把【tenant + ":" + bucket_name】hash后去取模計算reshard_id
3把bucket的reshard信息添加到omap里key:val=reshard_id: reshard_of_bucket_info
4.如shard_id=9則把信息加到5:55b0279d:reshard::reshard.0000000009:head 里
reshard list命令
例:radosgw-admin reshard list
遍歷列出rgw_reshard_num_logs個reshard log對象:reshard.0000000000 ~ reshard.000000000x里的分片任務
reshard process命令
例:radosgw-admin reshard process
遍歷rgw_reshard_num_logs個reshard log對象:reshard.0000000000 ~ reshard.000000000x
逐個啟動reshard log對象里的分片任務
reshard cancel命令
例: radosgw-admin reshard cancel --bucket=test-1
?
先去獲取RGWBucketReshard 該bucket的分片對象鎖,若分片正在進行則會獲取失敗不能cancel.否則更新新建的bucket index 對象/bucket meta對象的狀態為CLS_RGW_RESHARD_NONE ,把bucket的reshard信息從omap里刪除key:val=reshard_id: reshard_of_bucket_info
reshard status命令
ceph versiion >= v12.2.11才有的命令。
例:radosgw-admin reshard status --bucket=test-1
若bucket不處于resharding狀態則讀出為空,否則列出status/entry/reshard_status/new_bucket_instance_id/num_shards
?
總結
以上是生活随笔為你收集整理的rgw bucket reshard流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fpga驱动rgb液晶屏_用FPGA设计
- 下一篇: Excel拆分同一单元格的两行内容为两行