對consistencygroup的一些研究和實踐

2021-09-07 04:38:12 字數 3999 閱讀 3250

宣告: !

團隊:華為杭州

openstack

團隊consistency group,直譯是一致性組,是juno版本號cinder新引進的乙個概念。顧名思義,裡面包括了兩個意思。consistency(一致性)和group(組),怎樣體現的呢?處於資料保護或者是容災的考慮,把一批存在公共操作的卷,在邏輯上劃成乙個組。使用者能夠很方便的通過操作該組,不須要乙個乙個得去操作卷。所以針對的操作應該是做快照和做備份。

當前僅僅有e公司的後端支援該特性,該blueprint預計也是e公司提出的。但個人覺得在實際應用中還是十分實用的。屬於通用的、公共的介面,能提公升儲存資源使用的效率

依據當前j版本號**的實現。改動點有:

作者尚未實現對組備份的功能。在該blueprint的討論中。作者也提到了興許要做的工作:

在heat層面上也應該理解卷的一致性組概念,應實現對應的介面;

在對一致性組做快照前,利用qemu guest agent暫停guestos對檔案系統的訪問。等結束後再恢復。

支援一致性組的備份,包含在後端儲存driver執行下實現對已經掛載卷的備份;

備份功能能夠結合當前快照的實現來做,而heat上的尚處於八字沒一撇的情況,而暫停guestos檔案系統。則在進行中,見bp:

個人在j版本號環境下對這個特性做了些嘗試。想法是在allinone節點中建立乙個組,增加兩個卷。然後做統一快照,最後刪除組快照。

依照一致性預期結果看到有兩個卷快照被建立最後被刪除。可是環境沒有對接e公司的後端。僅僅有lvm,那就對lvm的**做簡單改動,使之支援主要的組操作。

首先得建立乙個一致性組。在lvm的驅動**中,須要在data['pool']字典中增加乙個屬性,否則過濾器這關(主要是capibility)是過不去的。 在上報能力的介面中,實現「consistencygroup_support='true'」,能夠簡單返回空處理:

def create_consistencygroup(self, context, group):

"""creates a consistencygroup."""

#raise notimplementederror()

return none

def delete_consistencygroup(self, context, group):

"""deletes a consistency group."""

#raise notimplementederror()

return none,

這樣,乙個組就建成了。show的結果(cinder的client尚未實現,僅僅能用curl測試):

有了組後,開始建立卷,指定consistencygroup_id建立同組的兩個卷。

然後準備對組做快照。再次改動lvm的**。加入create_cgsnapshot方法。功能是在建立組快照時,對組內全部卷做快照(**實驗用,僅做參考):

def create_cgsnapshot(self, context, cgsnapshot_ref):

snapshots = self.db.snapshot_get_all_for_cgsnapshot(context,

cgsnapshot_ref['id'])

model_update =

for sn in snapshots:

try:

self.create_snapshot(sn)

except exception as e:

log.error("create snapshot %s fail."%sn)

sn['status'] = 'error'

model_update["status"] = "error"

return model_update, snapshots

執行快照後,能夠看到,生成了屬於這個組的兩個快照。並生成了乙個consistencygroup_snapshot資料。show的結果:

兩個快照:

這時假設再建立乙個該組的卷,會報400的錯,由於當前組已經有快照無法再改動該組。

「consistency group b37f1d21-390e-4128-8fd6-2ca4789d9fc2 still has dependent cgsnapshots.」

然後再對lvm**加入個刪除介面(**實驗用,僅做參考):

def delete_cgsnapshot(self, context, cgsnapshot_ref):

snapshots = self.db.snapshot_get_all_for_cgsnapshot(context,

cgsnapshot_ref['id'])

model_update =

for sn in snapshots:

try:

self.delete_snapshot(sn)

except exception as e:

log.error("delete snapshot %s fail"%sn)

model_update['status'] = 'error'

sn['status'] = 'error'

return model_update, snapshots

執行後。consistencygroup_snapshot物件消失。伴隨著兩個快照也被成功刪除。

快照自己主動消失:

至此。實現預期結果。

當然這是最簡單的場景,且lvm僅僅能實現單節點儲存池的場景。多節點根本搞不定。並且非常多場景沒有考慮,比方反覆建立快照,乙個組相應多個volume_type等。待興許再關注。

整個實驗過程不算複雜,但第一次比預期要困難多了,還是有些細節須要去摸索的:

建立組的介面必須傳入至少乙個volume_type,也就以為著一致性組和卷型別的強相關;(這裡在ethpad上的討論有些出入,從介面看能夠支援多個volume_type和組的相應關係)

後端儲存在上報自己的硬體能力時,假設要支援建立一致性組,必須指定乙個引數,「consistencygroup_support='true'」。且true必須為字串;

後端儲存的驅動**必須實現相應的方法,建立相關也就是「create_consistencygroup」和"delete_consistencygroup"。快照相關就是「create_cgsnapshot」和「delete_cgsnapshot」;

所以,假設興許有儲存廠商想實現自己的一致性組。在開發過程中注意上述問題。

參考:最後, 一些過程中使用的api列舉例如以下。供參考:

typeurlbodyrsp

add consistencygroup

v2/$tenant_id/consistencygroups

}n/a

get consistencygroups

v2/$tenant_id/consistencygroups/detail?all_tenants=1

n/a]}

del consistencygroup

v2/$tenant_id/consistencygroups/$cg_id}

n/aadd cg_snapshot

v2/$tenant_id/cgsnapshots

}n/a

get cg_snapshot

v1/$tenant_id/cgsnapshots/detail?all_tenants=1

n/a]}

del cg_snapshot

v2/$tenant_id/cgsnapshots/$cgsnapshot_id

n/an/a

對建立游標對理解

步驟 1 首先經過底層的 編寫已經建立起了了python和資料庫之間的溝通橋梁並封裝成了模組,通過pymysql下的conntent 方法與之建立起了連線,例項物件。pymysql.connect 方法返回的是connections模組下的connection 例項,connect 方法傳參就是在給...

對勾函式 對勾函式

對勾函式是一種類似於反比例函式的一般函式。所謂的對勾函式,是形如 f x ax b x 的函式,是 一種教材上沒有但考試老喜歡考的函式,所以更加要注意和學習。一般的函式影象形似兩個中心對稱的 對勾,故名。當x 0 時,f x ax b x 有最小值 這裡為了研究方便,規定a 0 b 0 也就是當 x...

一對多 多對一

pip install djangorestframework 3.9.2 pip install markdown 3.0.1 markdown support for the browsable api.pip install django filter 2.1.0 filtering supp...