《linux keepalived与lvs的深入分析〉一,lvs+keepalived 高可用负载均衡模式分析

1. 前言

在《keepalived 双机热备》这篇文章中,我写了利用keepalived 这个开源软件实现高可用的功能,以及keepalived 高可用所使用的协议——利用vrrp 协议,在高可用网络组内广播自己的优先级,优先级最高的就能抢占vip资源,充当MASTER 主机,提供服务。在今天这篇文章,我们来看看lvs 如何与keepalived 的高可用功能结合,实现对负载均衡调度器的高可用。

经过《lvs_nat 负载均衡模式及抓包分析》 和《lvs_dr 负载均衡模式分析》这里两篇文章的分析,我们已经对lvs的架构非常熟悉了。但是在这些架构中,lvs 很容易出现单点故障,所以需要对 lvs 调度器增加一个高可用的功能。前面介绍的 keepalived 软件就是一个很好的,实现高可用的软件。keepalived 最先是为了解决 lvs 对集群内的服务器没有监控功能而实现的,lvs 的集群内,如果服务宕机,客户端发过来的请求,它还是会按照调度算法将请求逐一发到后端服务。keepalived 不仅仅有 lvs 的功能,还可以对集群服务进行监控检测,如果发现服务器宕机了,keepalived就会将宕机的主机踢出集群,不再将客户端的请求发送到该主机。当主机恢复正常后,keepalived会重新将该主机添加都集群。

再经过发展,keepalived增加了vrrp协议,可以实现虚拟路冗余的功能。vrrp协议,就是实现我们今天要讲的 lvs + keepalived 高可用功能的关键协议。vrrp 的实现原理,可以翻看《keepalived 双机热备》这篇文章。

2. 具体配置

2.1 实验环境

《linux keepalived与lvs的深入分析〉一,lvs+keepalived 高可用负载均衡模式分析_第1张图片

今天我们要分析的重点就是架构图中用红色框圈出的 lvs 调度器层,通过keepalived 实现冗余。

ip地址分配:

客户端 : 192.168.188.111

dir1 : 192.168.188.108

dir2 : 192.168.188.109

rs1 : 192.168.188.107

rs2 : 192.168.188.110

vip : 192.168.188.120

说明: 在这个架构中我们仍然使用lvs dr 的负载均衡模式。由于后端的realserver 没有太多变化,所以,可以继续使用《lvs_dr 负载均衡模式分析》这篇文章的配置方法。而前端lvs 的功能则使用了 keepalived 软件。

2.2 配置realserver

2.2.1 在两台realserver 主机运行lvs_rs.sh 脚本

[root@cenvm72 network-scripts]# cat /usr/local/sbin/lvs_rs.sh

#/bin/bash

vip=192.168.188.120

#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端

ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up

route add -host $vip lo:0

#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端

#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

两台realeserver 主机的 lvs_rs.sh 配置文件都一样

2.2.2 在两台lvs调度器上安装keepalived并配置keepalived软件

yum install -y keepalived

[root 11:57:22 @CentOS3 sbin] cat /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {

#备用服务器上为 BACKUP

state MASTER

#绑定vip的网卡为eth0,你的网卡和我的可能不一样,这里需要你改一下

interface eth0

virtual_router_id 51

#备用服务器上为90

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass hell>com

}

virtual_ipaddress {

192.168.188.120 # 这个就是vip;如果有多个vip,支持多行隔开

}

}

