1.前言
对于高并发的流量web架构,单纯的使用nginx是不够用的,nginx做七层代理需要处理数据,在大并发的情况下对主机资源的消耗就非常厉害了,所以此情况下就引入了lvs,使用lvs的四层转发功能,四层转发不需要处理数据只是tcp/udp协议进行端口对端口的数据转发,就算并发在大也不存在资源消耗大的问题,再通过多个nginx进行负载,就能很好的应对高并发的问题,在通过引入keepalived解决lvs单点问题,实现高可用
lvs的负载均衡可以实现后端检查,若是后端的某个nginx挂掉时,会将该nginx地址从负载均衡中剔除,当该nginx恢复后,又会将该地址加入到负载均衡中
lvs的网络模式使用DR模式,负载均衡策略使用rr轮询模式
2.架构
3.主机信息
name | ip | port | service |
A(主) | 10.1.60.115 | 80 | ipvs、keepalived |
B(备) | 10.1.60.118 | 80 | ipvs、keepalived |
C | 10.1.60.112 | 80 | nginx |
D | 10.1.60.114 | 80 | nginx |
VIP | 10.1.60.116 |
4.部署
所有主机关闭selinux与firewalld
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
以下操作在A、B主机上执行
安装keepalived服务
yum -y install keepalived
备份keepalived原配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
编辑keepalived配置文件
vi /etc/keepalived/keepalived.conf
A主配置文件
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id nginx01 #配置路由id,主和备的配置需要配置不同的id
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER #主需要设置为MASTER
interface ens160 #配置网卡,需要根据自己的真实网卡名称配置
virtual_router_id 51 #配置vrrp的路由id,主和备需要相同
priority 100 #配置权重值,备节点权重值需要低于MASTER节点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.60.116/24 #设置虚拟ip地址
}
}
virtual_server 10.1.60.116 80 { #配置虚拟ip地址和端口,用于接收转发请求
delay_loop 3 #定义检测真实服务器可用性的循环周期,单位为秒
lb_algo rr #配置负载均衡的访问策略,配置问轮询模式
lb_kind DR #配置ipvs使用的网络模式,配置为路由模式
persistence_timeout 0 #定义持久化连接的超时时间,单位为秒。持久化连接可以确保同一个客户端的多个请求都被转发到同一台真实服务器
protocol TCP #指定后端真实服务器的协议为 TCP
real_server 10.1.60.114 80 { #配置真实的地址和端口,即被负载的nginx地址和端口,用于将数据转发到该nginx上
weight 1 #配置权重,权重大的转发流量就多
HTTP_GET { #配置健康检查
url {
path /
status 200
}
connect_timeout 3 #配置检查超时时间
nb_get_retry 3 #定义在失败的情况下重新尝试的次数
delay_before_retry 3 #定义重新尝试之间的延迟时间,单位为秒
}
}
real_server 10.1.60.112 80 { ##配置真实的地址和端口,即被负载的nginx地址和端口,用于将数据转发到该nginx上
weight 1
HTTP_GET {
url {
path /
status 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
B备配置文件
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id nginx02 #更改id与主不一致
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP #更改为BACKUP
interface ens160
virtual_router_id 51
priority 90 #更改配置权重
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.60.116/24
}
}
virtual_server 10.1.60.116 80 {
delay_loop 3
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 10.1.60.114 80 {
weight 1
HTTP_GET {
url {
path /
status 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 10.1.60.112 80 {
weight 1
HTTP_GET {
url {
path /
status 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
启动keepalived服务并配置开机启动
systemctl start keepalived
systemctl enable keepalived
查看A主机地址
可以看到vip地址绑到了A主机上
以下操作在C、D主机上执行
安装nginx服务
yum -y install epel #通过epel的包去安装nginx
yum -y install nginx
更改nginx的默认页面
mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.bak
D主机则将C改为D即可
echo "this is C" >> /usr/share/nginx/html/index.html
启动nginx服务并配置开机启动
systemctl start nginx
systemctl enable nginx
新增虚拟网卡并配置为vip地址,用于返回数据,并且不会被用户访问到,lo虚拟网卡中的127.0.0.1就属于回环地址,不会被外部访问,参照lo虚拟网卡配置
cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo1
vi /etc/sysconfig/network-scripts/ifcfg-lo1
DEVICE=lo:1 #网卡修改名称
IPADDR=10.1.60.116 #配置为vip地址
NETMASK=255.255.255.255 #更改为32位子网掩码
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
重启网络服务
systemctl restart network
ip add
添加路由
route add -host 10.1.60.116 dev lo:1 #若是需要删除将add替换为del即可
查看路由
route -n
配置arp响应与通告
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
使配置生效
sysctl -p
在A、B主机上执行以下命令
安装ipvsadm工具
yum -y install ipvsadm
查看ipvs规则
ipvsadm -Ln
可以看到ipvs规则中显示10.1.60.116:80地址通过rr轮询负载到后端的10.1.60.112:80、10.1.60.114:80两个nginx地址中
5.测试
访问vip地址和端口看看是否能正常转发到后端的两个nginx中
curl 10.1.60.116
可以看到访问 vip地址是可以正常轮询访问到后端的两个nginx中
再来测试一下lvs的负载均衡健康检测功能
将C主机的nginx 80监听端口更改为81
vi /etc/nginx/nginx.conf
优雅重载nginx配置文件
nginx -s reload
查看A、B主机的keepalived状态与ipvs规则
systemctl status keepalived
ipvsadm -Ln
可以看到lvs检测到C主机的nginx 80端口有问题就把C主机节点从负载均衡中剔除了
我们现在把C主机的nginx81端口恢复回80端口看看是否会重新加入负载均衡列表
nginx -s reload
查看keepalived状态和ipvs规则
systemctl status keepalived
ipvsadm -Ln
可以看到C主机的80端口恢复后,lvs将该节点恢复到了负载均衡列表中
再来测试一下keepalived的高可用
将A主机的keepalived服务停止
systemctl stop keepalived
查看B主机的keepalived服务状态
systemctl status keepalived
ip add |grep ens160
测试访问vip地址