cinder-backup導(dǎo)入導(dǎo)出功能

backup-export

cinder backup支持將元數(shù)據(jù)序列化導(dǎo)出(export record)柠横,這樣即使數(shù)據(jù)庫中的數(shù)據(jù)丟失了悼潭,也能從導(dǎo)出的元數(shù)據(jù)中快速恢復(fù)腐螟。

usage: cinder backup-export <backup>

范例:

[root@node1 ~]# cinder backup-export 51e2c303-6490-433c-a097-cf3742a7e991 
+----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Property       | Value                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
+----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| backup_service | cinder.backup.drivers.nfs                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| backup_url     | eyJzdGF0dXMiOiAiYXZhaWxhYmxlIiwgInRlbXBfc25hcHNob3RfaWQiOiBudWxsLCAiZGlzcGxheV9uYW1lIjogbnVsbCwgImF2YWlsYWJpbGl0eV96b25lIjogIm5vdmEiLCAiZGVsZXRlZCI6IGZhbHNlLCAidm9sdW1lX2lkIjogIjA0ODAyZDQ4LWJmYTktNDY2Yy1iM2E4LTQyNGIwMTRkNzVkNSIsICJyZXN0b3JlX3ZvbHVtZV9pZCI6IG51bGwsICJ1cGRhdGVkX2F0IjogIjIwMTctMDctMTdUMDQ6NTM6MTZaIiwgImhvc3QiOiAibm9kZTEiLCAic25hcHNob3RfaWQiOiBudWxsLCAidXNlcl9pZCI6ICIzZjU2ZDI5NzZlYWM0NjhkYmU4MzZlYmNjNDQwMDg1OCIsICJzZXJ2aWNlX21ldGFkYXRhIjogImJhY2t1cCIsICJpZCI6ICI1MWUyYzMwMy02NDkwLTQzM2MtYTA5Ny1jZjM3NDJhN2U5OTEiLCAic2l6ZSI6IDEsICJvYmplY3RfY291bnQiOiA1LCAiZGVsZXRlZF9hdCI6IG51bGwsICJjb250YWluZXIiOiAiNTEvZTIvNTFlMmMzMDMtNjQ5MC00MzNjLWEwOTctY2YzNzQyYTdlOTkxIiwgInNlcnZpY2UiOiAiY2luZGVyLmJhY2t1cC5kcml2ZXJzLm5mcyIsICJkcml2ZXJfaW5mbyI6IHt9LCAiY3JlYXRlZF9hdCI6ICIyMDE3LTA3LTE3VDA0OjUyOjM4WiIsICJkaXNwbGF5X2Rlc2NyaXB0aW9uIjogbnVsbCwgImRhdGFfdGltZXN0YW1wIjogIjIwMTctMDctMTdUMDQ6NTI6MzhaIiwgInBhcmVudF9pZCI6IG51bGwsICJudW1fZGVwZW5kZW50X2JhY2t1cHMiOiAwLCAiZmFpbF9yZWFzb24iOiBudWxsLCAicHJvamVjdF9pZCI6ICI3YjdkNjYyN2NmMDQ0ZDgwYWE2ZWMzZjJmNGFkZTJhYiIsICJ0ZW1wX3ZvbHVtZV9pZCI6IG51bGx9 |
+----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

cinder.backup.manager.BackupManager#export_record:

<!--忽略部分代碼-->
    backup_service = self.service.get_backup_driver(context)  
    # 得到 cinder.backup.drivers.nfs.NFSBackupDriver 服務(wù)
    
    driver_info = backup_service.export_record(backup)
    # 如果特殊的后端驅(qū)動(dòng)需要補(bǔ)充其他必要信息坷襟,需要通過這個(gè)方法導(dǎo)出裁眯。默認(rèn)驅(qū)動(dòng)沒有額外信息。cinder.backup.driver.BackupDriver#export_record 返回一個(gè){}
    
    backup_url = backup.encode_record(driver_info=driver_info)
    # 把backup對(duì)象信息和driver_info 做Base64序列號(hào)成字符串蠢终,實(shí)例如下
    
    backup_record['backup_url'] = backup_url

