zoukankan      html  css  js  c++  java
  • openstack将本地实例迁移至ceph存储中

    需求:

    最近在openstack上线了ceph存储,创建虚拟机和云硬盘都基于ceph卷进行存储和创建,但是之前openstack用的是本地存储,创建的所有实例都在本地文件中,当实例重启之后,openstack nova 自动会将libvirt.xml(实例的配置文件)渲染为使用ceph 卷磁盘.所以,就无法启动实例,因为此时实例中是没有disk的

    • 基于本地存储的实例
    
    disk type="file" device="disk">
    
          <driver name="qemu" type="qcow2" cache="none"/>
    
          <source file="/var/lib/nova/instances/dc2b76cc-9c9e-4ed0-925e-4a1d7306d183/disk"/>
    
          <target bus="virtio" dev="vda"/>
    
        </disk>
    
    
    • 基于ceph存储的实例
    
     <disk type="network" device="disk">
    
          <driver type="raw" cache="writeback"/>
    
          <source protocol="rbd" name="vms/49704562-e043-47fa-affb-b4e9f1ff1359_disk">
    
            <host name="172.16.206.16" port="6789"/>
    
            <host name="172.16.206.19" port="6789"/>
    
            <host name="172.16.206.20" port="6789"/>
    
          </source>
    
          <auth username="cinder">
    
            <secret type="ceph" uuid="3ca66ec4-dd87-4a3d-b7f9-f62a6662489f"/>
    
          </auth>
    
          <target bus="virtio" dev="vda"/>
    
        </disk>
    
    

    前期准备:

    了解ceph中存储的实例disk里面究竟是什么?

    • 导出ceph中的disk
    
    # 查看目前ceph中的disk
    
    [root@ceph-node02 ~]# rbd -p vms ls
    
    35ae9849-093d-4ffc-8453-3de46ecdef86_disk
    
    #导出disk
    
    
    [root@ceph-node02 ~]# rbd -p vms export 35ae9849-093d-4ffc-8453-3de46ecdef86_disk vm.raw
    
    Exporting image: 100% complete...done.
    
    [root@ceph-node02 ~]# mkdir vms
    
    # 查看导出的disk的分区信息
    
    [root@ceph-node02 ~]# fdisk -lu vm.raw
    
    
    
    磁盘 vm.raw:21.5 GB, 21474836480 字节,41943040 个扇区
    
    Units = 扇区 of 1 * 512 = 512 bytes
    
    扇区大小(逻辑/物理):512 字节 / 512 字节
    
    I/O 大小(最小/最佳):512 字节 / 512 字节
    
    磁盘标签类型:dos
    
    磁盘标识符:0x000e6c16
    
    
    
     设备 Boot      Start         End      Blocks   Id  System
    
    vm.raw1   *        2048      411647      204800   83  Linux
    
    vm.raw2          411648     8800255     4194304   82  Linux swap / Solaris
    
    vm.raw3         8800256    41943039    16571392   83  Linux
    
    
    
    #计算偏移量,只挂载指定的分区,由于这个磁盘有多个分区,所以,如果挂载指定的分区,需计算挂载的偏移量
    
    [root@ceph-node02 ~]# echo "8800256*512" | bc
    
    4505731072
    
    
    #挂载
    
    [root@ceph-node02 ~]# mount -o offset=4505731072 vm.raw vms
    
    [root@ceph-node02 ~]# ls vms
    
    bin   cgroup  dev  home  lib64       media  opt   root  sbin     srv  tmp  var
    
    boot  data    etc  lib   lost+found  mnt    proc  run   selinux  sys  usr
    
    

    发现,其实ceph中存储的disk里面就是linux系统的文件

    用同样的方法,查看本地实例disk中是否和ceph的disk一样

    
    [root@compute2 backup]# fdisk -lu disk
    
    磁盘 disk:50 MB, 50659328 字节,98944 个扇区
    
    Units = 扇区 of 1 * 512 = 512 bytes
    
    扇区大小(逻辑/物理):512 字节 / 512 字节
    
    I/O 大小(最小/最佳):512 字节 / 512 字节
    
    #发现没有disk里没有逻辑信息,突然想到disk里的数据是基于base来增量存储的,下面合并一下数据试试
    
    
    
    [root@compute2 backup]#  qemu-img convert -p -f qcow2 disk -O qcow2 disk-boot.img            #合并disk和base
    
    
    [root@compute2 backup]# fdisk -lu disk-boot.img
    
    磁盘 disk-boot.img:965 MB, 965148672 字节,1885056 个扇区
    
    Units = 扇区 of 1 * 512 = 512 bytes
    
    扇区大小(逻辑/物理):512 字节 / 512 字节
    
    I/O 大小(最小/最佳):512 字节 / 512 字节
    
    
    #发现仍然没有,尝试将磁盘格式从qcow2转换为raw试试
    
    
    
    [root@compute2 backup]# qemu-img convert -f qcow2 -O raw disk-boot.img disk-boot.raw  #转换成raw格式
    
    [root@compute2 backup]# fdisk -lu disk-boot.raw
    
    磁盘 disk-boot.raw:21.5 GB, 21474836480 字节,41943040 个扇区
    
    Units = 扇区 of 1 * 512 = 512 bytes
    
    扇区大小(逻辑/物理):512 字节 / 512 字节
    
    I/O 大小(最小/最佳):512 字节 / 512 字节
    
    磁盘标签类型:dos
    
    磁盘标识符:0x000e6c16
    
    
    
            设备 Boot      Start         End      Blocks   Id  System
    
    disk-boot.raw1   *        2048      411647      204800   83  Linux
    
    disk-boot.raw2          411648     8800255     4194304   82  Linux swap / Solaris
    
    disk-boot.raw3         8800256    41943039    16571392   83  Linux
    
    [root@compute2 backup]# mkdir test
    
    [root@compute2 backup]# mount -o offset=4505731072 disk-boot.raw test/
    
    [root@compute2 backup]# ls test/
    
    bin  boot  cgroup  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var
    
    

    发现一摸一样。所以,了解到这些之后,理论上,我们把本地实例的disk导入到ceph中,是可行的

    操作步骤:

    生成数据盘

    • 查看实例的磁盘信息:
    
    [root@compute2 backup]#ls
    
    console.log  disk  disk.info  libvirt.xml
    
    [root@compute2 backup]# qemu-img info disk
    
    image: disk
    
    file format: qcow2
    
    virtual size: 20G (21474836480 bytes)
    
    disk size: 48M
    
    cluster_size: 65536
    
    backing file: /var/lib/nova/instances/_base/d2d88bd0b8587d35602451d91cf9f3902756caaf
    
    Format specific information:
    
        compat: 1.1
    
        lazy refcounts: false
    
    

    发现磁盘格式为qcow2,磁盘逻辑大小为20G,实际大小为48M。由于disk是基于base来增量存储数据的,。所以,disk实例大小很小,。现在需要将增量数据和base数据进行合并

    
    [root@compute2 backup]#  qemu-img convert -p -f qcow2 disk -O qcow2 disk-boot.img
    
    
    [root@compute2 backup]# ll -h disk-boot.img
    
    -rw-r--r-- 1 root root 921M 10月 18 11:05 disk-boot.img
    
    [root@compute2 backup]# qemu-img info disk-boot.img
    
    image: disk-boot.img
    
    file format: qcow2
    
    virtual size: 20G (21474836480 bytes)
    
    disk size: 920M
    
    cluster_size: 65536
    
    Format specific information:
    
        compat: 1.1
    
        lazy refcounts: false
    
    
    • 转换磁盘格式

    由于ceph存储只支持raw格式,所以需要将qcow2转换为raw

    
    [root@compute2 backup]# qemu-img convert -f qcow2 -O raw disk-boot.img disk-boot.raw
    
    
    [root@compute2 backup]# ll -h disk-boot.raw
    
    -rw-r--r-- 1 root root 20G 10月 18 11:05 disk-boot.raw
    
    [root@compute2 backup]# qemu-img info disk-boot.raw
    
    image: disk-boot.raw
    
    file format: raw
    
    virtual size: 20G (21474836480 bytes)
    
    disk size: 911M
    
    

    将磁盘导入ceph中

    
    #查看本实例的ID: 49704562-e043-47fa-affb-b4e9f1ff1359,所以生成的disk 为vms/49704562-e043-47fa-affb-b4e9f1ff1359_disk
    
    #将disk文件copy到ceph服务器上
    
    #导入:
    
    [root@ceph-node02 ~]#  rbd -p vms import disk-boot.raw --image 49704562-e043-47fa-affb-b4e9f1ff1359_disk
    
    查看:
    
    [root@ceph-node02 ~]# rbd -p vms ls
    
    49704562-e043-47fa-affb-b4e9f1ff1359_disk
    
    

    最后重启启动实例即可

    期间遇到的种种问题:

    由于ceph版本和python-rdb库和ceph服务器的版本不一致,导致启动失败:

    
    libvirtError: internal error: early end of file from monitor: possible problem:
    2016-10-17 18:01:24.682 15412 ERROR oslo_messaging.rpc.dispatcher 2016-10-17T10:01:24.051680Z qemu-kvm: -drive file=rbd:test_vms/c9f4dc2b-82c7-49d9-aca9-57c36c765f53_disk:id=test_cinder:key=AQDrw/1XGO34MBAAitTih7agTaNISDG2dYZ90w==:auth_supported=cephx;none:mon_host=172.16.206.16:6789;172.16.206.19:6789;172.16.206.20:6789,if=none,id=drive-virtio-disk0,format=raw,cache=writeback: error reading header from c9f4dc2b-82c7-49d9-aca9-57c36c765f53_disk
    
    

    解决办法:将本地ceph 和python-rdb的版本升级到ceph服务器版本即可解决

    附ceph 源:

    
    [ceph]
    
    name=ceph
    
    baseurl=http://download.ceph.com/rpm-jewel/el7/x86_64/
    
    gpgcheck=0
    
    enabled=1
    
    
    
    [ceph-deploy]
    
    name=ceph-deploy
    
    baseurl=http://download.ceph.com/rpm-jewel/el7/noarch/
    
    gpgcheck=0
    
    enabled=1
    
    
  • 相关阅读:
    linux进程调度策略(SCHED_OTHER,SCHED_FIFO,SCHED_RR)
    10、单机运行环境搭建之 --Windows下mysqldump 备份与还原数据库
    5、单机运行环境搭建之 --CentOS6.4拷贝Tomcat7形成集群
    9、单机运行环境搭建之 --CentOS6.4下mysqldump 备份与还原数据库
    7、单机运行环境搭建之 --CentOS6.4安装Memcached
    13、单机运行环境搭建之 --Centos6.4下iptables保护主机安全
    12、单机运行环境搭建之 --Centos6.4下webbench压力测试
    6、单机运行环境搭建之 --CentOS6.4安装MySQL 5.6.10并修改MySQL的root用户密码
    4、单机运行环境搭建之 --CentOS6.5优化Tomcat7
    8、单机运行环境搭建之 --CentOS6.4安装vsftpd
  • 原文地址:https://www.cnblogs.com/pycode/p/6494890.html
Copyright © 2011-2022 走看看