儲存樹形資料 ceph基本架構及資料分布原理

2021-10-14 16:13:13 字數 3815 閱讀 9747

女主宣言

ceph作為雲廠商不可或缺的儲存系統之一,有著優秀的效能、可靠性和可擴充套件性,是一種統一的、分布式的儲存系統。但是,大家對ceph的技術原理有了解多少呢?本文主要從ceph概述、ceph的系統結構、資料分配策略三方面對ceph作了詳細的介紹。下來就跟隨作者一起去看看ceph是如何工作的吧。

ps:豐富的一線技術、多元化的表現形式,盡在「360雲計算」,點關注哦!

ceph簡述

什麼是ceph

ceph是一種為提高效能、可靠性和可擴充套件性而設計的統一的、分布式的儲存系統。「統一的」:意味著ceph一套儲存系統可以同時提供物件儲存、塊儲存和檔案系統儲存三種功能,以便在滿足不同應用需求的前提下簡化部署和運維。「分布式」:在ceph系統中則意味著真正的無中心結構和沒有理論上限的系統規模可擴充套件性。(在使用方面,各公司會有自己的考慮,做目前最大的ceph集群,影響ceph圈,引領ceph技術發展?求穩定,控制一定的規模等 )

ceph的技術特徵是什麼

高可靠性。首先是針對儲存在系統中的資料而言,通過多副本、糾刪碼方式盡可能保證資料不會丟失。其次,也包括資料寫入過程中的可靠性,在使用者將資料寫入ceph儲存系統的過程中,通過強一致性寫入,避免因為意外情況的出現造成資料丟失。高度自動化。具體包括了資料的自動failure detection和自動failure recovery。總體而言,這些自動化特性一方面保證了系統的高度可靠,一方面也保障了在系統規模擴大之後,其運維難度仍能保持在乙個相對較低的水平。高可擴充套件性。這裡的「可擴充套件」概念比較廣義,既包括了系統規模和儲存容量的可擴充套件,也包括了隨著系統節點數增加的聚合資料訪問頻寬的線性擴充套件,還包括了基於功能豐富強大的底層api提供多種功能、支援多種應用的功能性可擴充套件。ceph的技術這麼優秀,那麼有誰在用?

主要以雲廠商為主(基本在用openstack的,後端儲存都在用ceph)

ceph系統的層次結構

自下向上,可以將ceph系統分為四個層次:

基礎儲存系統rados(reliable, autonomic, distributed object store,即可靠的、自動化的、分布式的物件儲存)。

基礎庫librados層。

高層應用介面層:包括了三個部分:rados gw(rados gateway)、 rbd(reliable block device)和ceph fs(ceph file system)。

應用層。

osd(object storage device),可以被抽象為兩個組成部分,即系統部分和守護程序(osd deamon)部分。即一塊磁碟(一些cpu、一些記憶體),有乙個daemon程序對它操作,進行資料儲存和維護,是磁碟的「經紀人」,每個osd程序服務會監聽乙個埠,與其它osd的daemon、monitor、client通訊。

mon:monitor檢測和維護集群狀態。每個client訪問osd都需要先訪問monitor獲取集群map,從而知道需要和哪些osd節點通訊。

資料分布策略crush

ceph通過crush規則來控制資料的分布策略。

crush規則具體解決了什麼問題

控制把物件存入集群中,並隨機均勻的分布在所有儲存裝置中。

老裝置故障,新裝置加入時支援資料的自動均衡遷移,並盡可能最小化資料遷移。

如何合理分布多副本資料到不同的裝置,保證資料較高的可靠性。

兩次對映完成資料的分布

object -> pg -> osd。物件名hash -> pgid -> (osd1,osd2,osd3)。

互不相同的pg_id、互不相同的osd_id、osd的權重(根據osd對應的磁碟容量大小設定)。這裡我直接使用crush裡面採取的straw演算法,翻譯過來就是抽籤演算法,crush演算法的過程(有人將該過程形象的描述為把這些osd搓一搓,選擇乙個最長的籤):