cinder.objects.backup.Backup#encode_record:

def encode_record(self, **kwargs):
    """Serialize backup object, with optional extra info, into a string."""
    # We don't want to export extra fields and we want to force lazy
    # loading, so we can't use dict(self) or self.obj_to_primitive
    record = {name: field.to_primitive(self, name, getattr(self, name))
              for name, field in self.fields.items()}
    # We must update kwargs instead of record to ensure we don't overwrite
    # "real" data from the backup
    kwargs.update(record)
    retval = jsonutils.dump_as_bytes(kwargs)
    return base64.encode_as_text(retval)


record:        
{
    'availability_zone': u'nova',
    'updated_at': '2017-07-17T04: 53: 16Z',
    'container': u'51/e2/51e2c303-6490-433c-a097-cf3742a7e991',
    'snapshot_id': None,
    'service_metadata': u'backup',
    'id': '51e2c303-6490-433c-a097-cf3742a7e991',
    'size': 1,
    'object_count': 5,
    'deleted_at': None,
    'user_id': u'3f56d2976eac468dbe836ebcc4400858',
    'service': u'cinder.backup.drivers.nfs',
    'display_description': None,
    'data_timestamp': '2017-07-17T04: 52: 38Z',
    'parent_id': None,
    'project_id': u'7b7d6627cf044d80aa6ec3f2f4ade2ab',
    'temp_volume_id': None,
    'status': u'available',
    'deleted': False,
    'restore_volume_id': None,
    'host': u'node1',
    'volume_id': '04802d48-bfa9-466c-b3a8-424b014d75d5',
    'display_name': None,
    'temp_snapshot_id': None,
    'fail_reason': None,
    'created_at': '2017-07-17T04: 52: 38Z',
    'num_dependent_backups': 0
}

序列化后:
u'eyJzdGF0dXMiOiAiYXZhaWxhYmxlIiwgInRlbXBfc25hcHNob3RfaWQiOiBudWxsLCAiZGlzcGxheV9uYW1lIjogbnVsbCwgImF2YWlsYWJpbGl0eV96b25lIjogIm5vdmEiLCAiZGVsZXRlZCI6IGZhbHNlLCAidm9sdW1lX2lkIjogIjA0ODAyZDQ4LWJmYTktNDY2Yy1iM2E4LTQyNGIwMTRkNzVkNSIsICJyZXN0b3JlX3ZvbHVtZV9pZCI6IG51bGwsICJ1cGRhdGVkX2F0IjogIjIwMTctMDctMTdUMDQ6NTM6MTZaIiwgImhvc3QiOiAibm9kZTEiLCAic25hcHNob3RfaWQiOiBudWxsLCAidXNlcl9pZCI6ICIzZjU2ZDI5NzZlYWM0NjhkYmU4MzZlYmNjNDQwMDg1OCIsICJzZXJ2aWNlX21ldGFkYXRhIjogImJhY2t1cCIsICJpZCI6ICI1MWUyYzMwMy02NDkwLTQzM2MtYTA5Ny1jZjM3NDJhN2U5OTEiLCAic2l6ZSI6IDEsICJvYmplY3RfY291bnQiOiA1LCAiZGVsZXRlZF9hdCI6IG51bGwsICJjb250YWluZXIiOiAiNTEvZTIvNTFlMmMzMDMtNjQ5MC00MzNjLWEwOTctY2YzNzQyYTdlOTkxIiwgInNlcnZpY2UiOiAiY2luZGVyLmJhY2t1cC5kcml2ZXJzLm5mcyIsICJkcml2ZXJfaW5mbyI6IHt9LCAiY3JlYXRlZF9hdCI6ICIyMDE3LTA3LTE3VDA0OjUyOjM4WiIsICJkaXNwbGF5X2Rlc2NyaXB0aW9uIjogbnVsbCwgImRhdGFfdGltZXN0YW1wIjogIjIwMTctMDctMTdUMDQ6NTI6MzhaIiwgInBhcmVudF9pZCI6IG51bGwsICJudW1fZGVwZW5kZW50X2JhY2t1cHMiOiAwLCAiZmFpbF9yZWFzb24iOiBudWxsLCAicHJvamVjdF9pZCI6ICI3YjdkNjYyN2NmMDQ0ZDgwYWE2ZWMzZjJmNGFkZTJhYiIsICJ0ZW1wX3ZvbHVtZV9pZCI6IG51bGx9'

