Nginx、LVS都可以作为负载均衡来使用,还有一款负载均衡HAProxy也很流行。LVS和HAProxy在OSI模型中属于第四层负载均衡,而Nginx属于第七层负载均衡,三者的优缺点可以参考:
Nginx、LVS及HAProxy负载均衡软件的优缺点详解
【前言】
一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术。具体的应用需求还得具体分析,如果是中小型的Web应用,比如日PV小于1000万,用Nginx就完全可以了;如果机器不少,可以用DNS轮询,LVS所耗费的机器还是比较多的;大型网站或重要的服务,且服务器比较多时,可以考虑用LVS
本文主要讲解lvs+nginx共同使用下达到负载均衡实现高可用。其中keepalived是必不缺少的角色。另外想了解如何配置keepalived+nginx及keepalived是什么,可以参考:nginx+keepalived高可用 。
LVS是什么及LVS有哪几种模式?可以参考:LVS 工作模式以及工作原理
接下来讲解下LVS下的DR模式,即主流模式nginx+keepalived+lvs(DR)的配置全过程:整个逻辑参考下图:
1、找两台主机作为LVS服务器,一个是主DR(IP:192.168.1.139),一个是备DR(IP:192.168.1.134),安装ipvsadm
# yum install ipvsadm
2、在两台DR上配置虚拟IP
# ifconfig eth0:1 192.168.1.200/24
3、在两台DR上安装Keepalived
# yum install Keepalived
4、编辑配置两台DR上的keepalived.conf文件,编辑之前,需要备份:# cp –a keepalived.conf backup. keepalived.conf
,
帮助手册:# man keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost #发送提醒邮件的目标地址可有多个
}
notification_email_from test@localhost #发送邮件的from地址,可以随意写,邮件地址不存在都无所谓
smtp_server 127.0.0.1 #邮件服务的地址,一般写本地
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP #MASTER 主 和 从
interface eth0 #VIP需要绑定的网卡名称
virtual_router_id 51
priority 101 #优先级,主的优先级要高
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200/24 dev eth0 label eth0:0 #设置VIP
}
}
virtual_server 192.168.1.200 80 {#设置虚拟lvs服务,VIP PORT
delay_loop 6
lb_algo rr #调度算法wrr
lb_kind DR #lvs的模式
nat_mask 255.255.255.0
persistence_timeout 50 #同一个IP地址在50秒内lvs转发给同一个后端服务器
protocol TCP
real_server 192.168.1.139 80 {#设置真实服务器的心跳机制 RID PORT
weight 1 #权重
HTTP_GET { #心跳检测的方式
url {
path / #心跳检查的地址
status_code 200 #心跳检查返回的状态
}
connect_timeout 2 #超时时间
nb_get_retry 3 #重复检查3次
delay_before_retry 1 #每隔1秒钟再次检查
}
}
real_server 192.168.1.134 80 {#第二个真实服务器设置
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 1
}
}
}
注意两台DR服务器的keepalived.conf文件,配置除了state(一个是MASTER,一个是BACKUP)及priority(MATSTER的优先级要高),其他保持一致即可。
5、配置DR模式:准备多台设备作为真实服务器,即web层,假设为nginx1和nginx2,并且已经配置了tomcat。设置2台IP:
# ifconfig eth0 192.168.1.137
# ifconfig eth0 192.168.1.138
6、在nginx1和nginx2上修改报文源IP的设置,需要设置内核参数
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
6、在nginx1和nginx2上,设置网卡的别名IP:192.168.1.200
# ifconfig lo:0 192.168.1.200 netmask 255.255.255.255 broadcast 192.168.1.200
注意:255.255.255.255是错误格式的子网掩码,它的好处是192.168.1.200永远不会对外通信。
7、在nginx1和nginx2上,添加一个路由
# route add -host 192.168.1.200 dev lo:0
8、在2台DR主机上也需要加一个路由设置:
# route add -host 192.168.1.200 dev eth0:1
9、在2台DR主机上使用ipvsadm添加集群服务
# ipvsadm –C
# ipvsadm -A -t 192.168.1.200:80 -s wlc
# ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.137 -g -w 1
# ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.138 -g -w 1
10、测试
1、检查keeplived,web服务器是否全部启动
2、输入http://192.168.1.200是否通信成功
3、kill掉一台web服务器,继续请求http://192.168.1.200是否通信成功
番外:DR模式配置脚本
#!/bin/bash
#description : start realserver
VIP=192.168.1.200
/etc/rc.d/init.d/functions
case "$1" in
start)
echo " start LVS of REALServer"
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
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS Directorserver"
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