准备
准备3台centos服务器172.20.x.40
,172.20.x.41
,172.20.x.42
作为一个LVS+nginx的负载集群,其中172.20.x.40
作为LVS-master,172.20.x.36.41
作为LVS-Backup;172.20.x.42
和172.20.x.44
作为nginx负载向后面业务服务器负载。
第一次接触lvs+nginx+keepalived的集群负载,好多不懂,中间折腾了好久,截图与实际的ip有些不符合,最终的集群服务信息如下
名称 | ip | 说明 | 备注 |
虚拟地址 | 172.20.36.222:81 | 对外的ip地址 | 虚拟的IP地址,注意不能与局域网中的IP地址重复 |
lvs-master | 172.20.36.41 | lvs主节点 | 真实IP地址,需要该机器上的keepalived配置端口,用于VIP的漂移 |
lvs-backup | 172.20.36.42 | lvs备节点 | 真实IP地址,需要该机器上的keepalived配置端口,用于VIP的漂移 |
nginx-01 | 172.20.36.43:81 | nginx节点01 | 真实IP地址,实现应用层的业务负载 |
nginx-02 | 172.20.36.44:81 | nginx节点02 | 真实IP地址,实现应用层的业务负载 |
一、环境配置
1. 防火墙
查看防火墙状态firewall-cmd --state
,对于运行的将防火墙关闭systemctl stop firewalld.service
,systemctl disablefirewalld.service
2.selinux设置
关闭每台服务器selinux,修改/etc/selinux/config
,将SELINUX由enforcing修改为disabled,重启服务器。
修改selinux的命令# sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
重启之后,查看服务器selinux状态sestatus -v
:
二、ipvs和keepalived安装及配置
1.LVS服务器上安装虚拟服务
1)ivps安装
在LVS-Master和LVS-Backup的服务器上安装ipvs,输入命令行:yum -y install ipvsadm
,安装完毕如下:
2)keepalived安装
在LVS-Master和LVS-Backup的服务器上安装keepalive,输入命令行:yum -y install keepalived
,如下:
2.配置
分别配置两台LVS服务器上的keepalive配置信息。
1)配置Master
配置LVS-Master上的keepalive配置,打开/etc/keepalived/keepalived.conf
,修改为以下配置:
! Configuration File for keepalived
global_defs {
router_id lvs01
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.20.36.222
}
}
virtual_server 172.20.36.222 81 {
delay_loop 6
lb_algo wrr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.20.36.43 81 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3
delay_before_retry 3
connect_port 81
}
}
real_server 172.20.36.44 81 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3
delay_before_retry 3
connect_port 81
}
}
}
2)配置Backup
打开/etc/keepalived/keepalived.conf
,修改为以下配置:
! Configuration File for keepalived
global_defs {
router_id lvs02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 100
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.20.36.222
}
}
virtual_server 172.20.36.222 81 {
delay_loop 6
lb_algo wrr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.20.36.43 81 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3
delay_before_retry 3
connect_port 81
}
}
real_server 172.20.36.44 81 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3
delay_before_retry 3
connect_port 81
}
}
}
3)Master和Backup的区别
配置说明:
==router_id ==设置当前节点的名称
==virtual_ipaddress == 设置了虚拟的IP地址172.20.36.100
开放端口81
,真实的两个LVS的IP地址为172.20.36.40
和172.20.36.41
,LVS开放端口80
以上示例的配置采用DR负载均衡和wrr负载调度算法。
3.ipvs简单介绍
1)三种的ip负载方式:
- VS/NAT (Virtual Server via Network Address Translation)
也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。
可以看出,在NAT方式下,用户请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈 - VS/TUN(Virtual Server via IP Tunneling)
也就是IP隧道技术实现虚拟服务器。它的连接调度和管理与VS/NAT方式一样,只是它的报文转发方法不同,VS/TUN方式中,调度器采用IP隧道技术将用户请求转发到某个Real Server,而这个Real Server将直接响应用户的请求,不再经过前端调度器,此外,对Real Server的地域位置没有要求,可以和Director Server位于同一个网段,也可以是独立的一个网络。因此,在TUN方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。 - VS/DR(Virtual Server via Direct Routing)
也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上,且真实服务器网络设备或设备别名不作 ARP 响应。
2)八种负载调度算法
- 轮叫(Round Robin)
调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。 - 加权轮叫(Weighted Round Robin)
调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。 - 最少链接(Least Connections)
调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。 - 加权最少链接(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。 - 基于局部性的最少链接(Locality-Based Least Connections)
“基于局部性的最少链接” 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。 - 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。 - 目标地址散列(Destination Hashing)
"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。 - 源地址散列(Source Hashing)
"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
三、启动LVS-Master和LVS-Backup上的ipvs服务和keepalived服务
1.ipvs启动
执行sudo lsmod |grep ip_vs
查看ipvs是否已经启动,若没有什么结果则需要启动ipvs,分别在机器172.20.36.40
和172.20.36.41
上执行启动命令启动ipvs,如下:
启动systemctl start ipvsadm.service
停止systemctl stop ipvsadm.service
重启systemctl restart ipvsadm.service
查看ipvs的状态systemctl status ipvsadm.service
查看状态如下,说明ipvs已经启动。
遇到一个启动错误时的日志:
最后查询一圈使用ipvsadm --save > /etc/sysconfig/ipvsadm
成功解决,启动成功:
2.keepalived启动
查看状态systemctl status keepalived
启动systemctl start keepalived
停止systemctl stop keepalived
重启systemctl restart keepalived
未执行启动前,查看状态:
执行启动命令后,查看状态:
keepalived的默认日志文件在/var/log/messages
下,有问题可以根据日志描述解决。
四、安装和配置nginx节点
1.nginx安装及配置
详细请查看 nginx的源码编译和安装。
2.配置nginx所有服务器的“路由”
根据上面描述,使用的虚拟IP为172.20.36.222
,需要再真实的nginx服务器上设置虚拟ip、关闭“ARP查询”功能和设置回环ip,执行下面的脚本即可:
#!/bin/bash
VIP=172.20.36.222
case "$1" in
start)
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
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
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP >/dev/null 2>&1
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 "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
我手边两台nginx的真实ip是172.20.36.43:81
和172.20.36.44:81
,需要在这两台机器上执行上面的脚本,执行完成后如下:
这一块在一开始测试的时候由于参考【参考链接】中的脚本,中间一行==/etc/rc.d/init.d/functinotallow==似乎并没有用,并且会报错,最后经过测试就删除了这句。
五、测试
到此为止我们已经搭建好了基于lvs+keepalived+nginx的集群负载,我们做一些测试,验证一下几个点:
1)VIP漂移和高可用
2)nginx可用性检测
1.VIP漂移
VIP漂移指的是当ipvs的主节点出现故障的时候,ipvs的备用节点在配置的时间内完成主备切换,对用户不可感知,并以邮件的方式通知管理员修复出现的故障,keepalived的配置就是用来解决这个问题的。
1)ipvs主备节点无故障时:
A. 主节点红色框,可用真实nginx负载节点绿色框
B. 主节点的网卡信息,红色为虚拟IP
C. 备用节点的网卡信息,并无上图红色框的内容,说明此时的master节点正常
D. 数据访问也正常
2)ipvs主节点故障时,发生VIP漂移
A. 关闭主节点上的keepalived服务制造故障
B. 查看主备用节点的网卡
主节点网卡信息
备用节点网卡信息
从上面两张图看,说明已经发生了VIP漂移,并且访问也正常
2.nginx可用性
制造一个nginx节点异常,将nginx01
节点网卡关闭。
直接访问正常,且返回的是节点2的ip和nginx名称
到此为止,lvs+nginx+keepalived的直连权重负载就配置完了。
六、番外篇
除了上面的配置之外,可以手动的去维护ipva集群信息,主要用于动态的负载一些配置。包括:
1)增删改ipvs虚拟服务地址
2)给虚拟服务地址增加新的nginx负载地址
1.添加ipvs集群服务
1)添加ipvs集群
查看 ipvsadm -ln
,在服务器172.20.36.40
上执行该命令,查看当前ipvs集群的状态,当前ipvs没有集群信息。如下:
执行ipvsadm -A -t 172.20.36.100:81 -s rr
添加一个ipvs集群节点,但是报了错,如下:
排查了很久,最后发现是因为中间修改过LVS的配置,虽然重启了LVS,但是并没有重启keepalived。调用重启keepalive的重启命令后重新加载虚拟IP时成功了:
其中,红色是重启指令,绿色是已经配置的两个LVS的主备地址。
2)给集群服务中添加真实服务
上一步骤中我们已经添加了ipvaadm的集群,现在我们需要将两个LVS-主备真实IP添加到虚拟集群中去,使用指令
ipvsadm -a -t 172.20.36.100:81 -r 172.20.36.40:80 -m -w 1
添加LVS01,ipvsadm -a -t 172.20.36.100:81 -r 172.20.36.41:80 -m -w 1
添加LVS02,没有错误提示说明已经添加成功,查看如下: