宣告: !
團隊:華為杭州
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...