天天看點

Ceph分布式存儲實戰.

Ceph分布式存儲實戰.

雲計算與虛拟化技術叢書

ceph分布式存儲實戰

ceph中國社群 著

圖書在版編目(cip)資料

ceph分布式存儲實戰/ceph中國社群著. —北京:機械工業出版社,2016.11

(雲計算與虛拟化技術叢書)

isbn 978-7-111-55358-8

i. c… ii. c… iii. 分布式檔案系統 iv. tp316

中國版本圖書館cip資料核字(2016)第274895号

出版發行:機械工業出版社(北京市西城區百萬莊大街22号 郵政編碼:100037)

責任編輯:高婧雅 責任校對:殷 虹

印  刷: 版  次:2016年12月第1版第1次印刷

開  本:186mm×240mm 1/16 印  張:19.5

書  号:isbn 978-7-111-55358-8 定  價:69.00元

凡購本書,如有缺頁、倒頁、脫頁,由本社發行部調換

客服熱線:(010)88379426 88361066 投稿熱線:(010)88379604

購書熱線:(010)68326294 88379649 68995259 讀者信箱:[email protected]

版權所有·侵權必究

封底無防僞标均為盜版

本書法律顧問:北京大成律師事務所 韓光/鄒曉東

praise 本書贊譽

正如openstack日漸成為開源雲計算的标準軟體棧,ceph也被譽為軟體定義存儲開源項目的領頭羊。細品本書,慢嗅“基礎理論講解簡明扼要,技術實戰闡述深入全面”之清香。千言萬語,不如動手一戰。ceph愛好者們,請啟動機器,拿起本書,早日踏上ceph專家之路。

—陳緒,博士,英特爾中國雲計算戰略總監,中國開源軟體推進聯盟常務副秘書長,2015年中日韓東北亞開源論壇最高獎項“特别貢獻獎”獲得者

ceph是主流的開源分布式存儲作業系統。我們看到越來越多的雲服務商和企業使用者開始考察ceph,把它作為建構“統一存儲”和“軟體定義存儲”的可信賴解決方案。ceph的crush算法引擎,聰明地解決了資料分布效率問題,奠定了它勝任各種規模存儲池叢集的堅實基礎。過去5年,在red hat、intel等軟硬體基礎設施上司者的推動下,ceph開源社群有超過10倍的增長—不僅僅具備廣泛的硬體相容性體系,大量上下遊廠商添磚加瓦,也吸引了很多營運商、企業使用者參與改進。xsky很榮幸作為社群的一員,見證與實踐着ceph幫助使用者進行存儲基礎架構革新的曆程。我們欣喜地看到由ceph中國社群撰寫的本書的問世,這是一部在立意和實踐方面均不輸于同期幾本英文書籍的作品,深入淺出,娓娓道來,凝結了作者的熱情和心血。我們誠摯地向業内技術同行和ceph潛在使用者推薦此書!願ceph中國社群在推進開源事業的道路上取得更大的成功!

—胥昕,xsky星辰天合(北京)資料科技有限公司ceo

在開源軟體定義存儲(sds)領域,ceph是當之無愧的王者項目。随着iaas技術的火熱發展,越來越多的使用者開始在生産環境中部署sds。伴随着基礎設施開源化的趨勢,很多使用者希望部署開源的sds,ceph成為了他們的第一選擇。跟大多數開源軟體項目一樣,ceph具有優秀的技術特性,但也存在着部署難、運維難的問題。在使用開源ceph發行版時,使用者需要對ceph的實作原理、部署運維最佳實踐有一定了解,才能在生産環境中穩定使用這一開源技術。長期以來,中文技術社群一直沒有一本對ceph的原理、生産實踐、運維實踐進行剖析的好書,本書的出現填補了這一空白。該書不僅從原理上對ceph的核心技術進行了講解,還介紹了将ceph部署在openstack、zstack等iaas軟體上的生産環境實踐,最後着重介紹了ceph的運維和排錯,是一本不可多得的ceph百科全書,是ceph使用者、iaas開發人員必備的一本sds工具書。

—張鑫,前cloudstack核心初創人員,開源iaas項目zstack創始人

開源系統是linux的世界,開源管理平台是openstack的世界,開源存儲是ceph的世界。軟體定義存儲(sds)是存儲發展的必然趨勢,最好的開源軟體定義存儲方案無疑就是ceph,我身邊好多朋友已經開始在生産環境中大量部署ceph,ceph也表現出卓越的穩定性和性能。但是ceph的搭建和使用門檻比較高,很高興看到ceph中國社群組織編寫的本書的出版,為ceph搭建學習降低了門檻,是國内ceph愛好者的福音。ceph中國社群為ceph在中國的普及做了大量非常重要的工作,本書是一個裡程碑,相信ceph中國社群會繼續為ceph做出更多的貢獻。

—肖力,kvm雲技術社群創始人

ceph作為分布式存儲開源項目的傑出代表,在各個領域已經得到了充分驗證,可以預見,在未來的幾年時間内,ceph一定會得到更廣泛的應用。本書作為國内為數不多闡述ceph的著作,從基礎、原理和實踐多個層面進行了詳盡講解,是一本快速了解并掌握ceph的力作。

—孫琦(ray),北京休倫科技有限公司cto

軟體看開源,sds看ceph。ceph是目前影響力最大的開源軟體定義存儲解決方案,其應用範圍涵蓋塊存儲、檔案存儲和對象存儲,廣泛被業界公司所采用。

很榮幸能在第一時間讀到這本書,該書從ceph的部署開始,闡明了ceph各個主要子產品及其功能,介紹了ceph在塊存儲、檔案存儲和對象存儲不同場景下的應用方式,指明了ceph性能調優的方案。尤其是最後的生産環境應用案例,解了使用ceph的技術人員的燃眉之急,給出了常見問題的解決思路,造福于整個開源雲存儲界。

無論是售前專家、開發架構師還是運維負責人,讀一讀ceph中國社群編寫的這本書,都可以細細地品一品,積極地擁抱開源、把握雲存儲的未來。

—樓炜,盤古資料資深雲和大資料架構師

作為一名早期研究ceph的人員,很高興看到ceph在近幾年如火如荼的發展狀态。在我剛接觸ceph時,很渴望得到系統化的介紹、教育訓練或指導。但當時ceph在國内還處于小衆研究狀态,高人難尋,深入全面的介紹資料更是沒有。ceph中國社群的朋友們出版這本介紹ceph的書籍,為ceph的廣大研究者和愛好者做了一件很有意義的事情。相信本書一定能夠成為ceph發展的強力助推器!

—溫濤,新華三集團(h3c公司)onestor産品研發負責人 

ceph因其先進的設計思想,良好的可靠性、可擴充性,成為存儲領域的研究熱點,被譽為“存儲的未來”,得到廣泛的部署。由ceph中國社群組織編寫的這本書是國内第一本系統介紹ceph的書籍,全書從ceph的曆史、架構、原理到部署、運維、應用案例,講解全面深入,可操作性強。本書非常适合想要了解ceph、使用ceph的讀者閱讀,也可供分布式存儲系統設計者參考。

 —汪黎,kylincloud團隊存儲技術負責人,ceph代碼貢獻者

從實用價值上看,本書從ceph的基本原理、ceph的安裝部署和ceph的應用案例等方面進行了深入淺出的講解,理論和實踐完美結合,是難得的系統闡述ceph的教科書,是廣大ceph愛好者的福音。

從理論價值上看,ceph是超融合架構下首選的開源存儲方案,本書詳細闡述了存儲相關的基本原理,不僅讓你知其然,更能讓你知其是以然。

—劉軍衛,中國移動蘇州研發中心雲計算産品部技術總監

ceph是目前最熱門的分布式存儲系統,在雲技術領域獲得了廣泛的歡迎和支援。但是目前國内與此相關的書籍非常少。如果想學習ceph,想更深入地了解ceph,而又對密密麻麻的英文望而生畏,那麼現在救星來了!本書從系統原理、基本架構、性能優化、應用實踐、運維部署等各個方面對ceph進行了全方位的介紹和分析。這是一本從入門到精通的好書,值得擁有! 

—李響,博士,中興通訊股份有限公司iaas開源項目總監

一群開源的人用開源的方式去做一件開源的事兒,我想沒有比這更合适的事情了。作為一名有着近10年的分布式存儲研發和軟體定義存儲(sds)産品及技術規劃的先行者與踐行者,很高興看到同樣已經十幾歲的ceph在衆人之力和衆人之智的推動下,吐故納新,正以日新月異的速度蓬勃發展。

ceph是每一個軟體定義存儲相關從業人員關注的重點,ceph中國社群把國内廣大的ceph愛好者聚集到一起,分享“踩坑”的經驗,承擔了95%以上ceph文檔的本土化(翻譯)工作,對ceph在國内的發展扮演着非常重要的推動作用,非常感謝ceph中國社群的每一位貢獻者。

杉岩資料作為一家商用ceph解決方案和服務提供商,随着ceph商用産品越來越多地在企業級使用者的生産環境中應用,一直期待能有一本适合國人閱讀習慣且淺顯易懂的ceph書籍,讓更多的人了解ceph的功能特性。當我有幸閱讀過此書後,我強烈建議廣大sds相關從業人員閱讀此書,你一定會收獲良多!

—陳堅,深圳市杉岩資料技術有限公司總經理

ceph從2012年開始擁抱openstack到現在已經成為openstack的首選後端存儲。很高興看到ceph中國社群把國内廣大的ceph愛好者聚集到一起,分享技術與經驗,對ceph在國内的發展起到了非常重要的推動和落地作用。也一直期待國内能有一本ceph入門相關的書籍,看到ceph中國社群出版的這本書,很是欣慰。國内ceph資料從稀缺到逐漸完善,這其中離不開ceph中國社群的貢獻和努力。

—朱榮澤,上海優銘雲計算有限公司存儲架構師

國内第一本對ceph進行全面剖析的書籍,并輔以大量的實戰操作,内容由淺入深,特别适合希望對ceph進行系統性學習的工程師,是國内ceph愛好者的福音。

—田亮,北京海雲捷迅科技有限公司解決方案總監 

ceph是開源分布式存儲領域的一顆當紅明星,随着openstack如火如荼的發展,ceph也逐漸成為了openstack的首選後端存儲。國内目前缺乏ceph入門以及相關運維書籍,ceph中國社群出版的這本書填補了國内ceph的空白,是國内ceph愛好者的福音。

—陳沙克,浙江九州雲資訊科技有限公司副總裁

由于其出色的系統設計,ceph正廣泛部署于各大雲計算廠商的生産環境中,為使用者提供對象存儲、雲硬碟和檔案系統存儲服務。本書理論聯系實際,除介紹ceph的設計理念和原理之外,還系統介紹了ceph的程式設計接口、上線部署、性能調優及應用場景,有利于讀者快速掌握ceph的運維和基于ceph的開發。此書提供了深入了解雲存儲的捷徑。

—吳興義,樂視雲技術經理

ceph誕生于傳統存儲行業正處于巅峰之時,短短十多年間,閃存(如ssd)與軟體定義存儲(sds)就聯手颠覆了存儲行業。作為軟體定義存儲領域的旗幟性項目,ceph肩負着業界的厚望,也需要“與時俱進”,繼續改進和完善,滿足目标使用者越來越高的要求。

