问题导读
1.在配置HA的时候做了哪些准备工作?
2.两个实例中如何配置实现Web双机热备?
3.如何测试是否双机热备?
我用nginx+keepalived实现双机,对内外提供web服务。
- fixed_ip=192.168.0.0/24(内网)
-
- float_ip=192.168.8.0/24(外网)
复制代码
先创建两个实例。登录到两个实例中
复制代码
查看两个实例的网卡是不是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来访问Web VRRP 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服务,看可不可以继续访问
复制代码
不能访问,检查log
复制代码 两个Web数据需要存储到Swift中去,请参考(挂载Swift到网站主目录下)
- http://www.longgeek.com/2012/09/10/swift-to-site-data-store/
复制代码
|