desehawk 发表于 2015-4-26 12:19:00

在openstack实例中做HA,实现Web双机热备


问题导读

1.在配置HA的时候做了哪些准备工作?
2.两个实例中如何配置实现Web双机热备?
3.如何测试是否双机热备?


static/image/hrline/4.gif



我用nginx+keepalived实现双机,对内外提供web服务。
fixed_ip=192.168.0.0/24(内网)

float_ip=192.168.8.0/24(外网)

先创建两个实例。登录到两个实例中

ifconfig

查看两个实例的网卡是不是eth0,如果不是eth0,删除下面这个文件

rm -f /etc/udev/rules.d/70-persistent-net.rules
halt -p   #关机

去实例相对应的宿主机上,修改对应实例xml文件

cd /etc/libvirt/qemu/
vim instance-00000002.xml

删除xml文件中的下面四行



重新定义一下xml文件,并启动实例
virsh define instance-00000002.xml
virsh start instance-00000002

这样在实例中配置的虚拟IP就可以和其他主机通信,配一个试试。
ifconfig eth0:0 192.168.0.66/24 up
ifconfig eth0:1 192.168.8.77/24 up用别的机器ping 192.168.0.66能通,ping 192.168.8.77不通,原因很简单,实例是桥接到宿主机br100上,br100也是192.168.0.0网段,所以8.77没有路由就出不去,同样的原理,那就给宿主机br100也配个8.0网段的虚拟IP吧。
ifconfig br100:0 192.168.8.88/24 up在用别的机器ping下192.168.8.88和192.168.8.77吧,果然通了。可以做HA了。

到两个实例中配置
先释放刚才配置的eth0:0和eth0:1的IP


ifconfig eth0:0 down
ifconfig eth0:1 down安装配置nginx和keepalived

yum -y install nginx keepalived
/etc/init.d/nginx start; chkconfig nginx on

cat > /etc/keepalived/keepalived.conf << _GEEK_
global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_nginx_port {
    script "/etc/keepalived/nginx_pid.sh"#检测nginx进程是否存在
    interval 2                  #2s执行一次脚本
    weight 2
}
vrrp_instance nginx1 {
    state MASTER                #主备或主主
    interface eth0
    mcast_src_ip 192.168.0.2    #对方的IP
    virtual_router_id 51      #主、备机的 virtual_router_id 必须相同
    priority 100                #主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1                #查间隔,默认1秒
    authentication {
      auth_type PASS          #两边保持一致
      auth_pass 1111          #认证方式和口令
    }
    track_script {
    chk_nginx_port
    }
    virtual_ipaddress {
      192.168.0.77/24         #内网用户通过0.77来访问Web
      192.168.8.77/24         #外网用户通过8.77来访问WebVRRP HA 虚拟地址 如果有多个VIP,继续换行填写
    }
}
virtual_server 192.168.0.77 80 {
    delay_loop 1                #健康检查时间间隔
    lb_algo rr                  #LVS算法
    lb_kind DR                  #负载均衡转发规则NAT|DR|RUN
    persistence_timeout 10      #会话保持时间
    protocol TCP

    real_server 192.168.0.2 80 {
        weight 3                #权重
        TCP_CHECK {
          connect_timeout 1   #(1秒无响应超时)
          nb_get_retry 1      #重连次数
          delay_before_retry 1 #重连间隔时间
          connect_port 80      #健康检查的端口的端口
        }
    }

    real_server 192.168.0.3 80 {
        weight 3
        TCP_CHECK {
          connect_timeout 1
          nb_get_retry 1
          delay_before_retry 1
          connect_port 80
        }
    }
}

virtual_server 192.168.8.77 80 {
    delay_loop 1
    lb_algo rr
    lb_kind DR
    persistence_timeout 10
    protocol TCP

    real_server 192.168.0.2 80 {
        weight 3
        TCP_CHECK {
          connect_timeout 1
          nb_get_retry 1
          delay_before_retry 1
          connect_port 80
        }
    }

    real_server 192.168.0.3 80 {
        weight 3
        TCP_CHECK {
          connect_timeout 1
          nb_get_retry 1
          delay_before_retry 1
          connect_port 80
        }
    }
}

_GEEK_

检测nginx进程脚本nginx_pid.sh

cat > /etc/keepalived/nginx_pid.sh << _GEEK_
#/bin/bash
NGINX_PID=`ps -C nginx --no-header |wc -l`
if [ $NGINX_PID -eq 0 ];then
    killall keepalived
fi
_GEEK_
chmod +x /etc/keepalived/nginx_pid.sh
/etc/init.d/keepalived start; chkconfig keepalived on

在iptables中开启80端口(或在安全组中添加80端口,我测试不起作用,有人测试成功请告诉我)
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

两个实例都配置好后,可以用192.168.8.77或192.168.0.77来访问Web。
测试:
宕掉一个实例的nginx服务,看可不可以继续访问

killall nginx

不能访问,检查log
tail -f /var/log/message两个Web数据需要存储到Swift中去,请参考(挂载Swift到网站主目录下)

http://www.longgeek.com/2012/09/10/swift-to-site-data-store/





Redgo 发表于 2015-4-26 14:03:46

NiceNiceNice

hb1984 发表于 2015-4-27 16:40:55

谢谢楼主分享。      
页: [1]
查看完整版本: 在openstack实例中做HA,实现Web双机热备