日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

rgw bucket reshard流程

發(fā)布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 rgw bucket reshard流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ceph version

ceph version 12.2.10

ceph.conf

配置項

說明

"rgw_dynamic_resharding": "true"

是否開啟自動分片

"rgw_reshard_num_logs": "16"

分片并發(fā)數

"rgw_bucket_index_max_aio": "8"

一次下發(fā)的op數

"rgw_reshard_thread_interval": "600"

執(zhí)行reshard間隔

"rgw_max_objs_per_shard": "100000"

每個bucket的索引的最大對象數

"rgw_override_bucket_index_max_shards": "0"

bucket的初始化索引個數,若小于1 則以zone配置項bucket_index_max_shards為準

測試reshad命令

執(zhí)行reshard前,有1個shard,一共5個文件:

查看bucket index 對象,有1個對象,對象omap屬性有這5個文件信息:

開始執(zhí)行reshard命令,結果提示需要手動刪除舊的bucket index對象:

執(zhí)行完成:

執(zhí)行完成,查看bucket index有3個對象,2個新增的bucket index里分布了共5個文件信息:

手動刪除舊的bucket index對象:

再次查看查看bucket index只剩2個對象了

注意:bucket元數據新舊對象同時存在

初始化RGWReshard

ceph配置項rgw_dynamic_resharding=True且為master zone的rgw節(jié)點,rgw在初始化階段會創(chuàng)建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里的分片任務并取出執(zhí)行,每個rehsard log最多取出1000個任務執(zhí)行。

do{

???for( i =0;i < rgw_reshard_num_logs(16);i ++)

???{

??for reshard_entires in list(保存在omap里reshard.num的分片任務)

??{

?????處理reshard_entires;執(zhí)行成功則把reshard_entires從omap里刪除

??}

???}

????sleep(600); ?

}while (!reshard->going_down());

3.具體分片任務執(zhí)行過程:

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)下發(fā)創(chuàng)建初始化新bucket index 對象的命令[create,call rgw.bucket_init_index]創(chuàng)建新bucket index對象的omap header(對應存儲池:default.rgw.buckets.index)

(4)構造新bucket meta對象名為.bucket.meta.${bucket_name}:${bucket_id}。(對應存儲池:default.rgw.data.root)

(5)下發(fā)命令創(chuàng)建初始化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的狀態(tài)為RESHARD_IN_PROGRESS

(8)更新bucket meta對象狀態(tài)為RESHARD_IN_PROGRESS

(9)到omap里列出所有bi log里的條目,條目名形如0x0000000000002fbb'.3_kb_file'(在測試里index 對象中看到形如<80>0_00000000012.2134179.5的被過濾掉了),根據條目的idx,即文件名hash并對新shard num總數取模后計算出該文件條目應該記錄在哪個bucket index shard下并重新統(tǒng)計桶的已使用量,每達到RESHARD_SHARD_WINDOW(64)個文件則依次下發(fā)更新omap命令并更桶的使用量

(10)完成所有shard更新后,更新桶的創(chuàng)建時間為當前時間,更新user_uid_pool存儲池里${user name}.buckets對象的omap中的該bucket屬性值

(11)更新狀態(tài)為RESHARD_DONE

(12)把舊的bucket index對象刪除(沒報錯,但測試結果中顯示并未刪除)

(13)reshard過程中若出錯,則會嘗試把新建的bucket index對象刪除

dynamic reshard

自動動態(tài)調整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 并立即執(zhí)行分片任務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對象的狀態(tài)為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狀態(tài)則讀出為空,否則列出status/entry/reshard_status/new_bucket_instance_id/num_shards

?

總結

以上是生活随笔為你收集整理的rgw bucket reshard流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。