Lvs+Keepalived高可用实践
Lvs+Keepalived的基本使用架构如下图如下:
当然,我们这里就没有必要一整套都实现下来,我们主要做的就是LVS+Keepalived实验,所以我们只需要2台LVS+Keepalived(DR模式),2台WEB即可测试即可,基本信息如下:
Lvs+Keepalived Master的IP地址为:172.29.32.200
Lvs+Keepalived Backup的IP地址为:172.29.32.201
Lvs+Keepalived VIP地址为:172.29.32.210
WEB01的IP地址为:172.29.32.202
WEB02的IP地址为:172.29.32.204
1)Lvs+Keepalived Master配置
配置DIP。
1 |
$ ifconfig eth0 172.29.32.200 netmask 255.255.255.0 |
先需要安装keepalived和ipvsadm。
1 2 |
$ yum install keepalived $ yum install ipvsadm |
配置Keepalived。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.29.32.210 } } virtual_server 172.29.32.210 22 { delay_loop 3 lb_algo wrr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 172.29.32.202 22 { weight 1 TCP_GET { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 22 } } real_server 172.29.32.203 22 { weight 1 TCP_GET { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 22 } } } |
把同样的配置复制一份到BACKUP主机,只需要改两个参数即可:
1 2 |
state BACKUP priority 5 |
2)Lvs+Keepalived Slave配置
配置DIP。
1 |
$ ifconfig eth0 172.29.32.201 netmask 255.255.255.0 |
先需要安装keepalived和ipvsadm。
1 2 |
$ yum install keepalived $ yum install ipvsadm |
配置Keepalived,只需要把Master的配置复制一份到BACKUP主机,只需要改两个参数即可:
1 2 |
state BACKUP priority 5 |
3)WEB01(RealServer)配置
设置RIP地址。
1 |
$ ifconfig eth0 172.29.32.202 netmask 255.255.255.0 |
调整网卡响应机制(目标地址不是ETH0接口地址统统拒绝响应)。
1 2 3 4 |
$ sysctl -w net.ipv4.conf.eth0.arp_announce=2 $ sysctl -w net.ipv4.conf.all.arp_announce=2 $ echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore $ echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore |
在loopback上设置VIP地址只用于响应数据包。
1 |
$ ifconfig lo:0 172.29.32.210 broadcast 172.29.32.210 netmask 255.255.255.255 |
设置路由策略如果目标地址访问的是VIP那么响应地址就设为lo:0的地址。
1 |
$ route add -host 172.29.32.210 dev lo:0 |
安装nginx
1 2 3 |
$ yum install nginx $ nginx $ echo 172.29.32.202 > /usr/share/nginx/html/index.html |
4)WEB02(RealServer)配置
设置RIP地址。
1 |
$ ifconfig eth0 172.29.32.203 netmask 255.255.255.0 |
调整网卡响应机制(目标地址不是ETH0接口地址统统拒绝响应)。
1 2 3 4 |
$ sysctl -w net.ipv4.conf.eth0.arp_announce=2 $ sysctl -w net.ipv4.conf.all.arp_announce=2 $ echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore $ echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore |
在loopback上设置VIP地址只用于响应数据包。
1 |
$ ifconfig lo:0 172.29.32.210 broadcast 172.29.32.210 netmask 255.255.255.255 |
设置路由策略如果目标地址访问的是VIP那么响应地址就设为lo:0的地址。
1 |
$ route add -host 172.29.32.210 dev lo:0 |
安装nginx
1 2 3 |
$ yum install nginx $ nginx $ echo 172.29.32.202 > /usr/share/nginx/html/index.html |
5)测试效果
可以使用客户端访问172.16.16.1查看轮询访问变化,如下:
1 2 3 4 5 6 7 8 |
$ curl http://172.16.16.1 192.168.10.2 $ curl http://172.16.16.1 192.168.10.3 $ curl http://172.16.16.1 192.168.10.2 $ curl http://172.16.16.1 192.168.10.3 |
或者使用ab压力测试访问172.16.16.1查看加权轮询变化。
1 |
$ ab -n 10000 -c 100 http://172.16.16.1 |
查看当前连接数
1 2 3 4 5 6 7 |
$ ipvsadm -L -n -c IPVS connection entries pro expire state source virtual destination TCP 00:08 TIME_WAIT 172.16.16.10:56447 172.16.16.1:80 192.168.10.2:80 TCP 01:18 TIME_WAIT 172.16.16.10:56484 172.16.16.1:80 192.168.10.3:80 TCP 01:18 TIME_WAIT 172.16.16.10:56486 172.16.16.1:80 192.168.10.3:80 TCP 01:18 TIME_WAIT 172.16.16.10:56485 172.16.16.1:80 192.168.10.2:80 |
通过当前连接数,可以看出连接协议,以及tcp keepalive的剩余时间和状态信息。还有源和目标IP以及虚拟IP。
查看统计信息
1 2 3 4 5 6 7 |
$ ipvsadm -L -n --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 172.16.16.1:80 11 61 34 7168 7669 -> 192.168.10.2:80 5 28 21 2834 5570 -> 192.168.10.3:80 6 33 13 4334 2099 |
由于是NAT模式,所以当访问几次之后,可以看到,指标Conns、InPkts、OutPkts、InBytes、OutBytes都有数据才正确,因为进出数据包都经过调度器,所以任何一个参数值为空都是不正确的。而DR模式则不然。
最后,还可以更改RealServer的权重,再使用AB压力测试一下,看看统计信息是否跟权重调整的对比。
PS:你在测试过程中,当LVS调度算法使用轮询或加权轮询默认时,如果你使用浏览器(同一个IP)访问VIP,可能会出现跟你想象的轮询调度不一样的结果,那就是一直刷新网页却无法轮询,每次都需要等待2分钟才有轮询效果。而如果你使用curl这种工具进行访问VIP则可以每次都轮询,主要因为浏览器默认使用了keepalive,而curl没有使用,当然这是LVS的默认特性,详情请看LVS负载均衡—tcp keepalive问题分析?