crush_hash( pg_id, osd_id, r ) ===> draw (搓一搓,得到乙個隨機數,r可認為是常量)。

( draw &0xffff ) osd_weight ===> osd_straw (隨機數osd權重)。 

pick up high_osd_straw 。(挑選乘積最大的osd)

多次抽籤。( r+1 繼續下次抽籤,如果挑選的osd重複,則r繼續+1繼續抽籤,直到選夠副本個數個osd )

關鍵的隨機數, crush希望得到這樣乙個隨機數有什麼要求?該隨機數和pg_id 有關、與osd_id有關,當相同的輸入時,計算得出的輸出值一定是相同的,並且有一定隨機性。(輸出是定值,保證了在集群池中的pg不變,沒有擴縮容增減osd,沒有調整osd權重的時候,集群的資料分布永遠是不變的)

pg到osd的對映過程

給出乙個pg_id,作為crush_hash的輸入。

crush_hash(pg_id, osd_id, r) 得出乙個隨機數。

對於所有的osd用他們的權重乘以每個osd_id對應的隨機數,得到乘積。

選出乘積最大的osd,這個pg就會儲存到這個osd上。

我們把r+1,再求一遍隨機數,重複上述過程,選出乘積最大的osd,如果和之前的osd編號不一樣,那麼就選中它;如果和之前的osd編號一樣的話,那麼再把r+2,再選一次,直到選出我們需要的三個不一樣編號的osd為止。

pg到osd的對映過程如果就這樣完成了,怎麼解決故障閾的問題?怎麼人為定義我想把資料分布在哪個機櫃?定義乙個樹形結構,該樹形結構中osd之外的節點我們稱為bucket;每個osd有weight,每個主機也可以有乙個weight,這個weight由主機內的所有osd的weight累加而得;每個rack的weight由所有主機的weight累加而得;root的weight其實就是rack的權重之和;同樣bucket也有id;仿照crush選osd的方法來選擇bucket,並且還可以定義從樹形結構的根節點每次從下層節點擊擇多少個bucket。

集群維護

理解了crush演算法的原理,其實ceph的集群維護就是維護集群的crush規則。( 即pg_id/bucket_id/osd_id/權重控制pg的對映關係)

新增/刪除osd(擴縮容) 首先根據配置資訊與monitor通訊,monitor將其加入cluster map,並設定為up或out狀態,權重生效;刪除osd過程相反。

自動化的故障恢復(failure recovery) 收到monitor發過來的cluster map之後,這個新osd計算出自己所承載的pg以及和自己承載同乙個pg的其他osd。然後與這些osd取得聯絡。如果這個pg目前處於降級狀態(即承載該pg的osd個數少於正常值),則其他osd將把這個pg內的所有物件和元資料賦值給新osd。資料複製完成後,新osd被置為up且in狀態,cluster map更新。

360雲計算

Postgres儲存樹形資料

碰到乙個樹形資料需要儲存再資料控制,碰到以下兩個問題 為了更加簡單一些,我們將使用一下資料 section a section a.1 section b section b.1 section b.1 section b.1.1當設計自引用表 有時候自己join自己 最簡單明瞭的就是有乙個pare...

mysql發展歷史及基本架構

1996年,mysql 1.0發布 1996年10月,3.11.1發布 2000年isam公升級為myisam儲存引擎,mysql開源 2003年,mysql4.0發布,整合了innodb儲存引擎 2005年,mysql5.0發布,提供了檢視 儲存過程等功能 2008年,mysqk ab公司被sun...

Hive簡介 基本架構與儲存結構

2.hive的基本架構 3.hive的儲存模型 reference 1.1 什麼是hive?hive是facebook實現的乙個開源的資料倉儲工具 這裡還需要理解一下資料倉儲,資料倉儲可以簡單理解為存放不同資料來源 比如公司支撐不同業務的資料庫 的倉庫,主要用於查詢和分析,也就是基於這些資料去做報表...