cinder.objects.backup.Backup#encode_record 這個(gè)方法注意下序攘,以后可以用于對(duì)象序列化!寻拂!

backup-import

如果backup記錄信息被從數(shù)據(jù)庫里刪除了程奠,可以通過之前export出的backup_url做恢復(fù),恢復(fù)出的數(shù)據(jù)連backup_id都跟之前一樣祭钉。

usage: cinder backup-import <backup_service> <backup_url>
backup_service : 驅(qū)動(dòng)的名字
backup_url : export出的序列化元數(shù)據(jù)

范例:

[root@node1 ~]# cinder backup-import cinder.backup.drivers.nfs eyJzdGF0dXMiOiAiYXZhaWxhYmxlIiwgInRlbXBfc25hcHNob3RfaWQiOiBudWxsLCAiZGlzcGxheV9uYW1lIjogbnVsbCwgImF2YWlsYWJpbGl0eV96b25lIjogIm5vdmEiLCAiZGVsZXRlZCI6IGZhbHNlLCAidm9sdW1lX2lkIjogIjA0ODAyZDQ4LWJmYTktNDY2Yy1iM2E4LTQyNGIwMTRkNzVkNSIsICJyZXN0b3JlX3ZvbHVtZV9pZCI6IG51bGwsICJ1cGRhdGVkX2F0IjogIjIwMTctMDctMTdUMDQ6NTM6MTZaIiwgImhvc3QiOiAibm9kZTEiLCAic25hcHNob3RfaWQiOiBudWxsLCAidXNlcl9pZCI6ICIzZjU2ZDI5NzZlYWM0NjhkYmU4MzZlYmNjNDQwMDg1OCIsICJzZXJ2aWNlX21ldGFkYXRhIjogImJhY2t1cCIsICJpZCI6ICI1MWUyYzMwMy02NDkwLTQzM2MtYTA5Ny1jZjM3NDJhN2U5OTEiLCAic2l6ZSI6IDEsICJvYmplY3RfY291bnQiOiA1LCAiZGVsZXRlZF9hdCI6IG51bGwsICJjb250YWluZXIiOiAiNTEvZTIvNTFlMmMzMDMtNjQ5MC00MzNjLWEwOTctY2YzNzQyYTdlOTkxIiwgInNlcnZpY2UiOiAiY2luZGVyLmJhY2t1cC5kcml2ZXJzLm5mcyIsICJkcml2ZXJfaW5mbyI6IHt9LCAiY3JlYXRlZF9hdCI6ICIyMDE3LTA3LTE3VDA0OjUyOjM4WiIsICJkaXNwbGF5X2Rlc2NyaXB0aW9uIjogbnVsbCwgImRhdGFfdGltZXN0YW1wIjogIjIwMTctMDctMTdUMDQ6NTI6MzhaIiwgInBhcmVudF9pZCI6IG51bGwsICJudW1fZGVwZW5kZW50X2JhY2t1cHMiOiAwLCAiZmFpbF9yZWFzb24iOiBudWxsLCAicHJvamVjdF9pZCI6ICI3YjdkNjYyN2NmMDQ0ZDgwYWE2ZWMzZjJmNGFkZTJhYiIsICJ0ZW1wX3ZvbHVtZV9pZCI6IG51bGx9
+----------+--------------------------------------+
| Property | Value                                |
+----------+--------------------------------------+
| id       | 51e2c303-6490-433c-a097-cf3742a7e991 |
| name     | None                                 |
+----------+--------------------------------------+

