本文翻譯自: https://ceph.com/community/new-luminous-rgw-dynamic-bucket-sharding/算法
翻譯術語說明:bash
bucket sharding : 桶分片服務器
dynamic bucket sharding:動態桶分片併發
backet reshading:桶重分片性能
Luminous爲RGW增長了一種新的特性:自動管理RGW中桶的索引對象的分片。在這以前,Ceph的管理員須要時刻操心那些有很大的桶的用戶由於桶太大而致使性能和可靠性問題,如今,Luminous將徹底自動地管理RGW的內部索引對象。線程
背景翻譯
Ceph最重要的設計理念之一就是:萬物皆可擴展。Ceph從一開始就設計成容許以水平方式進行擴展,同時也要求全部後續增長的特性也能水平擴展。這種設計哲學在Ceph內部的全部組件(好比mon,osd,mds,rgw等)中已經獲得了很好的體現:當資源快用完時,老是能夠經過增長新的機器,在新機器上部署新節點來使得集羣的總體性能獲得提高。設計
RADOS(Ceph的底層對象存儲)的一個特徵是它並不在系統裏保存全部對象的索引,而是使用CRUSH算法,根據對象的名稱,集羣配置和集羣狀態來計算出對象所在的節點。因爲不須要使用元數據服務器,全部的IO操做都不須要與元數據服務器進行交互,這樣全部的IO吞吐能夠分散到多個OSD節點上,這個特徵使得水平擴展成爲可能。RADOS網關(RGW)是在RADOS的基礎上實現的,它提供了一套兼容S3接口的對象存儲服務,經過RGW來訪問對象時不須要用到任何索引。日誌
然而,RGW仍然爲每一個桶維護了一個索引,在這個索引裏保存了桶裏面全部對象的元數據列表。之因此這樣作是由於根據s3接口的定義,RGW須要提供訪問這些數據的接口(好比,列出RGW的桶內容接口),可是底層的 RADOS 並無提供有效率的列表功能。此外,還有些其餘的任務也會用到桶索引,好比維護一套日誌功能來實現每一個操做生成一個版本,桶容量的元數據和使用日誌對多區域進行同步。桶索引並不會影響對象的讀操做,可是寫新對象或修改對象須要增長額外的步驟。code
由此帶來了兩個影響:其一,在一個對象中保存桶索引的數據是有限的。原本,咱們採用RADOS對象的key-value接口來實現桶索引是沒有限制的,每一個桶默認只有一個RADOS對象用來保存索引。但當這個索引對象變得很大時,就會產生性能和可靠性問題,在極端狀況下甚至可能由於恢復操做變得很慢從而致使OSD節點下線。其二,由於桶的全部寫操做都須要修改和序列化桶索引所使用到的那個 RADOS 對象,因此最終會有性能瓶頸。
在Hammer版本中引入了桶分片特性來解決這個問題。每一個桶索引可使用多個 RADOS 對象來保存,每一個 RADOS 對象稱爲一個分片,經過將索引分片的方式來支持一個桶裏面保存對象數量的持續增加。可是,這個機制只適應於那些新建立的桶,而且須要提早規劃好桶的最終容量。因而咱們又增長了一套桶重分片的管理指令,經過些套指令能夠修改桶索引的分片數量。可是,每每只有當桶索引已經開始出現問題時管理員纔會意識到要開始進行重分片,而且在重分片的過程當中不能對桶有寫操做(這會很不方便甚至作不到)。
動態桶重分片
最終,Luminous版本引入了動態桶重分片功能。隨着桶裏面的對象數量增加桶的索引將會自動進行重分片。並且,在重分片的過程當中,再也不須要中止向對桶的IO操做(儘管在重分片進行過程當中一些併發操做的時延可能會變長)。 radosgw進程會自動判斷桶是否到了須要重分片的時機(當每一個分片索引的對象數量過大時),由一個單獨的線程來負責安排重分片操做。
配置
自動重分片特性默認是開啓的,管理員不須要作額外的動做也不須要關心實現細節。
把rgw dynamic resharding設置爲false 能夠關閉自動重分片特性 。"rgw max objs per shared"控制每一個分片索引的對象數量(默認爲10w)。重分片線程會定時執行,執行的時間間隔由配置項「rgw reshard thread interval」決定(默認爲10分鐘)。
有一些新的radosgw-admin指令能夠用來監控和控制重分片的執行過程:
$ radosgw-admin reshard add --bucket=<bucket> --num-shards=<num_shards>
$ radosgw-admin reshard list
$ radosgw-admin reshard process
$ radosgw-admin reshard cancel --bucket=<bucket>
結論
在Luminous版的RGW中,用戶再也不須要操心索引的內部分片了。這個功能是Ceph爲了讓系統更簡單,好用,能自動管理而對底層所進行的諸多改造的成果之一。