cinder backup的原始碼解析

2021-08-18 06:50:06 字數 1887 閱讀 3296

cinder-backup用於將volume備份到其他儲存系統上,目前支援的備份儲存系統有swift、ceph以及ibm tivoli storage manager(tsm),預設為swift。

cinder-backup服務**位於cinder/backup

--api.py

--drive.py

--drivers

--ceph.py

--swift.py

--tsm.py

--manager.py

--rpccap.py

rpcapi.py檔案定義了提供給rpc呼叫的介面backupapi,api.py檔案又對rpc的呼叫做了一層封裝,其他模組需要匯入的是api模組。manager.py是cinder-backup最為核心的**,其中的backupmanager類用於執行接收到rpc請求。

不同的備份儲存系統以driver的形式得以支援,driver.py檔案中定義了各種driver的基類backupdriver,所有具體driver的實現都位於drivers子目錄,通過配置檔案的backup_driver選項指定使用的driver。

backup_drive=cinder.backup.drivers.swift
cinder-backup服務在接到rpc請求後會找到該操作對應的host以及相應的儲存後端driver,然後呼叫該driver中與backup相關的介面,比如backup_volume()和restore_backup(),這些介面最終會呼叫cinder-backup服務中driver來對該volume進行備份或者恢復操作。

下面**是備份乙個卷的入口

#cinder/backup/manager.py

class backupmanager(manager.schedulerdependentmanager):

def create_backup(self, context, backup_id):

"""create volume backups using configured backup service."""

backup = self.db.backup_get(context, backup_id)

#建立乙個捲先找到對應的主機

volume_host = volume_utils.extract_host(volume['host'], 'backend')

backend = self._get_volume_backend(host=volume_host)

self.db.backup_update(context, backup_id, )

backup_service = self.service.get_backup_driver(context)

#呼叫driver中與backup相關的介面

self._get_driver(backend).backup_volume(context, backup,

backup_service)

下圖展示了cinder-backup工作流程

對於備份刪除操作,則不需要經過cinder-volume的儲存後端driver,由cinder-backup直接呼叫backup driver中的介面即可。

總的來說,由於建立或者恢復備份操作需要知道操作所對應的volume的資料資訊,所以處理流程需要先轉換到cinder-volume中,然後轉回到cinder-backup中的backup-driver.然而對應刪除操作來說,因為不需要從cinder-volume中獲取任何資訊,所以控制流程不需要轉移到cinder-volume中。

ConcurrentHashMap的原始碼分析

put final v putval k key,v value,boolean onlyifabsent 在上一步的else if中 f 不為null時,則判斷f的hash值是否為moved,即 1,如果為 1,表示正在擴容 else if fh f.hash moved 協助資料遷移 tab h...

DispatcherServlet的原始碼和流程分析

1 自動配置dispatcherservlet和dispatcherservletregistry 2 註冊dispatcherservlet到servletcontext 3 初始化mvc的元件 handler執行完成後,向dispatcherservlet 返回乙個modelandview物件 ...

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...