LVS负载均衡—基于Keepalived做高可用

备注:开通虚拟IP时,一定备注清楚作为LVS使用,系统底层要进行一些策略
的配置
一、架构
先看看:高可用软件keepalived详解
Lvs+Keepalived的基本使用架构如下图如下:

当然,我们这里就没有必要一整套都实现下来,我们主要做的就是LVS+Keepalived实验,
所以我们只需要2台LVS+Keepalived(DR模式),2台WEB即可测试即可,基本 信息如下:
Lvs+Keepalived Master的IP地址为:172.28.16.140
Lvs+Keepalived Backup的IP地址为:172.28.16.146
Lvs+Keepalived VIP地址为:172.28.16.235
WEB01的IP地址为:172.28.16.138
WEB02的IP地址为:172.28.16.149
二、实施方案
1.Lvs+Keepalived Master配置
#配置DIP
ifconfig eth0 172.28.16.140 netmask 255.255.255.0
#安装keepalived和ipvsadm。
yum install keepalived
yum install ipvsadm
yum install -y nc
#配置Keepalived
#Keepalived 配置文件路径:/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected] #设置报警邮件地址,可以设置多个,每行一个。
[email protected] #需开启本机的sendmail服务
[email protected]
}
notification_email_from [email protected] #设置邮件的发送地址
smtp_server 127.0.0.1 #设置smtp server地址
smtp_connect_timeout 30 #设置连接smtp server的超时时间
router_id LVS_DEVEL #表示运行keepalived服务器的一个标识。发邮件时显示在邮件主题的信息
}
vrrp_instance VI_1 {
state MASTER #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此
主机是备用服务器
interface eno0 #指定HA监测网络的接口
virtual_router_id 51 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。
即同一vrrp_instance下,MASTER和BACKUP必须是一致的
priority 100 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,
MASTER的优先级必须大于BACKUP的优先级
advert_int 1 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置验证类型和密码
auth_type PASS #设置验证类型,主要有PASS和AH两种
auth_pass 1111 #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相
同的密码才能正常通信
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
172.28.16.235
}
}
virtual_server 172.28.16.235 1181 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之
间用空格隔开
delay_loop 6 #设置运行情况检查时间,单位是秒
lb_algo rr #设置负载调度算法,这里设置为rr,即轮询算法
lb_kind DR #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
nat_mask 255.255.255.0
persistence_timeout 50 #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,
为集群系统中的session共享提供了一个很好的解决方案。
#有了这个会话保持功能,用户的请求会被一直分发到某个服务节
点,直到超过这个会话的保持时间。
#需要注意的是,这个会话保持时间是最大无响应超时时间,也就
是说,用户在操作动态页面时,如果50秒内没有执行任何操作
#那么接下来的操作会被分发到另外的节点,但是如果用户一直在
操作动态页面,则不受50秒的时间限制
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 172.28.16.138 1181 { #配置服务节点1,需要指定real server的真实IP地址和端口,
IP与端口之间用空格隔开
weight 1 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越
高,设置权值大小可以为不同性能的服务器
#分配不同的负载,可以为性能高的服务器设置较高的权值,而为
性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源
TCP_CHECK { #realserver的状态检测设置部分,单位是秒
connect_timeout 3 #表示3秒无响应超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
connect_port 1181
}
}
real_server 172.28.16.149 1181 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 1181
}
}
}#
UDP
virtual_server 172.28.16.235 35688 {
delay_loop 30
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
#persistence_timeout 50
protocol UDP
real_server 172.28.16.143 35688 {
weight 100
MISC_CHECK {
misc_path “/etc/keepalived/udp_check.sh 172.28.16.143 35688”
misc_timeout 10
}
}
}
keepalived支持的健康检测方式有:HTTP_GET|SSL_GET、TCP_CHECK、SMTP_CHECK、MISC_CHECK
由于keepalived自身并不支持udp检测,有TCP_CHECK但是没有UDP_CHECK,所以这里只能使用
MISC_CHECK混合检测方式调用外部脚本来对udp协议进行健康检测。
#编写UDP服务检测脚本

vim /etc/keepalived/udp_check.sh

#!/bin/bash
nc -unvz -w 1 $1 $2 2>&1 | grep successfully &> /dev/null
exit $?
(每台主机nc 别的ip返回结果可能不同,nc –unvz –w 1 ip port 试下看看)
#把同样的配置复制一份到BACKUP主机,只需要改两个参数即可:
state BACKUP
priority 5
参考 https://blog.csdn.net/simonchi/article/details/79957011
2.Lvs+Keepalived Slave配置
#配置DIP。
ifconfig eth0 172.28.16.146 netmask 255.255.255.0
#先需要安装keepalived和ipvsadm
yum install keepalived
yum install ipvsadm
yum install -y nc

