在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/
NiceNiceNice 谢谢楼主分享。
页:
[1]