cinder-backup的源码解析
程序员文章站
2022-05-11 16:12:40
...
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, {'host': self.host,
'service':
self.driver_name})
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中。
上一篇: Html5播放视频
下一篇: openstack排错之cinder排错