邏輯:

  1. backup_url 反序列化 backup_option瞄沙,檢查數(shù)據(jù)庫里是否存在有效的backup_option['id']記錄,如果不存在則創(chuàng)建一個(gè)id = backup_option['id']的back記錄。并且'user_id'= context.user_id,'project_id'= context.project_id,'volume_id'= IMPORT_VOLUME_ID,'status'= fields.BackupStatus.CREATING,
  2. 把backup_url的其它元數(shù)據(jù)保存至步驟1創(chuàng)建的back記錄中距境。

代碼分析:

cinder.backup.manager.BackupManager#import_record


def import_record(self,
                  context,
                  backup,
                  backup_service,
                  backup_url,
                  backup_hosts):
                  
    backup_options = backup.decode_record(backup_url) # backup_url反序列化

    # Extract driver specific info and pass it to the driver
    driver_options = backup_options.pop('driver_info', {}) # 拿到驅(qū)動(dòng)的額外信息
    backup_service = self.service.get_backup_driver(context) 
    backup_service.import_record(backup, driver_options) # 把驅(qū)動(dòng)的額外信息導(dǎo)入
    
    # 檢查 backup_options 里包含必須元素
    required_import_options = {
        'display_name',
        'display_description',
        'container',
        'size',
        'service_metadata',
        'object_count',
        'id'
    }

    # Check for missing fields in imported data
    missing_opts = required_import_options - set(backup_options)
    if missing_opts:
        raise exception.InvalidBackup(reason=msg)
        
    # 檢查backup_options['id'] 和 數(shù)據(jù)庫的一致
    backup_id = backup_options['id']
    if backup_id != backup.id:
        raise exception.InvalidBackup(reason=msg)        
        
    # 復(fù)寫一些元素值
    backup_options['status'] = fields.BackupStatus.AVAILABLE
    backup_options['service'] = self.driver_name
    backup_options['availability_zone'] = self.az
    backup_options['host'] = self.host

    # 移除一些元素值
    for key in ('name', 'user_id', 'project_id', 'deleted_at',
                'deleted', 'fail_reason'):
        backup_options.pop(key, None)

    # 更新進(jìn)數(shù)據(jù)庫
    backup.update(backup_options)
    backup.save()
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末申尼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子垫桂,更是在濱河造成了極大的恐慌师幕,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诬滩,死亡現(xiàn)場離奇詭異霹粥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疼鸟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門后控,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人愚臀,你說我怎么就攤上這事忆蚀。” “怎么了姑裂?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵馋袜,是天一觀的道長。 經(jīng)常有香客問我舶斧,道長欣鳖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任茴厉,我火速辦了婚禮泽台,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矾缓。我一直安慰自己怀酷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布嗜闻。 她就那樣靜靜地躺著蜕依,像睡著了一般。 火紅的嫁衣襯著肌膚如雪琉雳。 梳的紋絲不亂的頭發(fā)上样眠,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音翠肘,去河邊找鬼檐束。 笑死,一個(gè)胖子當(dāng)著我的面吹牛束倍,可吹牛的內(nèi)容都是我干的被丧。 我是一名探鬼主播盟戏,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晚碾!你這毒婦竟也來了抓半?” 一聲冷哼從身側(cè)響起喂急,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤格嘁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后廊移,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糕簿,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年狡孔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懂诗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苗膝,死狀恐怖殃恒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辱揭,我是刑警寧澤离唐,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站问窃,受9級(jí)特大地震影響亥鬓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜域庇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一嵌戈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧听皿,春花似錦熟呛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啊送,卻和暖如春偿短,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馋没。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工昔逗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人篷朵。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓勾怒,卻偏偏與公主長得像婆排,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子笔链,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容