Openstack(两控制节点+四计算节点)-3 模拟计算节点宕机

      compute-2的作用就是compute-1的备机,注意是备机,因为compute-2如果也运行vm实例的话,实例会保存在/var/lib/nova/instance中,这样当compute-1宕机的时候,需要把共享存储挂载过来的时候会发现无处可挂载,这种情况可以通过不使用iscsi模拟共享存储,而使用NFS来实现,但是NFS在运行多个vm实例时IO性能上差很多。

按照计算节点的设置方法把compute-2设置一遍,做到第19步即可。

1 查看compute-2上的服务是否正常

nova-manage service list

Openstack(两控制节点+四计算节点)-3 模拟计算节点宕机_第1张图片

2 直接关闭compute-1节点

shutdown -h now
Openstack(两控制节点+四计算节点)-3 模拟计算节点宕机_第2张图片

3 在compute-2上查看存储提供了哪些资源,发现和之前compute-1上看到的一样

iscsiadm -m discovery -t st -p 10.1.6.39

Openstack(两控制节点+四计算节点)-3 模拟计算节点宕机_第3张图片

挂载iscsi服务端提供的共享资源

iscsiadm  -m node -T iqn.2012-11.com.example:cloude-storage.lun1 -p 10.1.6.39:3260 -l

Openstack(两控制节点+四计算节点)-3 模拟计算节点宕机_第4张图片

5 把/dev/sdb1挂载到 /var/lib/nova/instances目录下,注意目录权限需要是nova

Openstack(两控制节点+四计算节点)-3 模拟计算节点宕机_第5张图片

6 开始迁移,使用自己写的迁移脚本,把vm1迁移到compute-2上面

Openstack(两控制节点+四计算节点)-3 模拟计算节点宕机_第6张图片

Openstack(两控制节点+四计算节点)-3 模拟计算节点宕机_第7张图片

      迁移思路如下:vm实例在计算节点运行在共享存储提供的空间上面,如果某个计算节点宕机,则可以把该计算节点存储vm实例的共享存储挂载在另一台备用计算节点上,然后在备用节点来启动上面保存的vm实例。

下面的迁移脚本可以很好的了解到在迁移过程中需要修改那些配置文件

7 migration_vm.sh 内容如下

#!/bin/bash

get_vm_info() {
    echo -e "\033[33m============[ VM Info ]=================\033[0m"
    nova-manage vm list | awk '{if (NR>1)print $1,$2}'| while read info
    do
         vm_instance=`echo $info | awk '{print $1}'`
         vm_node=`echo $info | awk '{print $2}'`
         echo -e "\033[32m$vm_instance                       $vm_node\033[0m"
    done
}

get_migration() {
   
    local_ip=`ifconfig br100 | grep 'inet addr' | awk -F : '{print $2}' | awk '{print $1}'`
    mysql -unova -hmy.vm.com -pmy_password -e "use nova;update instances set host='$4' where hostname='$1';"
    instance_id=`nova show $1 | grep 'OS-EXT-SRV-ATTR:instance_name' | awk '{print $4}'`
    filter_name=`grep 'filter=' /var/lib/nova/instances/$instance_id/libvirt.xml |awk -F'"' '{print $2}'`
    instance_ip=`grep 'name="IP"' /var/lib/nova/instances/$instance_id/libvirt.xml | awk -F '"' '{print $4}'`
    instance_mac=`grep 'mac address' /var/lib/nova/instances/$instance_id/libvirt.xml | awk -F '"' '{print $2}'`
    filter_uuid=`uuidgen $filter_name`   
    sed -i "/listen/s/$2/$4/" /var/lib/nova/instances/$instance_id/libvirt.xml 
cat > /etc/libvirt/nwfilter/$filter_name.xml << EOF
<filter name='$filter_name' chain='root'>
  <uuid>$filter_uuid</uuid>
  <filterref filter='nova-base'/>
</filter>
EOF
    echo  "$instance_mac,$1.novalocal,$instance_ip" >> /var/lib/nova/networks/nova-br100.conf
 
    /etc/init.d/libvirt-bin restart
    virsh define /var/lib/nova/instances/$instance_id/libvirt.xml 
    virsh start $instance_id

}
start_migration() {
   echo -e "\033[33m============[ Migration Plan]=============\033[0m"
   echo -e "\033[33mInput your want migration instance_name\033[0m" 
   read -p "instance_name:" vm_name
   echo -e "\033[33mInput your want migration node_name\033[0m"
   read -p "src_node_name:" src_node_name
   echo -e "\033[33mInput your want migration node_ip\033[0m"
   read -p "src_node_ip:" src_node_ip
   echo -e "\033[33mInput your dst node_name\033[0m"   
   read -p "dst_node_name:" dst_node_name
   read -p "Do you want migration $src_node_name's $vm_name to $dst_node_name?[Y/N]" answer
   case $answer in
        Y | y)
            get_migration "$vm_name" "$src_node_name" "$src_node_ip" "$dst_node_name";;
        N | n)
            echo "ok,good bye";;
        *)
            echo "error choice";;
            esac
            exit 0   
}

get_vm_info

start_migration

     脚本写的比较挫,大部分信息的提取都是在shell中命令提取的,主要是为验证迁移过程(该脚本只能在E版本中使用,不同版本nova show输出不一样),随后又写了一个python迁移脚本(E、F都可以使用),全部信息的提取都不必在shell中命令提取,可以通过数据库获取到。

8 live.py py版迁移脚本

#!/usr/bin/python
import os
import sys
import time
import MySQLdb as mysql
import xml.etree.ElementTree as ET

name=sys.argv[1]
value=sys.argv[2]

def GetVmNum():
    try:
        conn=mysql.connect(host='vm.my.com',user='root',passwd='my_password',db='nova')
    except Exception,e:
        print e
        sys.exit()
    cursor=conn.cursor()

    sql1="select m.id from instances i inner join instance_id_mappings m on i.uuid=m.uuid where hostname=%s;"
    cursor.execute(sql1,(name,))   
    result1=cursor.fetchone()
    cursor.close
    conn.close
    return 'instance-%07d' % result1


def GetConFile():

    filenum=GetVmNum()
    filename='/opt/' + filenum + '/' + name + '.xml'
    return filename

def ChangeXmlValue():

    filename=GetConFile()
    tree=ET.parse(filename)
    for i in tree.iter(tag='name'):
        i.text=value
    tree.write(filename)

def StartVm():

     filename=GetConFile()
     os.system("virsh shutdown name")
     time.sleep(10)
     os.system("virsh define filename")
     time.sleep(3)
     os.system("virsh start name")

def ChangeDashboard():

    try:
        conn=mysql.connect(host='vm.my.com',user='root',passwd='my_password',db='nova')
    except Exception,e:
        print e
        sys.exit()
    cursor=conn.cursor()
    sql2="update instances set instance_type_id=%s where hostname=%s;"    
    cursor.execute(sql1,(vaor,name,))


你可能感兴趣的:(Openstack(两控制节点+四计算节点)-3 模拟计算节点宕机)