衆所周知,ceph是個開源項目,成型于硬碟仍為主導的年代。如今,市場和使用者需要ceph更加産品化,同時充分利用閃存等固态存儲媒體帶來的性能紅利。這就要求業界精簡過時的代碼和不必要的中間層,并為ceph加入新的功能和特性,對此,我個人歸納為“先做減法,再做加法”。要達到上述目标,必須讓更多的人關注和了解ceph,特别是吸引有一定存儲經驗和積累的人或組織加入ceph生态圈。作為一本不可多得的系統介紹ceph的書籍,本書的出版正逢其時,定會為ceph生态的壯大貢獻更多的有生力量。

—張廣彬,北京企事錄技術服務公司創始人

序 preface

ceph是目前開源世界在存儲領域的裡程碑式項目,它所帶來的分布式、無中心化設計是目前衆多商用分布式存儲模仿和學習的對象。ceph社群經過十多年發展已經成為近幾年參與度增長最快的開源社群之一,而ceph中國社群正是背後的驅動力之一。從2015年開始,ceph中國社群一直努力在國内普及ceph的生态,并為廣大ceph愛好者提供了交流平台,使得衆多開源愛好者能夠進一步了解ceph的魅力。在過去的10年,開源世界慢慢成為了it創新的動力,而這10年也是國内技術愛好者受益于開源的最好時間。但是,從開源愛好者到社群的深度參與方面,尤其是在世界級開源項目上,我們還存在大缺失,而這些“溝壑”需要像ceph中國社群這樣的組織來彌補。我很欣喜地看到ceph中國社群能在最合适的時間成立并迅速成長,而且受到ceph官方社群的認可。

ceph中國社群從論壇的搭建,微信群的建立,公衆号的衆包翻譯和文章分析,到活動的組織都展現了一個開源社群最富有活力的價值。本書正是ceph中國社群給國内ceph愛好者的一份正當其時的“禮物”,本書是多位ceph實戰者在ceph叢集運維和問題讨論中形成的經驗和錦囊之集合。毫不誇張地說,本書是我目前看到的最棒的ceph入門工具書,可以幫助對分布式存儲或者ceph不太熟悉的讀者真正零距離地接觸并使用它。

王豪邁

2016年9月8日

foreword 前言

随着資訊化浪潮的到來,全球各行各業逐漸借助資訊技術深入發展。據悉,企業及網際網路資料以每年50%的速率在增長。據權威調查機構gartner預測,到2020年,全球資料量将達到35zb,相當于80億塊4tb硬碟,資料結構的變化給存儲系統帶來了全新的挑戰。那麼有什麼方法能夠存儲這些資料呢?我認為ceph是解決未來十年資料存儲需求的一個可行方案。ceph是存儲的未來!sds是存儲的未來!

為什麼寫這本書

目前,磁盤具備容量優勢,固态硬碟具備速度優勢。但能否讓容量和性能不局限在一個存儲器單元呢?我們很快聯想到磁盤陣列技術(redundant array of independent disk,raid,不限于hdd)。磁盤陣列技術是一種把多塊獨立的硬碟按不同的方式組合起來形成一個硬碟組(disk group,又稱virtual disk),進而提供比單個硬碟更高的存儲性能與資料備份能力的技術。磁盤陣列技術既可提供多塊硬碟讀寫的聚合能力,又能提供硬碟故障的容錯能力。

鏡像技術(mirroring)又稱為複制技術(replication),可提供資料備援性和高可用性;條帶(striping),可提供并行的資料吞吐能力;糾删碼(erasure code),把資料切片并增加備援編碼而提供高可用性和高速讀寫能力。鏡像、條帶和糾删碼是磁盤陣列技術經典的資料分發方式,這3種經典的磁盤技術可通過組合方式提供更加豐富的資料讀寫性能。

傳統的磁盤陣列技術的關注點在于資料在磁盤上的分發方式,随着通用磁盤、通用伺服器,以及高速網絡的成本降低,使資料在磁盤上的分發擴充到在伺服器節點上的分發成為可能。鏡像技術、條帶技術和糾删碼技術基于伺服器節點的粒度實作後,這些技術的特點不再局限于單個裝置的性能,而是具備“橫向擴充”能力。我們暫且認為這是分布式存儲本質的展現。

分布式存儲解決了資料體量問題,對應用程式提供标準統一的通路接入,既能提升資料安全性和可靠性,又能提高存儲整體容量和性能。可以預見,分布式存儲是大規模存儲的一個實作方向。分布式存儲廣泛地應用于航天、航空、石油、科研、政務、醫療、視訊等高性能計算、雲計算和大資料處理領域。目前行業應用對分布式存儲技術需求旺盛,其處于快速發展階段。

ceph是加州大學聖克魯茲分校的sage weil博士論文的研究項目,是一個使用自由開源協定(lgplv2.1)的分布式存儲系統。目前ceph已經成為整個開源存儲行業最熱門的軟體定義存儲技術(software defined storage,sds)。它為塊存儲、檔案存儲和對象存儲提供了統一的軟體定義解決方案。ceph旨在提供一個擴充性強大、性能優越且無單點故障的分布式存儲系統。從一開始,ceph就被設計為能在通用商業硬體上高度擴充。

由于其開放性、可擴充性和可靠性,ceph成為了存儲行業中的翹楚。這是雲計算和軟體定義基礎設施的時代,我們需要一個完全軟體定義的存儲,更重要的是它要為雲做好準備。無論運作的是公有雲、私有雲還是混合雲,ceph都非常合适。國内外有不少的ceph應用方案,例如美國雅虎公司使用ceph建構對象存儲系統,用于flickr、雅虎郵箱和tumblr(輕量部落格)的後端存儲;國内不少公有雲和私有雲商選擇ceph作為雲主機後端存儲解決方案。

如今的軟體系統已經非常智能,可以最大限度地利用商業硬體來運作規模龐大的基礎設施。ceph就是其中之一,它明智地采用商業硬體來提供企業級穩固可靠的存儲系統。

ceph已被不斷完善,并融入以下建設性理念。

每個元件能夠線性擴充。

無任何單故障點。

解決方案必須是基于軟體的、開源的、适應性強的。

運作于現有商業硬體之上。

每個元件必須盡可能擁有自我管理和自我修複能力。

對象是ceph的基礎,它也是ceph的建構部件,并且ceph的對象存儲很好地滿足了當下及将來非結構化資料的存儲需求。相比傳統存儲解決方案,對象儲存有其獨特優勢:我們可以使用對象存儲實作平台和硬體獨立。ceph謹慎地使用對象,通過在叢集内複制對象來實作可用性;在ceph中,對象是不依賴于實體路徑的,這使其獨立于實體位置。這種靈活性使ceph能實作從pb(petabyte)級到eb(exabyte)級的線性擴充。

ceph性能強大,具有超強擴充性及靈活性。它可以幫助使用者擺脫昂貴的專有存儲孤島。ceph是真正在商業硬體上運作的企業級存儲解決方案;是一種低成本但功能豐富的存儲系統。ceph通用存儲系統同時提供塊存儲、檔案存儲和對象存儲,使客戶可以按需使用。

由于國内許多企業決策者逐漸認識到ceph的優勢與前景,越來越多來自系統管理和傳統存儲的工程師使用ceph,并有相當數量的企業基于ceph研發分布式存儲産品,為了更好地促進ceph在國内傳播和技術交流,我們幾個愛好者成立了ceph中國社群。目前,通過網絡交流群、消息内容推送和問答互動社群,向國内關注ceph技術的同行提供資訊交流和共享平台。但是,由于資訊在傳遞過程中過于分散,偶爾編寫的文檔内容并不完整,導緻初學者在學習和使用ceph的過程中遇到不少疑惑。同時,由于官方文檔是通過英文釋出的,對英語不太熟悉的同行難于學習。鑒于此,ceph中國社群組織技術愛好者編寫本書,本書主要提供初級和中級層面的指導。根據調查回報以及社群成員的意見,我們确定了本書内容。

本書特色

在本書中,我們将采用穿插方式講述ceph分布式存儲的原理與實戰。本書側重實戰,循序漸進地講述ceph的基礎知識和實戰操作。從第1章起,讀者會了解ceph的前生今世。随着每章推進,讀者将不斷學習、不斷深入。我希望,到本書的結尾,讀者不論在概念上還是實戰上,都能夠成功駕馭ceph。每個章節在講述完基礎理論知識後會有對應的實戰操作。我們建議讀者在自己的電腦上按部就班地進行實戰操作。這樣,一來讀者不會對基礎理論知識感到困惑,二來可讓讀者通過實戰操作加深對ceph的了解。同時,如果讀者在閱讀過程中遇到困難,我們建議再重溫已閱章節或重做實驗操作,這樣将會加深了解,也可以加入ceph中國社群qq群(239404559)進行技術讨論。

讀者對象

本書适用于以下讀者。

ceph愛好者。

雲平台運維工程師。

存儲系統工程師。

系統管理者。

高等院校的學生或者教師。

本書是專門對上述讀者所打造的ceph入門級實戰書籍。如果你具備gnu/ linux和存儲系統的基本知識,卻缺乏軟體定義存儲解決方案及ceph相關的經驗,本書也是不錯的選擇。雲平台運維工程師、存儲系統工程師讀完本書之後能夠深入了解ceph原理、部署和維護好線上ceph叢集。同時,本書也适合大學高年級大學生和研究所學生作為ceph分布式存儲系統或者雲計算相關課程的參考書籍,能夠帶領你進入一個開源的分布式存儲領域,深入地了解ceph,有助于你今後的工作。

如何閱讀本書

由于ceph是運作在gnu/linux系統上的存儲解決方案,我們假定讀者掌握了存儲相關知識并熟悉gnu/linux作業系統。如果讀者在這些方面知識有欠缺,可參照閱讀其他書籍或專業資訊網站。

本書将講述如下的内容。

第1章 描述ceph的起源、主要功能、核心元件邏輯、整體架構和設計思想,并通過實戰的方式指導我們快速建立ceph運作環境。

第2章 描述ceph的分布式本質,深入分析ceph架構,并介紹如何使用librados庫。

第3章 描述crush的本質、基本原理,以及crush作用下資料與對象的映射關系。

第4章 描述ceph fs檔案系統、rbd塊存儲和object對象存儲的建立以及使用。

第5章 描述calamari的安裝過程和基本使用操作。 

第6章 描述ceph fs作為高性能計算和大資料計算的後端存儲的内容。

第7章 描述rbd在虛拟化和資料庫場景下的應用,包括openstack、cloudstack和zstack與rbd的結合。

第8章 描述基于ceph的雲盤技術方案和備份方案,描述網關的異地同步方案和多媒體轉換網關設計。

第9章 描述ceph的硬體選型、性能調優,以及性能測試方法。

第10章 描述crush的結構,并給出ssd與sata混合場景下的磁盤組織方案。

第11章 描述ceph的緩沖池原理和部署,以及糾删碼原理和糾删碼庫,最後描述糾删碼池的部署方案。