virtual_server 192.168.188.120 80 {

#(每隔10秒查询realserver状态)

delay_loop 5

#(lvs 算法)

lb_algo wlc # wlc:最少连接数算法,因为实验的访问量本来就少,所以为了看效果,我们就选用轮询算法

#(DR模式)

lb_kind DR

#(同一IP的连接60秒内被分配到同一台realserver)

persistence_timeout 0

#(用TCP协议检查realserver状态)

protocol TCP

real_server 192.168.188.107 80 {

#(权重)

weight 100

TCP_CHECK {

#(10秒无响应超时)

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

real_server 192.168.188.110 80 {

weight 100

TCP_CHECK {

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

}

说明: 在另一台用来充当 lvs 调度器备机的机器上安装keepalived软件,配置的时候,只需修改state 为BACKUP 和 priority 为90 即可。

3. 启动服务

3.1 dir1 调度器

为了防止以前的Ivs 规则,可以先执行

ipvsadm -C 清除一些规则,

然后需要打开 ip 转发功能:

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

然后,启动keepalived

/etc/init.d/keepalived start

3.2 dir2 调度器

同样的做法

ipvsadm -C 清除一些规则,

然后需要打开 ip 转发功能:

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

然后,启动keepalived

/etc/init.d/keepalived start

3.3 realserver 服务器执行 lvs_rs.sh 脚本

/bin/bash /usr/local/sbin/lvs_rs.sh

在两台realserver 主机上执行。

3.4 realserver 服务器启动nginx 服务

安装nginx ,修改nginx 服务默认html 页面,区分rs1 和rs2 不同即可,最后启动nginx

4. 测试结果

(1)在 dir1 上验证vip:

[root 12:13:37 @CentOS3 sbin] ip add show

1: lo: mtu 65536 qdisc noqueue state UNKNOWN

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000

link/ether 00:0c:29:50:d5:63 brd ff:ff:ff:ff:ff:ff

inet 192.168.188.108/24 brd 192.168.188.255 scope global eth0

inet 192.168.188.120/32 scope global eth0

inet6 fe80::20c:29ff:fe50:d563/64 scope link

valid_lft forever preferred_lft forever

(2)在 dir1 上查看系统日志:

[root 12:14:35 @CentOS3 sbin] tail /var/log/messages

Mar 30 10:50:49 CentOS3 Keepalived_vrrp[12055]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election

Mar 30 10:50:50 CentOS3 Keepalived_vrrp[12055]: VRRP_Instance(VI_1) Entering MASTER STATE

Mar 30 10:50:50 CentOS3 Keepalived_vrrp[12055]: VRRP_Instance(VI_1) setting protocol VIPs.

Mar 30 10:50:50 CentOS3 Keepalived_vrrp[12055]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.188.120

Mar 30 10:50:50 CentOS3 Keepalived_healthcheckers[12054]: Netlink reflector reports IP 192.168.188.120 added

Mar 30 10:50:54 CentOS3 Keepalived_healthcheckers[12054]: TCP connection to [192.168.188.107]:80 failed !!!

Mar 30 10:50:54 CentOS3 Keepalived_healthcheckers[12054]: Removing service [192.168.188.107]:80 from VS [192.168.188.120]:80

Mar 30 10:50:55 CentOS3 Keepalived_vrrp[12055]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.188.120

可以看到 vip 192.168.188.120 已经绑定到dir1 的eth0 网卡了

(3)再来看看dir2 的情况:

[root 10:48:45 @CentOS3_02 ~] ip add show

1: lo: mtu 65536 qdisc noqueue state UNKNOWN

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000

link/ether 00:0c:29:8e:cf:65 brd ff:ff:ff:ff:ff:ff

inet 192.168.188.109/24 brd 192.168.188.255 scope global eth0

inet6 fe80::20c:29ff:fe8e:cf65/64 scope link

valid_lft forever preferred_lft forever

vip 并不在dir2 这台主机。

(4) 将dir1 的keepalived 关掉,vip 将会被 dir2 抢占,lvs 提供的负载均衡服务没有失效。

dir1 :

/etc/init.d/keepalived stop

dir2 :

[root 12:53:33 @CentOS3_02 ~] tail /var/log/messages

Mar 30 10:50:51 CentOS3_02 ntpd[1422]: Deleting interface #20 eth0, 192.168.188.120#123, interface stats: received=0, sent=0, dropped=0, active_time=128 secs

Mar 30 10:51:29 CentOS3_02 Keepalived_healthcheckers[8111]: TCP connection to [192.168.188.107]:80 success.

Mar 30 10:51:29 CentOS3_02 Keepalived_healthcheckers[8111]: Adding service [192.168.188.107]:80 to VS [192.168.188.120]:80

Mar 30 12:56:22 CentOS3_02 Keepalived_vrrp[8113]: VRRP_Instance(VI_1) Transition to MASTER STATE

Mar 30 12:56:23 CentOS3_02 Keepalived_vrrp[8113]: VRRP_Instance(VI_1) Entering MASTER STATE

Mar 30 12:56:23 CentOS3_02 Keepalived_vrrp[8113]: VRRP_Instance(VI_1) setting protocol VIPs.

Mar 30 12:56:23 CentOS3_02 Keepalived_vrrp[8113]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.188.120

Mar 30 12:56:23 CentOS3_02 Keepalived_healthcheckers[8111]: Netlink reflector reports IP 192.168.188.120 added

Mar 30 12:56:25 CentOS3_02 ntpd[1422]: Listen normally on 21 eth0 192.168.188.120 UDP 123

Mar 30 12:56:28 CentOS3_02 Keepalived_vrrp[8113]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.188.120

或者dir2 :

[root 12:57:32 @CentOS3_02 ~] ip add show

1: lo: mtu 65536 qdisc noqueue state UNKNOWN

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000

link/ether 00:0c:29:8e:cf:65 brd ff:ff:ff:ff:ff:ff

inet 192.168.188.109/24 brd 192.168.188.255 scope global eth0

inet 192.168.188.120/32 scope global eth0

inet6 fe80::20c:29ff:fe8e:cf65/64 scope link

valid_lft forever preferred_lft forever

可以看到,vip 已经被 dir2 抢占了。

(5)重新启动 dir1 的 keepalived 服务,vip 从新被 dir1 抢占绑定

验证方法同上一步,所以,截图就省略了。

5. 总结

通过实验,我们已经验证了,keepalived 具有高可用的功能,在本文的测试验证中已经证明。其实,keepalived 还有检测后端服务的健康情况的功能,如果将这次实验中的nginx 停掉,客户端的请求就会发到其中一台服务器,当nginx重新启动,客户端的请求又会均匀地转发到nginx 服务器。因为今天主要将 lvs + keepalived 的高可用功能,所以,对nginx 的测试就不在赘述了。大家可以在这个实验的基础上,尝试一下,看看结果如何。

你可能感兴趣的:(《linux)