keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。它的作用是通过layer3, 4 & 5交换机制来检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中。

layer3是ip/tcp协议ip层,当keepalived使用layer3工作方式时会定期ping真实服务器的ip,当某台服务器的ipPing不同时,将会被踢除服务器群组。

layer4是ip/tcp协议的tcp层,它通过检测服务器端口状态来检测服务器,如当keepalived没有检测到apache的80端口时,就会将这台服务器踢除集群

layer5是ip/tcp协议的应用层。它根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。它是一个开源的软件,可以实现LINUX平台下的简单负载均衡。 优点:

1 、开源,免费

2、在网上能找到一些相关技术资源

3、具有软件负载均衡的一些优点

缺点:

1、具有开源产品常有的缺点,最核心的就是没有可靠的支持服务,没有人对其结果负责

2、功能比较简单,支持复杂应用的负载均衡能力较差,如算法较少等。

3、开启隧道方式需重编译内核

4、配置复杂

5、只支持LINUX ,如果应用还包括WINDOWS、SOLIRIS等就不行了。

lvs的有DR、NAT、TUN、FULLNAT四种模式

lvs DR模式: 客户发送一个请求给VIP;VIP 收到这请求后会跟LVS设置的LB算法选择一个LB 比较合理的真实服务器,然后把此请求的MAC地址修改为真实服务器的MAC地址。DR 模式要求VIP 和 所有的真实服务器在同一个网段,也就是在用过LAN里面。不然广播后所有的包都会丢掉,同时所有的真实服务器都必须绑定VIP的IP地址。

keepalived+lvs_其他

lvs NAT模式:客户发送请求给vip后,vip会根据LB算法选一个真实服务器处理请求,处理完后发送给lvs之后再传给客户。NAT模式走的是switch 或pub 不需要修改MAC 所以,不需要VIP 和真实服务器在同一个网段内。

keepalived+lvs_lvs_02

lvs TUN模式:把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议所以,在RS的内核中,必须编译支持IPTUNNEL这个选项。

keepalived+lvs_lvs_03

lvs full-nat模式:fullnat无非就是nat,但DIP和RIP之间可以经过路由进行转发。当请求到来时,源目IP分别为CIP和VIP。到达调度器后,还是由ipvs挑选一台主机,但由于DIP和RIP并不在同一个网段,所以ipvs会将请求的报文源目IP分别改为DIP和RIP。RS收到报文后,就会将响应报文发给DIP,这是毋庸置疑的。调度器在收到报文,通过在内部追踪nat表以后,将响应报文的源目IP分别改为VIP和CIP,于是报文就发给客户端。这种源目IP都进行修改的LVS类型就是fullnat。

下面是keepalived+lvs(DR)的简单配置

实验环境:rhel6.5 selinux and iptables disabled

实验主机:

  lvs-MASTER      172.25.254.2
  lvs-BACKUP      172.25.254.3
  realserver      172.25.254.4
                  172.25.254.5

lvs主机的配置:

yum install libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm 
yumi install pvsadm kernel-devel openssl-devel libnl-devel gcc 
tar zxf keepalived-1.2.20.tar.gz
cd keepalived-1.2.20

指定安装路径编译:

./configure --prefix=/usr/local/keepalived

出现以下几个yes即可

keepalived+lvs_其他_04

make && make install

建立必要的软连接:

ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/etc/keepalived /etc/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
ln -s /usr/local/keepalived/bin/genhash /bin/

配置keepalived:

vim   /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
notification_email {
    2838371898@qq.com #指定接受报警的邮箱,可以有多个
}
notification_email_from keepalived@server2.example.com #发送邮件的地址
smtp_server 127.0.0.1          #smtp server 地址
smtp_connect_timeout 30        #smtp超时时间
router_id LVS_DEVEL            #load balancer 的标识 ID,用于 email 警报
}

vrrp_instance VI_1 {
 state MASTER         #设定lvs主备机状态,备机为BACKUP
 interface eth0       #HA 监测网络接口
 virtual_router_id 51 #主备机的id必须相同
 priority 100         #设定优先级,数字越高优先级有高,主机优先级要高于                            备机
 advert_int 1         #主备机通信间隔时间
 authentication {
    auth_type PASS   #设置验证类型,主要有 PASS 和 AH 两种
    auth_pass 1111   #主备机必须一致

}
virtual_ipaddress {
    172.25.254.100   #设定虚拟ip,可多个
}

}

virtual_server 172.25.254.100 80 {  #通过端口定义虚拟服务器,80为apache端口
delay_loop 6                 #每隔 6 秒查询 realserver 状态
lb_algo rr                   #lvs调度算法为论询
lb_kind DR                   #lvs为直连模式

# persistence_timeout 50 #设定连接保持时间 protocol TCP #指定转发协议

real_server 172.25.254.4 80 {  #定义真实服务器
    weight 1                  #配置权重
    TCP_CHECK {               #设置真实服务器检查为tcp查询
        connect_timeout 3     #设定超时时间
        nb_get_retry 3        #重试次数

        delay_before_retry 3  #重试间阁
    }
}
real_server 172.25.254.5 80 { #另一台真实服务器用以实习负载均衡
    weight 1
    TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
    }
}
}

真实服务器部分:

为真实服务器添加虚拟IP

ip addr add 172.25.254.100/32 dev eth0

安装arp防火墙

yum install arptables_jf.x86_64 -y

为真实服务器的虚拟ip建立ARP列表使得真实服务器忽略所有来自虚拟ip的请求,使得只有lvs机才能接受虚拟ip的请求。并把原先包含虚拟ip的arp回应改为包含真实服务器的ip

arptables -A IN  -d 172.25.254.100 -d -j DROP
arptables -A OUT -s 172.25.254.100  -j mangle --mangle-ip-s 172.25.254.4

测试:

停止server2节点备机server3将接管

停止server4的httpd服务访问虚拟ip将只能访问server5的主页