启动keepalived(web服务配置启动成功后再来查看映射情况)

service keepalived start
或者
systemctl startkeepalived

通过ipvsadm –Ln 命令查看VIP是否能成功映射到web服务

通过 ip addr 查看虚IP是否配置成功

如果失败了,可通过/var/log/messages日志定位keepalived启动失败的原因

3.WEB01(RealServer)配置
#设置RIP地址。
ifconfig eth0 172.28.16.138 netmask 255.255.255.0
#分别在两个web服务器执行以下脚本:realserver.sh
#!/bin/bash
#./etc/init.d/functions

description :Config realserver

VIP=172.28.16.235
case “$1” in
start)
echo “start LVS of Realserver DR mode”
#在loopback上设置VIP地址只用于响应数据包
/sbin/ifconfig lo:0 ${VIP} netmask 255.255.255.255 broadcast ${VIP} up
#设置路由策略如果目标地址访问的是VIP那么响应地址就设为lo:0的地址。
route add -host ${VIP} dev lo
#调整网卡响应机制
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
;;
stop)
/sbin/ifconfig lo:0 ${VIP} netmask 255.255.255.255 down
route del -host ${VIP} dev lo
echo “stop LVS of Realserver DR mode”
echo “0” >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo “0” >/proc/sys/net/ipv4/conf/lo/arp_announce
echo “0” >/proc/sys/net/ipv4/conf/all/arp_ignore
echo “0” >/proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo “Usage: $0 {start|stop}”
exit 1
esac

启动命令:

./realserver.sh start
#安装nginx,修改端口为:1181

nginx 配置文件路径:/etc/nginx/nginx.conf

yum install nginx
nginx
echo 172.29.32.202 > /usr/share/nginx/html/index.html

执行ip addr查看VIP是否绑定成功

4.WEB02(RealServer)配置
#设置RIP地址。
ifconfig eth0 172.28.16.149 netmask 255.255.255.0

复制文件到:/home/lvs/

启动命令:

./realserver.sh start
#安装nginx
yum install nginx
nginx
echo 172.28.16.149 > /usr/share/nginx/html/index.html

备注

UDP协议需要额外执行如下操作:
在RealServer 配置iptables
不同RealServer的IP地址不同,请根据实际情况修改,差异化的
–172.28.16.143:RealServer服务器IP
–172.28.16.235/32:虚拟VIP
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A PREROUTING -d 172.28.16.235/32 -p udp -m udp --dport 35688 -j DNAT –
to- 172.28.16.143

http://tangay.iteye.com/blog/1128084
那么UDP的服务呢?
非常令人失望,客户端通过公网ip–61.147.xxx.xxx连接udpserver,并不能得到正确回应。
这是为什么呢?我们来分析一下过程:

经过wireshark和tcpdump,分析得出通讯的过程如下:

cleint—>Client NAT—61.147.xxx.xxx---->Server NAT---->VIP(172.19.1.19)----->RealServer----->Server NAT------>Client NAT—>Client

在NAT 地址映射中:

172.19.1.19<------>61.147.xxx.xxx

但是RealServer(172.19.1.15或者172.19.1.16)却是对应了别的公网ip。

所以客户端的NAT接受到一个非61.147.xxx.xxx发过来的UDP包时,会把它丢弃掉,这样client就收不到任何东西了。

解决方案:
用iptables的NAT和DNAT

在RealServer1(172.19.1.15)上用iptables添加

iptables -t nat -A PREROUTING -d 172.19.1.19/32 -p udp -m udp --dport 3478 -j DNAT --to-destination 172.19.1.15

iptables -t nat -A POSTROUTING -p udp -m udp --sport 3478 -j SNAT --to-source 172.19.1.19

意思就是:
1 收到目的端口为3478的udp,且目的地址为172.19.1.19的包,把目的地址改为172.19.1.15,以便应用程序turnserver处理,因为turnserver绑定的地址172.19.1.15。
2 往外发出源端口为3478的udp包,源地址都被改成172.19.1.19,这样server nat就会把地址映射为61.147.xxx.xxx,这样client NAT就会就收这个udp包了。

在RealServer2(172.19.1.16)上用iptables添加

iptables -t nat -A PREROUTING -d 172.19.1.19/32 -p udp -m udp --dport 3478 -j DNAT --to-destination 172.19.1.16

iptables -t nat -A POSTROUTING -p udp -m udp --sport 3478 -j SNAT --to-source 172.19.1.19

然后测试,发现udp服务可以正常使用啦。

5.测试效果
#可以使用客户端访问172.16.16.1查看轮询访问变化,如下:
curl http://172.28.16.235:1181
172.28.16.138
curl http://172.28.16.235:1181
172.28.16.149
curl http://172.28.16.235:1181
172.28.16.138
#或者使用ab压力测试访问172.28.16.235:1181查看加权轮询变化
ab -n 1000 -c 100 http://172.28.16.235:1181
#测试LVS的高可用
手动断掉Master节点的keepalived服务,测试业务是否正常
#测试keepalived对web服务的监控检测
关闭其中一个web服务节点,通过ipvsadm -L查看VIP映射关系中是否剔除该节点
#查看当前连接数
ipvsadm -L -n -c
#通过当前连接数,可以看出连接协议,以及tcp keepalive的剩余时间和状态信息。 还有源和目标IP以及虚拟
IP。
最后,还可以更改RealServer的权重,再使用AB压力测试一下,看看统计信息是否跟 权重调整
的对比。
PS:你在测试过程中,当LVS调度算法使用轮询或加权轮询默认时,如果你使用浏览 器(同一个
IP)访问VIP,可能会出现跟你想象的轮询调度不一样的结果,那就是一直 刷新网页却无法轮询,
每次都需要等待2分钟才有轮询效果。而如果你使用curl这种工 具进行访问VIP则可以每次都轮
询,主要因为浏览器默认使用了keepalive,而curl没有 使用,当然这是LVS的默认特性,详情请
看LVS负载均衡—tcp keepalive问题分析?
附录:
1、iptables操作说明
参考地址:http://www.cnblogs.com/love3556/p/5923392.html

service iptables save

The service command supports only basic LSB actions (start, stop, restart, try-restart, reload,
force-reload, status). For other actions, please try to use systemctl.
With RHEL 7 / CentOS 7, firewalld was introduced to manage iptables. IMHO, firewalld is more suited
for workstations than for server environments.
It is possible to go back to a more classic iptables setup. First, stop and mask the firewalld service:
systemctl stop firewalld
systemctl mask firewalld
Then, install the iptables-services package:
yum install iptables-services
Enable the service at boot-time:
systemctl enable iptables
Managing the service
systemctl [stop|start|restart] iptables
Saving your firewall rules can be done as follows:
service iptables save
or
/usr/libexec/iptables/iptables.init save
二:附件
keepalived.conf 如下:

! 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 BACKUP
interface eth0
virtual_router_id 235
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
#VIP 虚拟IP
172.28.20.234
}
}

virtual_server 172.28.20.233 35688 {
delay_loop 5
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
#persistence_timeout 50
protocol UDP
real_server 172.28.16.143 35688 {
weight 100
MISC_CHECK {
misc_path “/etc/keepalived/udp_check.sh 172.28.20.233 35688”
misc_timeout 10
}
}
}

virtual_server 172.28.16.235 8080 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 172.28.16.143 8080 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 8080
}
}
}

realserver.sh 如下:
#!/bin/bash
#./etc/init.d/functions

description :Config realserver

VIP=172.28.16.235

case “$1” in
start)
echo “start LVS of Realserver DR mode”
/sbin/ifconfig lo:0 ${VIP} netmask 255.255.255.255 up
route add -host ${VIP} dev lo
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
;;
stop)
/sbin/ifconfig lo:0 ${VIP} netmask 255.255.255.255 down
route del -host ${VIP} dev lo
echo “stop LVS of Realserver DR mode”
echo “0” >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo “0” >/proc/sys/net/ipv4/conf/lo/arp_announce
echo “0” >/proc/sys/net/ipv4/conf/all/arp_ignore
echo “0” >/proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo “Usage: $0 {start|stop}”
exit 1
esac

udp_check.sh 如下:

vim /etc/keepalived/UDP_CHECK.sh

#!/bin/bash
nc -unvz -w 1 $1 $2 2>&1 | grep successfully &> /dev/null
exit $?

注:下面这个暂时没发现用处,先存着
vi /etc/sysctl.conf
添加: net.ipv4.ip_forward=1

以上实验均是在centos7以上系统实验,centos6系统暂未成功

猜你喜欢

转载自blog.csdn.net/qq_21860077/article/details/83107144