分享

OpenStack计算节点宕机,如何恢复运行在上面的实例

hochikong 发表于 2014-7-28 14:59:02 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 15914
本帖最后由 hochikong 于 2014-7-28 15:14 编辑
问题导读:
1.如何在mysql中修改当前的instances表?
2.如何恢复float ip?




暂时不考虑冷迁移,看看计算节点宕掉后能不能恢复上面跑的实例。
两个计算节点,上面的实例跑在共享存储上,compute_one 上有 vm_1,compute_two 上跑着 vm_2。

现在去compute_one上停掉服务或断电
  1. # /etc/init.d/openstack-nova-compute stop
  2. # /etc/init.d/openstack-nova-network stop
复制代码
OK, compute_one节点已经挂了,vm_1的数据还在共享存储上,我们把compute_one上的vm_1搞到compute_two上
compute_one挂了后,我们需要知道它上面运行了哪些虚拟机,从而把这些虚拟机搞到compute_two节点上

在控制节点上查询
  1. # nova-manage vm list | grep compute_one | awk '{print $1}'
  2. vm_1
复制代码
只有一个vm_1。


在mysql中修改instances表,把vm_1所在的host改成compute_two
  1. # mysql -uroot -pmysql
  2. mysql> use nova;
  3. mysql> update instances set host='compute_two' where hostname='vm_1';
  4. OK!
复制代码
查看vm_1它的实例名字是什么
  1. # nova show vm_1  | grep instance_name | awk '{print $4}'
  2. instance-00000004
复制代码
去compute_two上查看vm_1的xml防火墙规则名字
  1. # instance_name='instance-00000004'
  2. cd /var/lib/nova/instances/$instance_name
  3. # filter_name=`cat libvirt.xml  | grep filter= | awk -F'"' '{print $2}'`
  4. # echo $filter_name
  5. nova-instance-instance-00000004-fa163e0cb87b
复制代码
在compute_two上新建vm_1防火墙规则文件
  1. # filter_uuid=`uuidgen $filter_name`
  2. # cat > /etc/libvirt/nwfilter/$filter_name.xml << _LongGeek_
  3. <filter name='$filter_name' chain='root'>
  4.   <uuid>$filter_uuid</uuid>
  5.   <filterref filter='nova-base'/>
  6. </filter>
  7. _LongGeek_
复制代码
提取vm_1的mac地址和ip地址
  1. # instance_mac=`cat /var/lib/nova/instances/$instance_name/libvirt.xml | grep mac | awk -F "'" '{print $2}'`
  2. # instance_ip=`cat /var/lib/nova/instances/$instance_name/libvirt.xml | grep IP | awk -F '"' '{print $4}'`
复制代码
把vm_1的ip地址写入到配置文件
  1. # echo -e "n$instance_mac,vm_1.novalocal,$instance_ip" >> /var/lib/nova/networks/nova-br100.conf
复制代码
重启libvirtd,让防火墙规则生效
  1. # /etc/init.d/libvirtd restart
复制代码
定义xml文件,并启动
  1. # cd /var/lib/nova/instances/$instance_name/
  2. # virsh define libvirt.xml
  3. # virsh start instance-00000004
复制代码
OK.数据在,fixed网络也没有问题.
恢复floating ip,首先需要在mysql中找出vm_1以前使用的floating ip是多少
先找出vm_1的fixed ip的id号
  1. # fixed_id=`mysql -uroot -pmysql -e "select * from nova.fixed_ips where address=$instance_ip;" | awk '{print $7}' | tail -n 1`
复制代码
通过vm_1的fixed ip的id号找出float ip地址
  1. # float_ip=`mysql -uroot -pmysql -e "select * from nova.floating_ips where id=$fixed_id;" | awk '{print $7}' | tail -n1`
复制代码
修改float ip地址所在的host
  1. # mysql -uroot -pmysql -e "update nova.floating_ips set host='compute_two' where address=$float_ip;"
复制代码
手工添加$float_ip到compute_two上
  1. # ip addr add $float_ip/32 dev eth1
复制代码
添加iptables规则
  1. # iptables -t nat -A nova-network-OUTPUT -d $float_ip/32 -j DNAT --to-destination $instance_ip
  2. # iptables -t nat -A nova-network-PREROUTING -d $float_ip/32 -j DNAT --to-destination $instance_ip
  3. # iptables -t nat -A nova-network-float-snat -s $instance_ip/32 -j SNAT --to-source $float_ip
  4. # /etc/init.d/iptables save
复制代码
开启路由转发
  1. # vim /etc/sysctl.conf
  2. net.ipv4.ip_forward = 1
  3. # sysctl -p
复制代码
OK,floating_ip也恢复了,都可以在dashboard上操作。

涉及自动化恢复实例是一个难点,需要调用nova-scheduler的API,来选择把实例恢复到一些资源空闲的节点上面,或者资源不够等情况的处理。还是很麻烦的。


#######################################################################################
本文转自:http://longgeek.com/2012/10/31/openstack-compute-node-is-down-running-in-the-previous-instance/













欢迎加入about云群9037177932227315139327136 ,云计算爱好者群,亦可关注about云腾讯认证空间||关注本站微信

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条