blob.png blob.png

 上面左边是我的个人微信,如需进一步沟通,请加微信。  右边是我的公众号“Openstack私有云”,如有兴趣,请关注。

    Openstack有一个组件Freezer专门负责备份,据说这个组件的核心开发是国内的九州云的开发人员。下面是2016年九州云对这个组件的介绍链接:

    http://www.99cloud.net/html/2016/jiuzhouyuanchuang_0818/213.html

    可以看到,这个组件覆盖了openstack相当部分的备份需求,包括虚拟机、卷、数据库等。上面的介绍是2016年的,不知道现在是否能支持ceph,下面通过动手实验来验证。首先找到官网对应freezer组件这一块的user guide :

    https://docs.openstack.org/freezer/queens/user/index.html 


    总结及建议:

    经过实验,freezer组件可以进行nova虚拟机的备份和恢复,cinder卷的备份恢复以及文件系统、LVM、mariadb数据库等尚未测试,据说是可以使用的,如果生产系统需要使用的话,建议一一提前亲手实验验证。

    web管理界面只建议使用备份功能,还原功能建议直接使用命令freezer-agent完成。另外web界面感觉使用起来不是很顺畅,比如备份开始结束时间没有起作用,备份完成后的web显示列表没有显示等等。如果有开发力量,建议研究源代码进行完善。

    Ocata版本通过kolla可以非常轻松的部署freezer,只需要在globals.yml全局配置文件中打开相应的开关参数重新部署即可。

    Ocata版本的freezer可以对ceph存储进行支持,备份中的swift是对应的ceph中的ceph radosgw ,即ceph的对象存储。

    freezer如果装在Openstack生产环境自身,感觉意义不是很大,因为虚拟机和卷本身的备份可以通过openstack自身的备份机制实现,比如做快照,cinder直接可以做备份,建议freezer独立与生产环境,这样才能真正起到Disaster Recover 容灾的目的,可以只对关键的一些虚拟机和卷做这些容灾备份。

    

   下面是详细验证过程记录:

    我通过kolla进行部署,直接在全局变量配置文件 /etc/kolla/globals.yml中将下面2个参数打开然后进行重新部署:

    enable_freezer: "yes"    
    enable_horizon_freezer: "{{ enable_freezer | bool }}"

    接下来继续看官网的文档,发现根据官网的操作根本行不通。后面发现这个网址:

    https://zhuanlan.zhihu.com/p/31597476

    根据这个文档完成了后面的操作。首先需要进行client的注册:

    进入 freezer api容器

    docker exec -it  freezer_api bash

    执行

    freezer-scheduler start

 报错,提示需要设置OS_AUTH_URL,编辑变量文件 :

    vi /etc/freezer-openrc.sh
    export OS_PROJECT_DOMAIN_NAME=default
    export OS_USER_DOMAIN_NAME=default
    export OS_PROJECT_NAME=admin
    export OS_TENANT_NAME=admin
    export OS_USERNAME=admin
    export OS_PASSWORD=admin
    export OS_AUTH_URL=http://192.168.1.120:5000/v3      //注,容器外部环境的端口值是35357
    export OS_INTERFACE=internal
    export OS_IDENTITY_API_VERSION=3

   以上内容保存退出,并生效这个环境变量文件:

    source /etc/freezer-openrc.sh

    再次执行

    freezer-scheduler start

    这个命令完成client的注册,如果需要多个节点都有freezer_api容器,相应节点都需要执行。

    这个时候再登录web管理界面,Disaster Restore ->Backup and Restore->Clients 里面就有相应的client记录了。


    接下来是对Nova进行备份,可以通过web界面进行备份,备份步骤如下:

    1、创建Action。登录web管理界面,Disaster Restore ->Backup and Restore->动作->Create Action ,填写相关的参数,其中,action选择backup,mode选择nova,storage选择swift(在我的环境中部署的是ceph rgw组件,具有对象存储功能),Container Name or Path 填写对象存储的Container名称比如Novabackup,填写Nova Instance ID ,Network ID可以不填,其中日志可以指定,如果不指定,日志默认在容器freezer_api中/root/.freezer/freezer.log 文件中,也可以在Advance中指定;

    2、创建Job。登录web管理界面,Disaster Restore ->Backup and Restore->Job->Create Job ,填写开始时间、结束时间,注意Clients需要选择,动作需要选择上面创建的动作,其中动作需要拖动,刚开始总是点击没有反应,后面才发现需要拖动;而且开始时间、结束时间感觉没有用,我填写了一个下午2点多开始,第二天下午2点结束的的时间,后面查看日志,发现是晚上10点20开始执行,执行时间2分多钟,感觉很诡异。

    3、创建sessions。登录web管理界面,Disaster Restore ->Backup and Restore->Sessions->Create Session ,Session的概念是可以将多个job放在一起,但真不知道有什么作用。创建session的时候和创建Job的时候一样,也有开始时间、间隔、结束时间,这里我没有填写。

    4、在Job中启动。web管理界面,Disaster Restore ->Backup and Restore->Job->选中job“动作”的下拉框,attach to session ,然后点start。

        

    在我的理解,启动job应该如果没有填写开始和结束时间,应该直接点击job start 就应该立刻开始进行action,但是实际上没有,感觉有些困惑。总之,通过web界面磕磕碰碰能够完成nova的backup操作,后面我通过web界面又建了restore的job,没有立即生效,所以决定restore还是通过命令freezer-agent完成。

    

    上面是通过web界面对nova的一个虚拟机进行备份,下面介绍通过命令freezer-agent完成nova虚拟机的备份和恢复:

    1、备份命令:

    freezer-agent --mode nova --nova-inst-id 4ad2e0fd-02ba-414e-acae-5f79e267ea96 --container Novabackup --backup-name bk_nova_1

    备份完成之后可以登录web界面查看对象存储,项目->对象存储->容器->选择上面备份的Novabackup,可以看到对象存储中备份的cirros虚拟机占用空间是1G,这个有点奇怪,原始虚拟机镜像大小是30多M,具体原因尚不知道。

    2、还原命令:

    freezer-agent --action restore --mode nova --nova-inst-id 4ad2e0fd-02ba-414e-acae-5f79e267ea96 --nova-restore-network b7e25abb-fac4-4658-be0e-f7751cfb9a88 --container Novabackup
    注意上面的命令网络参数--nova-restore-network 是必填项。

    通过同步查看日志,恢复的过程是先从对象存储中下载文件上传镜像,然后根据这个镜像创建虚拟机,创建完成后删除镜像。但是在我这个案例中,由于使用的是ceph存储,由于虚拟机创建是直接使用镜像作为父镜像,不能删除,可以找到相应的卷或者instance的卷对应的rbd,然后执行flatten操作,完成之后再将临时创建的镜像删除,具体操作记录如下:

    a、进入ceph_mon容器:

     docker exec -it ceph_mon bash

    b、找到ceph中虚拟机ID,可以通过web界面查看:

    rbd -p vms ls
    rbd -p vms info 5e60590e-f061-4f1c-9ea3-947232855328_disk

    c、对虚拟机的rbd镜像镜像flatten操作:

    rbd -p vms flatten 5e60590e-f061-4f1c-9ea3-947232855328_disk