第12章 對3種存儲通路類型的生産環境案例進行分析。

第13章 描述ceph日常運維細節,以及常見錯誤的處理方法。

勘誤與支援

在本書的寫作過程,我們也參考了ceph中國社群往期沙龍一線工程師、專家分享的經驗和ceph官方文檔。我們熱切希望能夠為讀者呈現豐富而且權威的ceph存儲技術。由于ceph社群不斷發展,版本疊代速度快,筆者水準有限,書中難免存在技術延後和謬誤,懇請讀者批評指正。可将任何意見和建議發送到郵箱[email protected]或者[email protected],也可以釋出到ceph中國社群問答系統http://bbs.ceph.org.cn/。我們将密切跟蹤ceph分布式存儲技術的發展,吸收讀者寶貴意見,适時編寫本書的更新版本。ceph中國社群訂閱号為:“ceph_community”,二維碼為:

歡迎讀者掃描關注,“ceph中國社群訂閱号”會定期發送ceph技術文章、新聞資訊。也歡迎讀者通過這個微信訂閱号進行本書勘誤回報,本書的勘誤和更新也會通過訂閱号釋出。

緻謝

首先要感謝我們社群的全體志願者,社群的發展離不開全體志願者們無怨無悔的奉獻,正是有了你們才有了社群今日的繁榮,其次要感謝所有支援過我們的企業,是你們的慷慨解囊成就了ceph中國社群今日的壯大,最後感謝陳曉熹的校稿以及所有為本書編寫提供支援、幫助的人。未來,我們也非常歡迎有志将開源事業發揚光大的同學們積極加入我們的社群,和我們一起創造ceph未來的輝煌。

contents 目錄

本書贊譽

前言

第1章 初識ceph 1

1.1 ceph概述 1

1.2 ceph的功能元件 5

1.3 ceph架構和設計思想 7

1.4 ceph快速安裝 9

1.4.1 ubuntu/debian安裝 10

1.4.2 rhel/centos安裝 13

1.5 本章小結 16

第2章 存儲基石rados 17

2.1 ceph功能子產品與rados 18

2.2 rados架構 20

2.2.1 monitor介紹 20

2.2.2 ceph osd簡介 22

2.3 rados與librados 26

2.4 本章小結 31

第3章 智能分布crush 32

3.1 引言 32

3.2 crush基本原理 33

3.2.1 object與pg 34

3.2.2 pg與osd 34

3.2.3 pg與pool 35

3.3 crush關系分析 37

3.4 本章小結 41

第4章 三大存儲通路類型 42

4.1 ceph fs檔案系統 42

4.1.1 ceph fs和mds介紹 43

4.1.2 部署mds 45

4.1.3 挂載ceph fs 46

4.2 rbd塊存儲 47

4.2.1 rbd介紹 47

4.2.2 librbd介紹 48

4.2.3 krbd介紹 48

4.2.4 rbd操作 50

4.2.5 rbd應用場景 56

4.3 object對象存儲 57

4.3.1 rgw介紹 57

4.3.2 amazon s3簡介 58

4.3.3 快速搭建rgw環境 61

4.3.4 rgw搭建過程的排錯指南 68

4.3.5 使用s3用戶端通路rgw服務 71

4.3.6 admin管理接口的使用 75

4.4 本章小結 78

第5章 可視化管理calamari 79

5.1 認識calamari 79

5.2 安裝介紹 79

5.2.1 安裝calamari-server 80

5.2.2 安裝romana(calamari-client) 82

5.2.3 安裝diamond 85

5.2.4 安裝salt-minion 86

5.2.5 重新開機服務 87

5.3 基本操作 87

5.3.1 登入calamari 87

5.3.2 workbench頁面 88

5.3.3 graph頁面 89

5.3.4 manage頁面 90

5.4 本章小結 92

第6章 檔案系統—高性能計算與大資料 93

6.1 ceph fs作為高性能計算存儲 93

6.2 ceph fs作為大資料後端存儲 98

6.3 本章小結 101

第7章 塊存儲—虛拟化與資料庫 102

7.1 ceph與kvm 102

7.2 ceph與openstack 106

7.3 ceph與cloudstack 110

7.4 ceph與zstack 114

7.5 ceph提供iscsi存儲  122

7.6 本章小結 128

第8章 對象存儲—雲盤與rgw異地災備 129

8.1 網盤方案:rgw與owncloud的整合 129

8.2 rgw的異地同步方案 133

8.2.1 異地同步原理與部署方案設計 134

8.2.2 region異地同步部署實戰 137

8.3 本章小結 146

第9章 ceph硬體選型、性能測試與優化 147

9.1 需求模型與設計 147

9.2 硬體選型 148

9.3 性能調優 151

9.3.1 硬體優化 152

9.3.2 作業系統優化 155

9.3.3 網絡層面優化 161

9.3.4 ceph層面優化 170

9.4 ceph測試 174

9.4.1 測試前提 175

9.4.2 存儲系統模型 175

9.4.3 硬碟測試 176

9.4.4 雲硬碟測試 182

9.4.5 利用cosbench來測試ceph 185

9.5 本章小結 189

第10章 自定義crush 191

10.1 crush解析 191

10.2 crush設計:兩副本執行個體 201

10.3 crush設計:ssd、sata混合執行個體 207

10.3.1 場景一:快–慢存儲方案 207

10.3.2 場景二:主–備存儲方案 214

10.4 模拟測試crush分布 217

10.5 本章小結 222

第11章 緩沖池與糾删碼 223

11.1 緩沖池原理 223

11.2 緩沖池部署 225

11.2.1 緩沖池的建立與管理 226

11.2.2 緩沖池的參數配置 226

11.2.3 緩沖池的關閉 228

11.3 糾删碼原理 229

11.4 糾删碼應用實踐 232

11.4.1 使用jerasure插件配置糾删碼 232

11.4.2 isa-l插件介紹 234

11.4.3 lrc插件介紹 235

11.4.4 其他插件介紹 235

11.5 本章小結 235

第12章 生産環境應用案例 237

12.1 ceph fs應用案例 237

12.1.1 将ceph fs導出成nfs使用 238

12.1.2 在windows用戶端使用ceph fs 239

12.1.3 openstack manila項目對接ceph fs案例 242

12.2 rbd應用案例 244

12.2.1 openstack對接rbd典型架構 244

12.2.2 如何實作cinder multi-backend 246

12.3 object rgw應用案例:讀寫分離方案 248

12.4 基于hls的視訊點播方案 249

12.5 本章小結 251

第13章 ceph運維與排錯 252

13.1 ceph叢集運維 252

13.1.1 叢集擴充 252

13.1.2 叢集維護 259

13.1.3 叢集監控 266

13.2 ceph常見錯誤與解決方案 277

13.2.1 時間問題 277

13.2.2 副本數問題 279

13.2.3 pg問題 282

13.2.4 osd問題 286

13.3 本章小結 292

第1章

初識ceph

1.1 ceph概述

1. ceph簡介

從2004年送出第一行代碼開始到現在,ceph已經是一個有着十年之久的分布式存儲系統軟體,目前ceph已經發展為開源存儲界的當紅明星,當然這與它的設計思想以及openstack的推動有關。

“ceph is a unified, distributed storage system designed for excellent performance, reliability and scalability.”這句話說出了ceph的特性,它是可靠的、可擴充的、統一的、分布式的存儲系統。ceph可以同時提供對象存儲radosgw(reliable、autonomic、distributed、object storage gateway)、塊存儲rbd(rados block device)、檔案系統存儲ceph fs(ceph filesystem)3種功能,以此來滿足不同的應用需求。

ceph消除了對系統單一中心節點的依賴,進而實作了真正的無中心結構的設計思想,這也是其他分布式存儲系統所不能比的。通過後續章節内容的介紹,你可以看到,ceph幾乎所有優秀特性的實作,都與其核心設計思想有關。

openstack是目前最為流行的開源雲平台軟體。ceph的飛速發展離不開openstack的帶動。目前而言,ceph已經成為openstack的标配開源存儲方案之一,其實際應用主要涉及塊存儲和對象存儲,并且開始向檔案系統領域擴充。這一部分的相關情況,在後續章節中也将進行介紹。

2. ceph的發展

ceph是加州大學santa cruz分校的sage weil(dreamhost的聯合創始人)專為博士論文設計的新一代自由軟體分布式檔案系統。

2004年,ceph項目開始,送出了第一行代碼。

2006年,osdi學術會議上,sage發表了介紹ceph的論文,并在該篇論文的末尾提供了ceph項目的下載下傳連結。

2010年,linus torvalds将ceph client合并到核心2.6.34中,使linux與ceph磨合度更高。

2012年,擁抱openstack,進入cinder項目,成為重要的存儲驅動。

2014年,ceph正趕上openstack大熱,受到各大廠商的“待見”,吸引來自不同廠商越來越多的開發者加入,intel、sandisk等公司都參與其中,同時inktank公司被red hat公司1.75億美元收購。

2015年,red hat宣布成立ceph顧問委員會,成員包括canonical、cern、cisco、fujitsu、intel、sandisk和suse。ceph顧問委員會将負責ceph軟體定義存儲項目的廣泛議題,目标是使ceph成為雲存儲系統。

2016年,openstack社群調查報告公布,ceph仍為存儲首選,這已經是ceph第5次位居調查的首位了。

3. ceph 應用場景

ceph可以提供對象存儲、塊裝置存儲和檔案系統服務,其對象存儲可以對接網盤(owncloud)應用業務等;其塊裝置存儲可以對接(iaas),目前主流的iaas雲平台軟體,例如openstack、cloudstack、zstack、eucalyptus等以及kvm等,本書後續章節中将介紹openstack、cloudstack、zstack和kvm的對接;其檔案系統檔案尚不成熟,官方不建議在生産環境下使用。

4. ceph生态系統

ceph作為開源項目,其遵循lgpl協定,使用c++語言開發,目前ceph已經成為最廣泛的全球開源軟體定義存儲項目,擁有得到衆多it廠商支援的協同開發模式。目前ceph社群有超過40個公司的上百名開發者持續貢獻代碼,平均每星期的代碼commits超過150個,每個版本通常在2 000個commits左右,代碼增減行數在10萬行以上。在過去的幾個版本釋出中,貢獻者的數量和參與公司明顯增加,如圖1-1所示。

圖1-1 部分廠商和軟體

5. ceph使用者群

ceph成為了開源存儲的當紅明星,國内外已經擁有衆多使用者群體,下面簡單說一下ceph的使用者群。

(1)國外使用者群

1)cern:cern it部門在2013年年中開始就運作了一個單一叢集超過10 000個vm和100 000個cpu cores的雲平台,主要用來做實體資料分析。這個叢集後端ceph包括3pb的原始容量,在雲平台中作為1000多個cinder卷和1500多個glance鏡像的存儲池。在2015年開始測試單一30 pb的塊存儲rbd叢集。

2)dreamhost:dreamhost從2012年開始運作基于ceph radosgw的大規模對象存儲叢集,單一叢集在3pb以下,大約由不到10機房叢集組成,直接為客戶提供對象存儲服務。

