1、理论部分

基于lvs的负载均衡无法检测Real Server的状态,当Real Server的服务单点故障,Director照样把请求转发给故障的机器,造成请求无法得到正常的服务。

所以就需要引入一种检测机制来弥补缺陷,这就需要Keepalived来实现,他不但可以检测Real Server的状态,同时也可以检测Director的状态,达到Failover的目的。

2、实验部分

2.1、实验基础

LVS均衡负载基础:

http://cmdschool.blog.51cto.com/2420395/1702421

以上基础并增加一台副Director主机

2.2、主机信息

Dr1:

director ipaddress=10.168.0.89

vip ipaddress=10.168.0.91

hostname=dr1

Dr2:

director ipaddress=10.168.0.90

vip ipaddress=10.168.0.91

hostname=dr2

Rs1:

real ipaddress=10.168.0.94

vip-lo ipaddress=10.168.0.91

hostname=rs1

Rs2:

real ipaddress=10.168.0.95

vip-lo ipaddress=10.168.0.91

hostname=rs2

2.3、yum源安装

In Director

yum install -y keepalived

2.4、设置配置文件

2.4.1、step1

IN DR1

vim编辑/etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state MASTER   #备用服务器上为 BACKUP
    interface eth0
    virtual_router_id 51
    priority 100  #备用服务器上为90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.168.0.91
    }
}
virtual_server 10.168.0.91 80 {
    delay_loop 6                  #(每隔10秒查询realserver状态)
    lb_algo wlc                  #(lvs 算法)
    lb_kind DR                  #(Direct Route)
    persistence_timeout 60        #(同一IP的连接60秒内被分配到同一台realserver)
    protocol TCP                #(用TCP协议检查realserver状态)

    real_server 10.168.0.92 80 {
        weight 100               #(权重)
        TCP_CHECK {
        connect_timeout 10       #(10秒无响应超时)
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
real_server 10.168.0.93 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

IN DR2

vim编辑/etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP   #主服务器上为 MASTER
    interface eth0
    virtual_router_id 51
    priority 90  #主服务器上为100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.168.0.91
    }
}
virtual_server 10.168.0.91 80 {
    delay_loop 6                  #(每隔10秒查询realserver状态)
    lb_algo wlc                  #(lvs 算法)
    lb_kind DR                  #(Direct Route)
    persistence_timeout 60        #(同一IP的连接60秒内被分配到同一台realserver)
    protocol TCP                #(用TCP协议检查realserver状态)

    real_server 10.168.0.92 80 {
        weight 100               #(权重)
        TCP_CHECK {
        connect_timeout 10       #(10秒无响应超时)
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
real_server 10.168.0.93 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

注意,DR1&DR2差异仅如下:

state MASTER <-> state BACKUP

priority 100 <-> priority 90

2.4.2、step2

IN DR1&DR2

开启端口转发:

echo 1 > /proc/sys/net/ipv4/ip_forward

2.4.3、step3

IN RS1&RS2

启动脚本:

/usr/local/sbin/lvs_dr_rs.sh

2.4.4、step4

IN DR1&DR2

启动keeplive服务:

/etc/init.d/keepalived start

注意:

以下脚本不需要再像在LVS实验中那样执行“/usr/local/sbin/lvs_dr.sh”