(ceph-mon)[root@control02 /]# ceph osd pool ls
rbd
.rgw.root
default.rgw.control
default.rgw.data.root
default.rgw.gc
default.rgw.log
images
volumes
backups
vms
default.rgw.users.uid
default.rgw.buckets.index
default.rgw.buckets.data
(ceph-mon)[root@control02 /]# rbd -p vms ls
5e60590e-f061-4f1c-9ea3-947232855328_disk
ff6359fc-948d-4758-8b1b-d10f317e8b41_disk
(ceph-mon)[root@control02 /]# rbd -p vms info 5e60590e-f061-4f1c-9ea3-947232855328_disk
rbd image '5e60590e-f061-4f1c-9ea3-947232855328_disk':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.9d8324122da3
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags: 
parent: images/195b9889-a51d-4b5e-841f-8deda3f4eeab@snap
overlap: 1024 MB
(ceph-mon)[root@control02 /]# 
(ceph-mon)[root@control02 /]# 
(ceph-mon)[root@control02 /]# rbd -p vms flatten 5e60590e-f061-4f1c-9ea3-947232855328_disk
Image flatten: 100% complete...done.
(ceph-mon)[root@control02 /]#

    

    3、查看和管理备份

    

    freezer-agent --action info  可以查看已完成的备份


(freezer-api)[root@control01 ~]# freezer-agent --action info
{u'count': 33, u'bytes': 1073741824, u'name': u'Novabackup'}
{
    "container_name": "Novabackup",
    "objects_count": 33,
    "size": "1024MB"
}
{u'count': 33, u'bytes': 1073741824, u'name': u'freezer-nova'}
{
    "container_name": "freezer-nova",
    "objects_count": 33,
    "size": "1024MB"
}
{u'count': 0, u'bytes': 0, u'name': u'freezer_backups'}
{
    "container_name": "freezer_backups",
    "objects_count": 0,
    "size": "1MB"
}
(freezer-api)[root@control01 ~]#

        

2018年5月31日补充:

    1、使用freezer-agent备份命令,可以通过ssh备份到远端的服务器,具体命令如下:

    ssh-keygen     //生成秘钥
    ssh-copy-id 192.168.1.130  //将秘钥拷贝到远端服务器
    freezer-agent --mode nova --nova-inst-id 5e60590e-f061-4f1c-9ea3-947232855328 --storage ssh --ssh-username root --ssh-key ~/.ssh/id_rsa --ssh-host 192.168.1.130  --container /backup  --backup-name nova-0531-ssh-backup

    查看日志,备份花了7分多钟1G,相对于本地对象存储备份时间要长很多,本地对象存储备份是2分42秒1G。备份的时候还是需要充分考虑对带宽的影响。

    2、使用freezer-agent还原命令,通过远端ssh备份文件进行恢复,具体命令如下:

     freezer-agent --action restore --mode nova --nova-inst-id 5e60590e-f061-4f1c-9ea3-947232855328 --storage ssh --ssh-username root --ssh-key ~/.ssh/id_rsa --ssh-host 192.168.1.130  --container /backup    --nova-restore-network b7e25abb-fac4-4658-be0e-f7751cfb9a88 

    恢复成功,查看日志,恢复的时间也是7分多钟1G ,主要时间也是花在了ssh传输镜像文件上面。

    3、通过以上的操作,有实际的价值,将关键虚拟机通过ssh备份到远端的一台服务器上,即使整个openstack集群或者存储出现故障,有一个最后的数据保障手段。当然,其实还有其他备份手段,比如逻辑备份,不是非要备份整个虚拟机,我个人一直都是偏向于从逻辑上面进行备份,比如备份虚拟机上的业务数据或者数据库逻辑备份,这样可以脱离平台依赖。