3)yahoo flick:yahoo flick自2013年開始逐漸試用ceph對象存儲替換原有的商業存儲,目前大約由10機房構成,每個機房在1pb~2pb,存儲了大約2 500億個對象。

4)大學使用者:奧地利的因斯布魯克大學、法國的洛林大學等。

(2)國内使用者群

1)以openstack為核心的雲廠商:例如unitedstack、awcloud等國内雲計算廠商。

2)ceph産品廠商:sandisk、xsky、h3c、杉岩資料、suse和bigtera等ceph廠商。

3)網際網路企業:騰訊、京東、新浪微網誌、樂視、完美世界、平安科技、聯想、唯品會、福彩網和魅族等國内網際網路企業。

6. 社群項目開發疊代

目前ceph社群采用每半年一個版本釋出的方式來進行特性和功能的開發,每個版本釋出需要經曆設計、開發、新功能當機,持續若幹個版本的bug修複周期後正式釋出下一個穩定版本。其釋出方式跟openstack差不多,也是每半年釋出一個新版本。

ceph會維護多個穩定版本來保證持續的bug修複,以此來保證使用者的存儲安全,同時社群會有一個釋出穩定版本的團隊來維護已釋出的版本,每個涉及之前版本的bug都會被該團隊移植回穩定版本,并且經過完整qa測試後釋出下一個穩定版本。

代碼送出都需要經過單元測試,子產品維護者稽核,并通過qa測試子集後才能合并到主線。社群維護一個較大規模的測試叢集來保證代碼品質,豐富的測試案例和錯誤注入機制保證了項目的穩定可靠。

7. ceph版本

ceph正處于持續開發中并且迅速提升。2012年7月3日,sage釋出了ceph第一個lts版本:argonaut。從那時起,陸續又釋出了9個新版本。ceph版本被分為lts(長期穩定版)以及開發版本,ceph每隔一段時間就會釋出一個長期穩定版。ceph版本具體資訊見表1-1。欲了解更多資訊,請通路https://ceph.com/category/releases/。

表1-1 ceph版本資訊

ceph版本名稱 ceph版本号 釋出時間

argonaut v0.48 (lts) 2012.6.3

bobtail v0.56 (lts) 2013.1.1

cuttlefish v0.61 2013.5.7

dumpling v0.67 (lts) 2013.8.14

emperor v0.72 2013.11.9

firefly v0.80 (lts) 2014.3.7

giant v0.87.1 2015.2.26

hammer v0.94 (lts) 2015.4.7

infernalis v9.0.0 2015.5.5

jewel v10.0.0 2015.11

jewel v10.2.0 2016.3

1.2 ceph的功能元件

ceph提供了rados、osd、mon、librados、rbd、rgw和ceph fs等功能元件,但其底層仍然使用rados存儲來支撐上層的那些元件,如圖1-2所示。

圖1-2 ceph功能元件的整體架構

下面分為兩部分來講述ceph的功能元件。

(1)ceph核心元件

在ceph存儲中,包含了幾個重要的核心元件,分别是ceph osd、ceph monitor和ceph mds。一個ceph的存儲叢集至少需要一個ceph monitor和至少兩個ceph的osd。運作ceph檔案系統的用戶端時,ceph的中繼資料伺服器(mds)是必不可少的。下面來詳細介紹一下各個核心元件。

ceph osd:全稱是object storage device,主要功能包括存儲資料,處理資料的複制、恢複、回補、平衡資料分布,并将一些相關資料提供給ceph monitor,例如ceph osd心跳等。一個ceph的存儲叢集,至少需要兩個ceph osd來實作active + clean健康狀态和有效的儲存資料的雙副本(預設情況下是雙副本,可以調整)。注意:每一個disk、分區都可以成為一個osd。

ceph monitor:ceph的監控器,主要功能是維護整個叢集健康狀态,提供一緻性的決策,包含了monitor map、osd map、pg(placement group)map和crush map。

ceph mds:全稱是ceph metadata server,主要儲存的是ceph檔案系統(file system)的中繼資料(metadata)。溫馨提示:ceph的塊存儲和ceph的對象存儲都不需要ceph mds。ceph mds為基于posix檔案系統的使用者提供了一些基礎指令,例如ls、find等指令。

(2)ceph功能特性

ceph可以同時提供對象存儲radosgw(reliable、autonomic、distributed、object storage gateway)、塊存儲rbd(rados block device)、檔案系統存儲ceph fs(ceph file system)3種功能,由此産生了對應的實際場景,本節簡單介紹如下。

radosgw功能特性基于librados之上,提供目前流行的restful協定的網關,并且相容s3和swift接口,作為對象存儲,可以對接網盤類應用以及hls流媒體應用等。

rbd(rados block device)功能特性也是基于librados之上,通過librbd建立一個塊裝置,通過qemu/kvm附加到vm上,作為傳統的塊裝置來用。目前openstack、cloudstack等都是采用這種方式來為vm提供塊裝置,同時也支援快照、cow(copy on write)等功能。

ceph fs(ceph file system)功能特性是基于rados來實作分布式的檔案系統,引入了mds(metadata server),主要為相容posix檔案系統提供中繼資料。一般都是當做檔案系統來挂載。

後面章節會對這幾種特性以及對應的實際場景做詳細的介紹和分析。

1.3 ceph架構和設計思想

1. ceph架構

ceph底層核心是rados。ceph架構圖如圖1-3所示。

圖1-3 ceph架構圖

rados:rados具備自我修複等特性,提供了一個可靠、自動、智能的分布式存儲。

librados:librados庫允許應用程式直接通路,支援c/c++、java和python等語言。

radosgw:radosgw 是一套基于目前流行的restful協定的網關,并且相容s3和swift。

rbd:rbd通過linux 核心(kernel)用戶端和qemu/kvm驅動,來提供一個完全分布式的塊裝置。

ceph fs:ceph fs通過linux核心(kernel)用戶端結合fuse,來提供一個相容posix的檔案系統。

具體的rados細節以及rados的靈魂crush(controlled replication under scalable hashing,可擴充雜湊演算法的可控複制)算法,這兩個知識點會在後面的第2、3章詳細介紹和分析。

2. ceph設計思想

ceph是一個典型的起源于學術研究課題的開源項目。雖然學術研究所學生涯對于sage而言隻是其光輝事迹的短短一篇,但畢竟還是有幾篇學術論文可供參考的。可以根據sage的幾篇論文分析ceph的設計思想。

了解ceph的設計思想,首先還是要了解sage設計ceph時所針對的應用場景,換句話說,sage當初做ceph的初衷的什麼?

事實上,ceph最初針對的應用場景,就是大規模的、分布式的存儲系統。所謂“大規模”和“分布式”,至少是能夠承載pb級别的資料和成千上萬的存儲節點組成的存儲叢集。

如今雲計算、大資料在中國發展得如火如荼,pb容量機關早已經進入國内企業存儲采購單,dt時代即将來臨。ceph項目起源于2004年,那是一個商用處理器以單核為主流,常見硬碟容量隻有幾十gb的年代。當時ssd也沒有大規模商用,正因如此,ceph之前版本對ssd的支援不是很好,發揮不了ssd的性能。如今ceph高性能面臨的最大挑戰正是這些曆史原因,目前社群和業界正在逐漸解決這些性能上的限制。

在sage的思想中,我們首先說一下ceph的技術特性,總體表現在叢集可靠性、叢集擴充性、資料安全性、接口統一性4個方面。

叢集可靠性:所謂“可靠性”,首先從使用者角度來說資料是第一位的,要盡可能保證資料不會丢失。其次,就是資料寫入過程中的可靠性,在使用者将資料寫入ceph存儲系統的過程中,不會因為意外情況出現而造成資料丢失。最後,就是降低不可控實體因素的可靠性,避免因為機器斷電等不可控實體因素而産生的資料丢失。

叢集可擴充性:這裡的“可擴充”概念是廣義的,既包括系統規模和存儲容量的可擴充,也包括随着系統節點數增加的聚合資料通路帶寬的線性擴充。

資料安全性:所謂“資料安全性”,首先要保證由于伺服器當機或者是偶然停電等自然因素的産生,資料不會丢失,并且支援資料自動恢複,自動重平衡等。總體而言,這一特性既保證了系統的高度可靠和資料絕對安全,又保證了在系統規模擴大之後,其運維難度仍能保持在一個相對較低的水準。

接口統一性:所謂“接口統一”,本書開頭就說到了ceph可以同時支援3種存儲,即塊存儲、對象存儲和檔案存儲。ceph支援市面上所有流行的存儲類型。

根據上述技術特性以及sage的論文,我們來分析一下ceph的設計思路,概述為兩點:充分發揮存儲本身計算能力和去除所有的中心點。

充分發揮儲存設備自身的計算能力:其實就是采用廉價的裝置和具有計算能力的裝置(最簡單的例子就是普通的伺服器)作為存儲系統的存儲節點。sage認為目前階段隻是将這些伺服器當做功能簡單的存儲節點,進而産生資源過度浪費(如同虛拟化的思想一樣,都是為了避免資源浪費)。而如果充分發揮節點上的計算能力,則可以實作前面提出的技術特性。這一點成為了ceph系統設計的核心思想。

去除所有的中心點:搞it的最忌諱的就是單點故障,如果系統中出現中心點,一方面會引入單點故障,另一方面也必然面臨着當系統規模擴大時的可擴充性和性能瓶頸。除此之外,如果中心點出現在資料通路的關鍵路徑上,也必然導緻資料通路的延遲增大。雖然在大多數存儲軟體實踐中,單點故障點和性能瓶頸的問題可以通過為中心點增加ha或備份加以緩解,但ceph系統最終采用crush、hash環等方法更徹底地解決了這個問題。很顯然sage的眼光和設想還是很超前的。

1.4 ceph快速安裝

在ceph官網上提供了兩種安裝方式:快速安裝和手動安裝。快速安裝采用ceph-deploy工具來部署;手動安裝采用官方教程一步一步來安裝部署ceph叢集,過于煩瑣但有助于加深印象,如同手動部署openstack一樣。但是,建議新手和初學者采用第一種方式快速部署并且測試,下面會介紹如何使用ceph-deploy工具來快速部署ceph叢集。

1.4.1 ubuntu/debian安裝

本節将介紹如何使用ceph-deploy工具來快速部署ceph叢集,開始之前先普及一下ceph-deploy工具的知識。ceph-deploy工具通過ssh方式連接配接到各節點伺服器上,通過執行一系列腳本來完成ceph叢集部署。ceph-deploy簡單易用同時也是ceph官網推薦的預設安裝工具。本節先來講下在ubuntu/debian系統下如何快速安裝ceph叢集。

1)配置ceph apt源。

root@localhos`t:~# echo deb http://ceph.com/debian-{ceph-stable-release}/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list

2)添加apt源key。

root@localhost:~# wget –q –o -'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' | sudo apt-key add -

3)更新源并且安裝ceph-deploy。

root@localhost:~# sudo apt-get update &&sudo apt-get install ceph-deploy -y

4)配置各個節點hosts檔案。

root@localhost:~# cat /etc/hosts

192.168.1.2  node1

192.168.1.3  node2

192.168.1.4  node3

5)配置各節點ssh無密碼登入,這就是本節開始時講到的ceph-deploy工具要用過ssh方式連接配接到各節點伺服器,來安裝部署叢集。輸完ssh-keygen指令之後,在指令行會輸出以下内容。

root@localhost:~# ssh-keygen

generating public/private key pair.

enter file in which to save the key (/ceph-client/.ssh/id_rsa):

enter passphrase (empty for no passphrase):

enter same passphrase again:

your identification has been saved in /ceph-client/.ssh/id_rsa.

your public key has been saved in /ceph-client/.ssh/id_rsa.pub

6)複制key到各節點。

root@localhost:~# ssh-copy-idnode1

root@localhost:~# ssh-copy-idnode2

root@localhost:~# ssh-copy-idnode3

7)在執行ceph-deploy的過程中會生成一些配置檔案,建議建立一個目錄,例如my-cluster。

root@localhost:~# mkdir my-cluster

root@localhost:~# cd my-cluster

8)建立叢集(cluster),部署新的monitor節點。

root@localhost:~# ceph-deploy new {initial-monitor-node(s)}

例如:

root@localhost:~# ceph-deploy new node1

9)配置ceph.conf配置檔案,示例檔案是預設的,可以根據自己情況進行相應調整和添加。具體優化情況本書後面會介紹。

[global]

fsid = 67d997c9-dc13-4edf-a35f-76fd693aa118

mon_initial_members = node1,node2

mon_host = 192.168.1.2,192.168.1.3

auth_cluster_required = cephx

auth_service_required = cephx

auth_client_required = cephx

filestore_xattr_use_omap = true

<!-----以上部分都是ceph-deploy預設生成的---->

public network = {ip-address}/{netmask}

cluster network={ip-addesss}/{netmask}

<!-----以上兩個網絡是新增部分,預設隻是添加public network,一般生産都是定義兩個網絡,叢集網絡和資料網絡分開-------->

[osd]

……

[mon]

這裡配置檔案不再過多叙述。

10)安裝ceph到各節點。

root@localhost:~# ceph-deploy install {ceph-node}[{ceph-node} ...]

root@localhost:~# ceph-deploy install node1 node2 node3

11)擷取密鑰key,會在my-cluster目錄下生成幾個key。

root@localhost:~# ceph-deploy mon create-initial

12)初始化磁盤。

root@localhost:~# ceph-deploy disk zap {osd-server-name}:{disk-name}

root@localhost:~# ceph-deploy disk zap node1:sdb

13)準備osd。

root@localhost:~# ceph-deploy osd prepare {node-name}:{data-disk}[:{journal-disk}]

root@localhost:~# ceph-deploy osd prepare node1:sdb1:sdc

14)激活osd。

root@localhost:~# ceph-deploy osd activate {node-name}:{data-disk-partition}[:{journal-disk-partition}]

root@localhost:~# ceph-deploy osd activate node1:sdb1:sdc

15)分發key。

root@localhost:~# ceph-deploy admin {admin-node} {ceph-node}

root@localhost:~# ceph-deploy admin node1 node2 node3

16)給admin key賦權限。

root@localhost:~# sudo chmod +r /etc/ceph/ceph.client.admin.keyring

17)檢視叢集健康狀态,如果是active+clean狀态就是正常的。

root@localhost:~# ceph health

安裝ceph前提條件如下。

① 時間要求很高,建議在部署ceph叢集的時候提前配置好ntp伺服器。

② 對網絡要求一般,因為ceph源在外國有時候會被屏蔽,解決辦法多嘗試機器或者代理。

1.4.2 rhel/centos安裝

本節主要講一下在rhel/centos系統下如何快速安裝ceph叢集。

1)配置ceph yum源。

root@localhost:~# vim /etc/yum.repos.d/ceph.repo

[ceph-noarch]

name=cephnoarch packages

baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/noarch

enabled=1

gpgcheck=1

type=rpm-md

gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc

2)更新源并且安裝ceph-deploy。

root@localhost:~# yum update &&yum install ceph-deploy -y

3)配置各個節點hosts檔案。

4)配置各節點ssh無密碼登入,通過ssh方式連接配接到各節點伺服器,以安裝部署叢集。輸入ssh-keygen指令,在指令行會輸出以下内容。

5)拷貝key到各節點。

root@localhost:~# ssh-copy-id node1

root@localhost:~# ssh-copy-id node2

root@localhost:~# ssh-copy-id node3

6)在執行ceph-deploy的過程中會生成一些配置檔案,建議建立一個目錄,例如my-cluster。

7)建立叢集(cluster),部署新的monitor節點。

8)配置ceph.conf配置檔案,示例檔案是預設的,可以根據自己情況進行相應調整和添加。具體優化情況本書後面會介紹。

9)安裝ceph到各節點。

10)擷取密鑰key,會在my-cluster目錄下生成幾個key。

11)初始化磁盤。

12)準備osd。

13)激活osd。

14)分發key。

15)給admin key賦權限。

16)檢視叢集健康狀态,如果是 active + clean 狀态就是正常的。

1.5 本章小結

本章主要從ceph的曆史背景、發展事件、ceph的架構元件、功能特性以及ceph的設計思想方面介紹了ceph,讓大家對ceph有一個全新的認識,以便後面更深入地了解ceph。

第2章

存儲基石rados

分布式對象存儲系統rados是ceph最為關鍵的技術,它是一個支援海量存儲對象的分布式對象存儲系統。rados層本身就是一個完整的對象存儲系統,事實上,所有存儲在ceph系統中的使用者資料最終都是由這一層來存儲的。而ceph的高可靠、高可擴充、高性能、高自動化等特性,本質上也是由這一層所提供的。是以,了解rados是了解ceph的基礎與關鍵。

ceph的設計哲學如下。

每個元件必須可擴充。

不存在單點故障。

解決方案必須是基于軟體的。

可擺脫專屬硬體的束縛即可運作在正常硬體上。

推崇自我管理。

由第1章的講解可以知道,ceph包含以下元件。

分布式對象存儲系統rados庫,即librados。

基于librados實作的相容swift和s3的存儲網關系統radosgw。

基于librados實作的塊裝置驅動rbd。

相容posix的分布式檔案ceph fs。

最底層的分布式對象存儲系統rados。

2.1 ceph功能子產品與rados

ceph中的這些元件與rados有什麼關系呢,筆者手繪了一張簡單的ceph架構圖,我們結合圖2-1來分析這些元件與rados的關系。

圖2-1 ceph架構圖

ceph存儲系統的邏輯層次結構大緻劃分為4部分:基礎存儲系統rados、基于rados實作的ceph fs,基于rados的librados層應用接口、基于librados的應用接口rbd、radosgw。ceph架構(見圖1-1)我們在第1章有過初步的了解,這裡詳細看一下各個子產品的功能,以此了解rados在整個ceph起到的作用。

(1)基礎存儲系統rados

rados這一層本身就是一個完整的對象存儲系統,事實上,所有存儲在ceph系統中的使用者資料最終都是由這一層來存儲的。ceph的很多優秀特性本質上也是借由這一層設計提供。了解rados是了解ceph的基礎與關鍵。實體上,rados由大量的儲存設備節點組成,每個節點擁有自己的硬體資源(cpu、記憶體、硬碟、網絡),并運作着作業系統和檔案系統。本書後續章節将對rados進行深入介紹。

(2)基礎庫librados

librados層的功能是對rados進行抽象和封裝,并向上層提供api,以便直接基于rados進行應用開發。需要指明的是,rados是一個對象存儲系統,是以,librados實作的api是針對對象存儲功能的。rados采用c++開發,所提供的原生librados api包括c和c++兩種。實體上,librados和基于其上開發的應用位于同一台機器,因而也被稱為本地api。應用調用本機上的librados api,再由後者通過socket與rados叢集中的節點通信并完成各種操作。

(3)上層應用接口

ceph上層應用接口涵蓋了radosgw(rados gateway)、rbd(reliable block device)和ceph fs(ceph file system),其中,radosgw和rbd是在librados庫的基礎上提供抽象層次更高、更便于應用或用戶端使用的上層接口。

其中,radosgw是一個提供與amazon s3和swift相容的restful api的網關,以供相應的對象存儲應用開發使用。radosgw提供的api抽象層次更高,但在類s3或swift librados的管理比便捷,是以,開發者應針對自己的需求選擇使用。rbd則提供了一個标準的塊裝置接口,常用于在虛拟化的場景下為虛拟機建立volume。目前,red hat已經将rbd驅動內建在kvm/qemu中,以提高虛拟機通路性能。

(4)應用層

應用層就是不同場景下對于ceph各個應用接口的各種應用方式,例如基于librados直接開發的對象存儲應用,基于radosgw開發的對象存儲應用,基于rbd實作的雲主機硬碟等。

下面就來看看rados的架構。

2.2 rados架構

rados系統主要由兩個部分組成,如圖2-2所示。

1)osd:由數目可變的大規模osd(object storage devices)組成的叢集,負責存儲所有的objects資料。

2)monitor:由少量monitors組成的強耦合、小規模叢集,負責管理cluster map。其中,cluster map是整個rados系統的關鍵資料結構,管理叢集中的所有成員、關系和屬性等資訊以及資料的分發。

圖2-2 rados系統架構圖示

對于rados系統,節點組織管理和資料分發政策均由内部的mon全權負責,是以,從client角度設計相對比較簡單,它給應用提供存儲接口。

2.2.1 monitor介紹

正如其名,ceph monitor是負責監視整個群集的運作狀況的,這些資訊都是由維護叢集成員的守護程式來提供的,如各個節點之間的狀态、叢集配置資訊。ceph monitor map包括osd map、pg map、mds map和crush等,這些map被統稱為叢集map。

1)monitor map。monitor map包括有關monitor節點端到端的資訊,其中包括ceph叢集id,監控主機名和ip位址和端口号,它還存儲了目前版本資訊以及最新更改資訊,可以通過以下指令檢視monitor map。

#ceph mon dump

2)osd map。osd map包括一些常用的資訊,如叢集id,建立osd map的版本資訊和最後修改資訊,以及pool相關資訊,pool的名字、pool的id、類型,副本數目以及pgp,還包括osd資訊,如數量、狀态、權重、最新的清潔間隔和osd主機資訊。可以通過執行以下指令檢視叢集的osd map。

#ceph  osd dump

3)pg map。pg map包括目前pg版本、時間戳、最新的osd map的版本資訊、空間使用比例,以及接近占滿比例資訊,同時,也包括每個pg id、對象數目、狀态、osd的狀态以及深度清理的詳細資訊,可以通過以下指令來檢視pg map。

#ceph pg dump

4)crush map。crush map包括叢集儲存設備資訊,故障域層次結構和存儲資料時定義失敗域規則資訊;可以通過以下指令檢視crush map。

#ceph osd crush dump

5)mds map。mds map包括存儲目前mds map的版本資訊、建立目前map的資訊、修改時間、資料和中繼資料pool id、叢集mds數目和mds狀态,可通過以下指令檢視叢集mds map資訊。

#ceph mds dump

ceph的mon服務利用paxos的執行個體,把每個映射圖存儲為一個檔案。ceph monitor并未為客戶提供資料存儲服務,而是為ceph叢集維護着各類map,并服務更新群集映射到客戶機以及其他叢集節點。用戶端和其他群集節點定期檢查并更新于monitor的叢集map最新的副本。

ceph monitor是個輕量級的守護程序,通常情況下并不需要大量的系統資源,低成本、入門級的cpu,以及千兆網卡即可滿足大多數的場景;與此同時,monitor節點需要有足夠的磁盤空間來存儲叢集日志,健康叢集産生幾mb到gb的日志;然而,如果存儲的需求增加時,打開低等級的日志資訊的話,可能需要幾個gb的磁盤空間來存儲日志。

一個典型的ceph叢集包含多個monitor節點。一個多monitor的ceph的架構通過法定人數來選擇leader,并在提供一緻分布式決策時使用paxos算法叢集。在ceph叢集中有多個monitor時,叢集的monitor應該是奇數;最起碼的要求是一台螢幕節點,這裡推薦monitor個數是3。由于monitor工作在法定人數,一半以上的總螢幕節點應該總是可用的,以應對當機等極端情況,這是monitor節點為n(n>0)個且n為奇數的原因。所有叢集monitor節點,其中一個節點為leader。如果leader monitor節點處于不可用狀态,其他顯示器節點有資格成為leader。生産群集必須至少有n/2個監控節點提供高可用性。

2.2.2 ceph osd簡介

ceph osd是ceph存儲叢集最重要的元件,ceph osd将資料以對象的形式存儲到叢集中每個節點的實體磁盤上,完成存儲使用者資料的工作絕大多數都是由osd deamon程序來實作的。

ceph叢集一般情況都包含多個osd,對于任何讀寫操作請求,client端從ceph monitor擷取cluster map之後,client将直接與osd進行i/o操作的互動,而不再需要ceph monitor幹預。這使得資料讀寫過程更為迅速,因為這些操作過程不像其他存儲系統,它沒有其他額外的層級資料處理。

ceph的核心功能特性包括高可靠、自動平衡、自動恢複和一緻性。對于ceph osd而言,基于配置的副本數,ceph提供通過分布在多節點上的副本來實作,使得ceph具有高可用性以及容錯性。在osd中的每個對象都有一個主副本,若幹個從副本,這些副本預設情況下是分布在不同節點上的,這就是ceph作為分布式存儲系統的集中展現。每個osd都可能作為某些對象的主osd,與此同時,它也可能作為某些對象的從osd,從osd受到主osd的控制,然而,從osd在某些情況也可能成為主osd。在磁盤故障時,ceph osd deamon的智能對等機制将協同其他osd執行恢複操作。在此期間,存儲對象副本的從osd将被提升為主osd,與此同時,新的從副本将重新生成,這樣就保證了ceph的可靠和一緻。

ceph osd架構實作由實體磁盤驅動器、在其之上的linux檔案系統以及ceph osd服務組成。對ceph osd deamon而言,linux檔案系統顯性地支援了其擴充屬性;這些檔案系統的擴充屬性提供了關于對象狀态、快照、中繼資料内部資訊;而通路ceph osd deamon的acl則有助于資料管理,如圖2-3所示。

ceph osd操作必須在一個有效的linux分區的實體磁盤驅動器上,linux分區可以是btrfs、xfs或者ext4分區,檔案系統是對性能基準測試的主要标準之一,下面來逐一了解。

1)btrfs:在btrfs檔案系統的osd相比于xfs和ext4提供了最好的性能。btrfs的主要優點有以下4點。

擴充性(scalability):btrfs最重要的設計目标是應對大型機器對檔案系統的擴充性要求。extent、b-tree和動态inode建立等特性保證了btrfs在大型機器上仍有卓越的表現,其整體性能不會随着系統容量的增加而降低。

資料一緻性(data integrity):當系統面臨不可預料的硬體故障時,btrfs采用 cow事務技術來保證檔案系統的一緻性。btrfs還支援校驗和,避免了silent corrupt(未知錯誤)的出現。而傳統檔案系統無法做到這一點。

多裝置管理相關的特性:btrfs支援建立快照(snapshot)和克隆(clone)。btrfs還能夠友善地管理多個實體裝置,使得傳統的卷管理軟體變得多餘。

結合ceph,btrfs中的諸多優點中的快照,journal of parallel(并行日志)等優勢在ceph中表現得尤為突出,不幸的是,btrfs還未能到達生産環境要求的健壯要求。暫不推薦用于ceph叢集的生産使用。

2)xfs:一種高性能的日志檔案系統,xfs特别擅長處理大檔案,同時提供平滑的資料傳輸。目前centos 7也将xfs+lvm作為預設的檔案系統。xfs的主要優點如下。

配置設定組:xfs檔案系統内部被分為多個“配置設定組”,它們是檔案系統中的等長線性存儲區。每個配置設定組各自管理自己的inode和剩餘空間。檔案和檔案夾可以跨越配置設定組。這一機制為xfs提供了可伸縮性和并行特性——多個線程和程序可以同時在同一個檔案系統上執行i/o操作。這種由配置設定組帶來的内部分區機制在一個檔案系統跨越多個實體裝置時特别有用,使得優化對下級存儲部件的吞吐量使用率成為可能。

條帶化配置設定:在條帶化raid陣列上建立xfs檔案系統時,可以指定一個“條帶化資料單元”。這可以保證資料配置設定、inode配置設定,以及内部日志被對齊到該條帶單元上,以此最大化吞吐量。

基于extent的配置設定方式:xfs檔案系統中的檔案用到的塊由變長extent管理,每一個extent描述了一個或多個連續的塊。對那些把檔案所有塊都單獨列出來的檔案系統來說,extent大幅縮短了清單。

有些檔案系統用一個或多個面向塊的位圖管理空間配置設定——在xfs中,這種結構被由一對b+樹組成的、面向extent的結構替代了;每個檔案系統配置設定組(ag)包含這樣的一個結構。其中,一個b+樹用于索引未被使用的extent的長度,另一個索引這些extent的起始塊。這種雙索引政策使得檔案系統在定位剩餘空間中的extent時十分高效。

擴充屬性:xfs通過實作擴充檔案屬性給檔案提供了多個資料流,使檔案可以被附加多個名/值對。檔案名是一個最大長度為256位元組的、以null字元結尾的可列印字元串,其他的關聯值則可包含多達64kb的二進制資料。這些資料被進一步分入兩個名字空間中,分别為root和user。儲存在root名字空間中的擴充屬性隻能被超級使用者修改,儲存在user名字空間中的可以被任何對該檔案擁有寫權限的使用者修改。擴充屬性可以被添加到任意一種 xfs inode上,包括符号連結、裝置節點和目錄等。可以使用attr指令行程式操作這些擴充屬性。xfsdump和xfsrestore工具在進行備份和恢複時會一同操作擴充屬性,而其他的大多數備份系統則會忽略擴充屬性。

xfs作為一款可靠、成熟的,并且非常穩定的檔案系統,基于配置設定組、條帶化配置設定、基于extent的配置設定方式、擴充屬性等優勢非常契合ceph osd服務的需求。美中不足的是,xfs不能很好地處理ceph寫入過程的journal問題。

3)ext4:第四代擴充檔案系統,是linux系統下的日志檔案系統,是ext3檔案系統的後繼版本。其主要特征如下。

大型檔案系統:ext4檔案系統可支援最高1 exbibyte的分區與最大16 tebibyte的檔案。

extents:ext4引進了extent檔案存儲方式,以替換ext2/3使用的塊映射(block mapping)方式。extent指的是一連串的連續實體塊,這種方式可以增加大型檔案的效率并減少分裂檔案。

日志校驗和:ext4使用校驗和特性來提高檔案系統可靠性,因為日志是磁盤上被讀取最頻繁的部分之一。

快速檔案系統檢查:ext4将未使用的區塊标記在inode當中,這樣可以使諸如e2fsck之類的工具在磁盤檢查時将這些區塊完全跳過,而節約大量的檔案系統檢查的時間。這個特性已經在2.6.24版本的linux核心中實作。

ceph osd把底層檔案系統的擴充屬性用于表示各種形式的内部對象狀态和中繼資料。xattr是以key/value形式來存儲xattr_name和xattr_value,并是以提供更多的标記對象中繼資料資訊的方法。ext4檔案系統提供不足以滿足xattr,由于xattr上存儲的位元組數的限制能力,進而使ext4檔案系統不那麼受歡迎。然而,btrfs和xfs有一個比較大的限制xattr。

ceph使用日志檔案系統,如增加了btrfs和xfs的osd。在送出資料到後備存儲器之前,ceph首先将資料寫入稱為一個單獨的存儲區,該區域被稱為journal,這是緩沖器分區在相同或單獨磁盤作為osd,一個單獨的ssd磁盤或分區,甚至一個檔案檔案系統。在這種機制下,ceph任何寫入首先是日志,然後是後備存儲,如圖2-4所示。

圖2-4 io流向圖

journal持續到後備存儲同步,每隔5s。預設情況下。10gb是該jouranl的常用的大小,但journal空間越大越好。ceph使用journal綜合考慮了存儲速度和資料的一緻性。journal允許ceph osd功能很快做小的寫操作;一個随機寫入首先寫入在上一個連續類型的journal,然後重新整理到檔案系統。這給了檔案系統足夠的時間來合并寫入磁盤。使用ssd盤作為journal盤能獲得相對較好的性能。在這種情況下,所有的用戶端寫操作都寫入到超高速ssd日志,然後重新整理到磁盤。是以,一般情況下,使用ssd作為osd的journal可以有效緩沖突發負載。

與傳統的分布式資料存儲不同,rados最大的特點如下。

① 将檔案映射到object後,利用cluster map通過crush計算而不是查找表方式定位檔案資料到儲存設備中的位置。優化了傳統的檔案到塊的映射和blockmap管理。

② rados充分利用了osd的智能特點,将部分任務授權給osd,最大程度地實作可擴充。

2.3 rados與librados

librados子產品是用戶端用來通路rados對象儲存設備的。ceph存儲叢集提供了消息傳遞層協定,用于用戶端與ceph monitor與osd互動,librados以庫形式為ceph client提供了這個功能,librados就是操作rados對象存儲的接口。所有ceph用戶端可以用librados或librados裡封裝的相同功能和對象存儲互動,librbd和libcephfs就利用了此功能。你可以用librados直接和ceph互動(如與ceph相容的應用程式、ceph接口等)。下面是簡單描述的步驟。

第1步:擷取librados。

第2步:配置叢集句柄。

第3步:建立io上下文。

第4步:關閉連接配接。

librados架構圖,如圖2-5所示。

先根據配置檔案調用librados建立一個rados,接下來為這個rados建立一個radosclient,radosclient包含3個主要子產品(finisher、messager、objector)。再根據pool建立對應的ioctx,在ioctx中能夠找到radosclient。再調用osdc對生成對應osd請求,與osd進行通信響應請求。 

下面分别介紹librados的c語言、java語言和python語言示例。

1. librados c語言示例

下面是librados c語言示例。

#include <stdio.h>

#include <string.h>

#include <rados/librados.h>

int main (int argc, char argv**)

{

        /*聲明叢集句柄以及所需參數 */

        rados_t cluster;

        char cluster_name[] = "ceph";        //叢集名稱

        char user_name[] = "client.admin";   //指定通路叢集的使用者,這裡用admin

        uint64_t flags;

        rados_ioctx_t io;                    //rados上下文句柄

        char *poolname = "data";             //目标pool名

        char read_res[100];

        char xattr[] = "en_us";

        /* 指定參數初始化句柄*/

        int err;

        err = rados_create2(&cluster, cluster_name, user_name, flags);

        if (err < 0) {

                fprintf(stderr, "%s: couldn't create the cluster handle! %s\n", argv[0], strerror(-err));

                exit(exit_failure);

        } else {

                printf("\ncreated a cluster handle.\n");

        }

        /* 讀取配置檔案用來配置句柄*/

        err = rados_conf_read_file(cluster, "/etc/ceph/ceph.conf");

                fprintf(stderr, "%s: cannot read config file: %s\n", argv[0], strerror(-err));

                printf("\nread the config file.\n");

        /* 分解參數 */

        err = rados_conf_parse_argv(cluster, argc, argv);

                fprintf(stderr, "%s: cannot parse command line arguments: %s\n", argv[0], strerror(-err));

                printf("\nread the command line arguments.\n");

        /* 連接配接叢集*/

        err = rados_connect(cluster);

                fprintf(stderr, "%s: cannot connect to cluster: %s\n", argv[0], strerror(-err));

                printf("\nconnected to the cluster.\n");

       //建立rados句柄上下文

        err = rados_ioctx_create(cluster, poolname, &io);

                fprintf(stderr, "%s: cannot open rados pool %s: %s\n", argv[0], poolname, strerror(-err));

                rados_shutdown(cluster);

                printf("\ncreated i/o context.\n");

        //寫對象

        err = rados_write(io, "hw", "hello world!", 12, 0);

                fprintf(stderr, "%s: cannot write object \"hw\" to pool %s: %s\n", argv[0], poolname, strerror(-err));

                rados_ioctx_destroy(io);

                exit(1);

                printf("\nwrote \"hello world\" to object \"hw\".\n");

       //設定對象屬性

        err = rados_setxattr(io, "hw", "lang", xattr, 5);

                fprintf(stderr, "%s: cannot write xattr to pool %s: %s\n", argv[0], poolname, strerror(-err));

                printf("\nwrote \"en_us\" to xattr \"lang\" for object \"hw\".\n");

        rados_completion_t comp;

       //确認異步rados句柄成功建立

        err = rados_aio_create_completion(null, null, null, &comp);

                fprintf(stderr, "%s: could not create aio completion: %s\n", argv[0], strerror(-err));

                printf("\ncreated aio completion.\n");

        /* next, read data using rados_aio_read. */

        //異步讀對象

        err = rados_aio_read(io, "hw", comp, read_res, 12, 0);

                fprintf(stderr, "%s: cannot read object. %s %s\n", argv[0], poolname, strerror(-err));

                printf("\nread object \"hw\". the contents are:\n %s \n", read_res);

       //等待對象上的操作完成

        rados_wait_for_complete(comp);

        // 釋放complete句柄 

        rados_aio_release(comp);

        char xattr_res[100];

       //擷取對象

        err = rados_getxattr(io, "hw", "lang", xattr_res, 5);

                fprintf(stderr, "%s: cannot read xattr. %s %s\n", argv[0], poolname, strerror(-err));

                printf("\nread xattr \"lang\" for object \"hw\". the contents are:\n %s \n", xattr_res);

       //移除對象屬性

        err = rados_rmxattr(io, "hw", "lang");

                fprintf(stderr, "%s: cannot remove xattr. %s %s\n", argv[0], poolname, strerror(-err));

                printf("\nremoved xattr \"lang\" for object \"hw\".\n");

       //删除對象

        err = rados_remove(io, "hw");

                fprintf(stderr, "%s: cannot remove object. %s %s\n", argv[0], poolname, strerror(-err));

                printf("\nremoved object \"hw\".\n");

    rados_ioctx_destroy(io);                  //銷毀io上下文

    rados_shutdown(cluster);                  //銷毀句柄

}

2. librados java語言示例

下面是librados java語言示例。

import com.ceph.rados.rados;

import com.ceph.rados.radosexception;

import java.io.file;

public class cephclient {

        public static void main (string args[]){

                try {

                        //擷取句柄

                        rados cluster = new rados("admin");

                        system.out.println("created cluster handle.");

                        file f = new file("/etc/ceph/ceph.conf");

                        //讀取配置檔案

                        cluster.confreadfile(f);

                        system.out.println("read the configuration file.");

                       //連接配接叢集

                        cluster.connect();

                        system.out.println("connected to the cluster.");

                } catch (radosexception e) {

                        system.out.println(e.getmessage()+":"+e.getreturnvalue());

                }

3. librados python語言示例

下面是librados python語言示例。

#!/usr/bin/python

#encoding=utf-8

import rados, sys

cluster = rados.rados(conffile='/etc/ceph/ceph.conf')   #擷取句柄

print "\n\ni/o context and object operations"

print "================================="

print "\ncreating a context for the 'data' pool"

if not cluster.pool_exists('data'):                  

raise runtimeerror('no data pool exists')

ioctx = cluster.open_ioctx('data')                  #擷取pool的io上下文句柄

print "\nwriting object 'hw' with contents 'hello world!' to pool 'data'."

ioctx.write("hw", "hello world!")                 #寫入對象

print "writing xattr 'lang' with value 'en_us' to object 'hw'"

ioctx.set_xattr("hw", "lang", "en_us")          #設定對象的屬性

print "\nwriting object 'bm' with contents 'bonjour tout le monde!' to pool 'data'."

ioctx.write("bm", "bonjour tout le monde!")

print "writing xattr 'lang' with value 'fr_fr' to object 'bm'"

ioctx.set_xattr("bm", "lang", "fr_fr")

print "\ncontents of object 'hw'\n------------------------"

print ioctx.read("hw")                   #讀取對象

print "\n\ngetting xattr 'lang' from object 'hw'"

print ioctx.get_xattr("hw", "lang")        #讀取對象屬性

print "\ncontents of object 'bm'\n------------------------"

print ioctx.read("bm")

  print "\nclosing the connection."

ioctx.close()                           #關閉io上下文

print "shutting down the handle."

cluster.shutdown()                      #銷毀句柄

2.4 本章小結

本章從宏觀角度剖析了ceph架構,将ceph架構分為基礎存儲系統rados、基于rados實作的cephfs,基于rados的librados層應用接口、基于librados的應用接口rbd、radosgw,其中着重講解了rados的組成部分mon、osd及其功能,最後解析librados api的基本用法。

第3章

智能分布crush

3.1 引言

資料分布是分布式存儲系統的一個重要部分,資料分布算法至少要考慮以下3個因素。

1)故障域隔離。同份資料的不同副本分布在不同的故障域,降低資料損壞的風險。

2)負載均衡。資料能夠均勻地分布在磁盤容量不等的存儲節點,避免部分節點空閑,部分節點超載,進而影響系統性能。

3)控制節點加入離開時引起的資料遷移量。當節點離開時,最優的資料遷移是隻有離線節點上的資料被遷移到其他節點,而正常工作的節點的資料不會發生遷移。

對象存儲中一緻性hash和ceph的crush算法是使用比較多的資料分布算法。在aamzon的dyanmo鍵值存儲系統中采用一緻性hash算法,并且對它做了很多優化。openstack的swift對象存儲系統也使用了一緻性hash算法。

crush(controlled replication under scalable hashing)是一種基于僞随機控制資料分布、複制的算法。ceph是為大規模分布式存儲系統(pb級的資料和成百上千台儲存設備)而設計的,在大規模的存儲系統裡,必須考慮資料的平衡分布和負載(提高資源使用率)、最大化系統的性能,以及系統的擴充和硬體容錯等。crush就是為解決以上問題而設計的。在ceph叢集裡,crush隻需要一個簡潔而層次清晰的裝置描述,包括存儲叢集和副本放置政策,就可以有效地把資料對象映射到儲存設備上,且這個過程是完全分布式的,在叢集系統中的任何一方都可以獨立計算任何對象的位置;另外,大型系統存儲結構是動态變化的(存儲節點的擴充或者縮容、硬體故障等),crush能夠處理儲存設備的變更(添加或删除),并最小化由于儲存設備的變更而導緻的資料遷移。

3.2 crush基本原理

衆所周知,儲存設備具有吞吐量限制,它影響讀寫性能和可擴充性能。是以,存儲系統通常都支援條帶化以增加存儲系統的吞吐量并提升性能,資料條帶化最常見的方式是做raid。與ceph的條帶化最相似的是raid 0或者是“等量磁碟區”。ceph條帶化提供了類似于raid 0的吞吐量,n路raid鏡像的可靠性以及更快速的恢複能力。

在磁盤陣列中,資料是以條帶(stripe)的方式貫穿在磁盤陣列所有硬碟中的。這種資料的配置設定方式可以彌補os讀取資料量跟不上的不足。

1)将條帶單元(stripe unit)從陣列的第一個硬碟到最後一個硬碟收集起來,就可以稱為條帶(stripe)。有的時候,條帶單元也被稱為交錯深度。在光纖技術中,一個條帶單元被叫作段。

2)資料在陣列中的硬碟上是以條帶的形式分布的,條帶化是指資料在陣列中所有硬碟中的存儲過程。檔案中的資料被分割成小塊的資料段在陣列中的硬碟上順序的存儲,這個最小資料塊就叫作條帶單元。

決定ceph條帶化資料的3個因素。

對象大小:處于分布式叢集中的對象擁有一個最大可配置的尺寸(例如,2mb、4mb等),對象大小應該足夠大以适應大量的條帶單元。

條帶寬度:條帶有一個可以配置的單元大小,ceph client端将資料寫入對象分成相同大小的條帶單元,除了最後一個條帶之外;每個條帶寬度,應該是對象大小的一小部分,這樣使得一個對象可以包含多個條帶單元。

條帶總量:ceph用戶端寫入一系列的條帶單元到一系列的對象,這就決定了條帶的總量,這些對象被稱為對象集,當ceph用戶端端寫入的對象集合中的最後一個對象之後,它将會傳回到對象集合中的第一個對象處。

3.2.1 object與pg

ceph條帶化之後,将獲得n個帶有唯一oid(即object的id)。object id是進行線性映射生成的,即由file的中繼資料、ceph條帶化産生的object的序号連綴而成。此時object需要映射到pg中,該映射包括兩部分。

1)由ceph叢集指定的靜态hash函數計算object的oid,擷取到其hash值。

2)将該hash值與mask進行與操作,進而獲得pg id。

根據rados的設計,假定叢集中設定的pg總數為m(m一般為2的整數幂),則mask的值為m–1。由此,hash值計算之後,進行按位與操作是想從所有pg中近似均勻地随機選擇。基于該原理以及機率論的相關原理,當用于數量龐大的object以及pg時,獲得到的pg id是近似均勻的。

計算pg的id示例如下。

1)client輸入pool id和對象id(如pool=‘liverpool’,object-id=‘john’)。

2)crush獲得對象id并對其hash運算。

3)crush計算osd個數,hash取模獲得pg的id(如0x58)。

4)crush獲得已命名pool的id(如liverpool=4)。

5)crush預先考慮到pool id相同的pg id(如4.0x58)。

3.2.2 pg與osd

由pg映射到資料存儲的實際單元osd中,該映射是由crush算法來确定的,将pg id作為該算法的輸入,獲得到包含n個osd的集合,集合中第一個osd被作為主osd,其他的osd則依次作為從osd。n為該pg所在pool下的副本數目,在生産環境中n一般為3;osd集合中的osd将共同存儲和維護該pg下的object。需要注意的是,crush算法的結果不是絕對不變的,而是受到其他因素的影響。其影響因素主要有以下兩個。

一是目前系統狀态。也就是上文邏輯結構中曾經提及的cluster map(叢集映射)。當系統中的osd狀态、數量發生變化時,cluster map可能發生變化,而這種變化将會影響到pg與osd之間的映射。

二是存儲政策配置。這裡的政策主要與安全相關。利用政策配置,系統管理者可以指定承載同一個pg的3個osd分别位于資料中心的不同伺服器乃至機架上,進而進一步改善存儲的可靠性。

是以,隻有在cluster map和存儲政策都不發生變化的時候,pg和osd之間的映射關系才是固定不變的。在實際使用中,政策一經配置通常不會改變。而系統狀态的改變或者是因為裝置損壞,或者是因為存儲叢集規模擴大。好在ceph本身提供了對于這種變化的自動化支援,因而,即便pg與osd之間的映射關系發生了變化,并不會對應用造成困擾。事實上,ceph正是需要有目的的利用這種動态映射關系。正是利用了crush的動态特性,ceph才可以将一個pg根據需要動态遷移到不同的osd組合上,進而自動化地實作高可靠性、資料分布re-blancing等特性。

之是以在此次映射中使用crush算法,而不是其他hash算法,原因之一是crush具有上述可配置特性,可以根據管理者的配置參數決定osd的實體位置映射政策;另一方面是因為crush具有特殊的“穩定性”,也就是當系統中加入新的osd導緻系統規模增大時,大部分pg與osd之間的映射關系不會發生改變,隻有少部分pg的映射關系會發生變化并引發資料遷移。這種可配置性和穩定性都不是普通hash算法所能提供的。是以,crush算法的設計也是ceph的核心内容之一。

3.2.3 pg與pool

ceph存儲系統支援“池”(pool)的概念,這是存儲對象的邏輯分區。

ceph client端從ceph mon端檢索cluster map,寫入對象到pool。pool的副本數目,crush規則和pg數目決定了ceph将資料存儲的位置,如圖3-1所示。

pool至少需要設定以下參數。

對象的所有權/通路權。

pg數目。

該pool使用的crush規則。

對象副本的數目。

object、pg、pool、osd關系圖,如圖3-2所示。

圖3-2 映射關系圖

pool相關的操作如下。

1)建立pool。

ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated] \

     [crush-ruleset-name] [expected-num-objects]

ceph osd pool create {pool-name} {pg-num}  {pgp-num}   erasure \

     [erasure-code-profile] [crush-ruleset-name] [expected_num_objects]

2)配置pool配額。

ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]

3)删除pool。

ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]

4)重命名pool。

ceph osd pool rename {current-pool-name} {new-pool-name}

5)展示pool統計。

rados df

6)給pool做快照。

ceph osd pool mksnap {pool-name} {snap-name}

7)删除pool快照。

ceph osd pool rmsnap {pool-name} {snap-name}

8)配置pool的相關參數。

ceph osd pool set {pool-name} {key} {value}

9)擷取pool參數的值。

ceph osd pool get {pool-name} {key}

10)配置對象副本數目。

ceph osd pool set {poolname} size {num-replicas}

11)擷取對對象副本數目。

ceph osd dump | grep 'replicated size'

3.3 crush關系分析

從本質上講,crush算法是通過儲存設備的權重來計算資料對象的分布的。在計算過程中,通過cluster map(叢集映射)、data distribution policy(資料分布政策)和給出的一個随機數共同決定資料對象的最終位置。

1. cluster map

cluster map記錄所有可用的存儲資源及互相之間的空間層次結構(叢集中有多少個機架、機架上有多少伺服器、每個機器上有多少磁盤等資訊)。所謂的map,顧名思義,就是類似于我們生活中的地圖。在ceph存儲裡,資料的索引都是通過各種不同的map來實作的。另一方面,map 使得ceph叢集儲存設備在實體層作了一層防護。例如,在多副本(常見的三副本)的結構上,通過設定合理的map(故障域設定為host級),可以保證在某一伺服器當機的情況下,有其他副本保留在正常的存儲節點上,能夠繼續提供服務,實作存儲的高可用。設定更高的故障域級别(如rack、row等)能保證整機櫃或同一排機櫃在掉電情況下資料的可用性和完整性。

(1)cluster map的分層結構

cluster map由device和bucket構成。它們都有自己的id和權重值,并且形成一個以device為葉子節點、bucket為軀幹的樹狀結構,如圖3-3所示。

圖3-3 crush架構圖

bucket擁有不同的類型,如host、row、rack、room等,通常我們預設把機架類型定義為rack,主機類型定義為host,資料中心(idc機房)定義為data center。bucket的類型都是虛拟結構,可以根據自己的喜好設計合适的類型。device節點的權重值代表了儲存設備的容量與性能。其中,磁盤容量是權重大小的關鍵因素。

osd 的權重值越高,對應磁盤會被配置設定寫入更多的資料。總體來看,資料會被均勻寫入分布于群集所有磁盤,進而提高整體性能和可靠性。無論磁盤的規格容量,總能夠均勻使用。

關于osd權重值的大小值的配比,官方預設值設定為1tb容量的硬碟,對應權重值為1。

可以在/etc/init.d/ceph 原碼裡檢視相關的内容。

363             get_conf osd_weight "" "osd crush initial weight"

364             defaultweight="$(df -p -k $osd_data/. | tail -1 | awk '{ print sprintf("%.2f",$2/1073741824) }')"  ###此處就是ceph預設權重的設定值

            get_conf osd_keyring "$osd_data/keyring" "keyring"

366             do_cmd_okfail "timeout 30 $bindir/ceph -c $conf --name=osd.$id --keyring=$osd_keyring     osd crush create-or-move -- $id ${osd_weight:-${defaultweight:-1}} $osd_location"

(2)恢複與動态平衡

在預設設定下,當叢集裡有元件出現故障時(主要是osd,也可能是磁盤或者網絡等),ceph會把osd标記為down,如果在300s内未能回複,叢集就會開始進行恢複狀态。這個“300s”可以通過“mon osd down out interval”配置選項修改等待時間。pg(placement  groups)是ceph資料管理(包括複制、修複等動作)單元。當用戶端把讀寫請求(對象單元)推送到ceph時,通過crush提供的hash算法把對象映射到pg。pg在crush政策的影響下,最終會被映射到osd上。

2. data distribution policy

data distribution policy由placement rules組成。rule決定了每個資料對象有多少個副本,這些副本存儲的限制條件(比如3個副本放在不同的機架中)。一個典型的rule如下所示。

rule replicated_ruleset {    ##rule名字

    ruleset 0         # rule的id

    type replicated   ## 類型為副本模式,另外一種模式為糾删碼(ec)

    min_size 1        ## 如果存儲池的副本數大于這個值,此rule不會應用

    max_size 10       ## 如要存儲池的副本數大于這個值,此rule不會應用

    step take default  ## 以default root為入口

    step chooseleaf firstn 0 type host  ## 隔離域為host級,即不同副本在不同的主機上

    step emit        ## 送出

根據實際的裝置環境,可以定制出符合自己需求的rule,詳見第10章。

3. crush中的僞随機 

先來看一下資料映射到具體osd的函數表達形式。

crush(x) -> (osd1, osd2, osd3.....osdn)  

crush使用了多參數的hash函數在hash之後,映射都是按既定規則選擇的,這使得從x到osd的集合是确定的和獨立的。crush隻使用cluster map、placement rules、x。crush是僞随機算法,相似輸入的結果之間沒有相關性。關于僞随機的确認性和獨立性,以下我們以一個執行個體來展示。

 [root@host-192-168-0-16 ~]# ceph osd tree 

id weight  type name               up/down  reweight  primary-affinity 

-1 0.35999 root default                                                 

-3 0.09000     host host-192-168-0-17                                   

 2 0.09000         osd.2                   up  1.00000          1.00000 

-4 0.09000     host host-192-168-0-18                                   

 3 0.09000         osd.3                   up  1.00000          1.00000 

-2 0.17999     host host-192-168-0-16                                   

 0 0.09000         osd.0                   up  1.00000          1.00000 

 1 0.09000         osd.1                   up  1.00000          1.00000

以上是某個ceph叢集的存儲的crush結構。在此叢集裡我們手動建立一個pool,并指定為8個pg和pgp。

[root@host-192-168-0-16 ~]# ceph  osd pool create  crush  8   8 

pool 'crush' created

pgp是pg的邏輯承載體,是crush算法不可缺少的部分。在ceph叢集裡,增加pg數量,pg到osd的映射關系就會發生變化,但此時存儲在pg裡的資料并不會發生遷移,隻有當pgp的數量也增加時,資料遷移才會真正開始。關于pg和pgp的關系,假如把pg比作參加宴會的人,那麼pgp就是人坐的椅子,如果人員增加時,人的座位排序就會發生變化,隻有增加椅子時,真正的座位排序變更才會落實。是以,人和椅子的數量一般都保持一緻。是以,在ceph裡,通常把pgp和pg設定成一緻的。

可以檢視pg映射osd的集合,即pg具體配置設定到osd的歸屬。

 [root@host-192-168-0-16 ~]# ceph pg dump | grep ^22\. | awk '{print $1 "\t"   $17}'    ## 22 表示 pool id ##

dumped all in format plain

22.1 [1,2,3]    

22.0   [1,2,3]

22.3  [3,1,2]

22.2  [3,2,0]

22.5 [1,3,2]

22.4  [3,1,2]

22.7  [2,1,3]

22.6  [3,0,2]

上面示例中,第一列是pg的編号(其中22表示的pool的id),共計8個,第二列是pg映射到了具體的osd集合。如“22.1 [1,2,3]”表示pg 22.1分别在osd1、osd2和osd3分别存儲副本。

在ceph叢集裡,當有資料對象要寫入叢集時,需要進行兩次映射。第一次從object→pg,第二次是pg→osd set。每一次的映射都是與其他對象無相關的。以上充分展現了crush的獨立性(充分分散)和确定性(可确定的存儲位置)。

3.4 本章小結

本章主要圍繞ceph的核心——crush展開,講述了crush的基本原理以及crush的特性。讀者可以了解ceph基本要素的概念,重點應該把握ceph的object、pg、pool等基本核心概念,熟悉讀寫流程以及crush算法的組成、影響因素及選擇流程。基于以上掌握的要點,為後面的深入學習打好堅實的基礎。

繼續閱讀