前言
Nginx是服务器集群的网关, 在生产中有流量分发的作用; 另外它属于应用层的负载均衡(第七层), 可以对请求和响应作额外的代理操作, 比如: gzip, 添加响应头以支持跨域, 防盗链配置
为保证Nginx的高可用, 需要搭建Nginx集群, LVS的负载均衡是基于链路层(第四层), 只分发请求而不进行代理, 所以LVS的吞吐量是高于Nginx的, 适合为Nginx集群作负载均衡
服务器与ip规划
-
LVS一台: VIP(虚拟ip, 生产中应是公网ip): 192.168.209.150;
DIP(内网ip): 192.168.209.151
- Nginx2台, RIP(真实ip, 因被LVS负载均衡, 所以生产中处于内网): 192.168.209.222和 192.168.209.223
上述3个计算机节点关闭网络配置管理器,因为有可能会和网络接口冲突
systemctl stop NetworkManager
systemctl disable NetworkManager
LVS节点配置虚拟ip和负载均衡规则
配置虚拟ip
在LVS节点 (本案例为151节点)进入网卡配置目录
/etc/sysconfig/network-scripts
拷贝网卡, 创建子接口
cp ifcfg-ens33 ifcfg-ens33:1
修改子接口配置:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=cbebd981-2b3f-4271-812c-9b7d202ba714
DEVICE=ens33:1
ONBOOT=yes
IPADDR=192.168.209.150
GATEWAY=192.168.209.2
NETMASK=255.255.255.0
DNS1=114.114.114.114
注意改
DEVICE
和
IPADDR
即可
重启网络服务
service network restart
, 再执行
ip addr
, 查看虚拟ip是否添加成功
在云端, 阿里云不支持虚拟IP,需要购买他的负载均衡服务
腾讯云支持虚拟IP,但是需要额外购买,一台节点最大支持10个虚拟ip
用ipvsadm配置负载均衡规则
安装ipvsadm:
yum install ipvsadm
创建LVS节点,用户访问的集群调度者
ipvsadm -A -t 192.168.209.150:80 -s rr -p 5
各参数含义如下:
-A:添加集群
-t:tcp协议
ip地址:设定集群的访问ip,也就是LVS的虚拟ip
-s:设置负载均衡的算法,rr表示轮询
-p:设置连接持久化的时间
创建2台RS真实服务器
ipvsadm -a -t 192.168.209.150:80 -r 192.168.209.222:80 -g
ipvsadm -a -t 192.168.209.150:80 -r 192.168.209.223:80 -g
-a:添加真实服务器
-t:tcp协议
-r:真实服务器的ip地址
-g:设定DR模式
保存到规则库,否则重启失效
ipvsadm -S
查看集群列表:
ipvsadm -Ln
LVS持久化配置, 选做, 参考链接 LVS持久化配置
为两台Nginx配置虚拟ip和arp(响应级别和通告行为)
配置虚拟ip
在Nginx所在的真实服务器节点(以222为例),
/etc/sysconfig/network-scripts
复制 lo网卡
cp ifcfg-lo ifcfg-lo:1
,
vim ifcfg-lo:1
修改为如下:
DEVICE=lo:1
IPADDR=192.168.209.150
NETMASK=255.255.255.255
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
arp配置
vim /etc/sysctl.conf
配置所有网卡、默认网卡以及虚拟网卡的arp响应级别和通告行为,分别对应:all,default,lo:
# configration for lvs
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
增加一个网关,用于接收数据报文,当有请求到本机后,会交给lo去处理:
route add -host 192.168.209.150 dev lo:1
防止重启失效,做如下处理,用于开机自启动:
echo "route add -host 192.168.1.150 dev lo:1" >> /etc/rc.local
此时, 开启两台RS上的Nginx服务, 即可通过访问 LVS中配置的虚拟ip(150节点), 访问Nginx了
Keepalived +LVS 高可用
LVS单个节点宕机, 则所有Nginx都不可访问, 考虑Keepalived +LVS实现高可用
下面, 以151节点为例, 使用keepalived配置LVS主节点
安装Keepalived过程省略, 需要提示一点: 执行make编译前, 需要指定核心配置文件所在位置:
--prefix=/usr/local/keepalived --sysconf=/etc
keepalived注册为系统服务:
keepalived 注册为系统服务:
- 切换到路径 /home/software/keepalived-2.0.18/keepalived/etc
- 将自启动脚本复制到系统文件夹 cp init.d/keepalived /etc/init.d/
cp sysconfig/keepalived /etc/sysconfig/
- systemctl daemon-reload, 重加载系统服务
- 将keepalived作为系统服务启动, systemctl start keepalived.service
在 /etc/keepalived/ 下, 修改keepalived主配置文件如下
! Configuration File for keepalived
global_defs {
# 主机标识符,全局唯一
router_id keep_151
}
# 计算机节点实例
vrrp_instance VI_1 {
# MASTER, nginx 主节点
state MASTER
# 网卡名
interface ens33
virtual_router_id 151
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.209.150
}
}
# 配置集群地址访问的IP+端口, 端口和Nginx保持一致, 都是80
virtual_server 192.168.209.150 80 {
# 健康检查时间
delay_loop 6
# 负载均衡算法, 默认轮询
lb_algo rr
# 设置LVS的模式 NAT|TUN|DR
lb_kind DR
# 设置会话持久化时间
persistence_timeout 5
protocol TCP
# 负载均衡的RS
real_server 192.168.209.222 80 {
weight 1
# 设置健康检查
TCP_CHECK {
connect_port 80
# 检查的超时时间
connect_timeout 2
# 重试次数
nb_get_retry 3
# 间隔时间
delay_before_retry 3
}
}
real_server 192.168.209.223 80 {
weight 1
# 设置健康检查
TCP_CHECK {
connect_port 80
# 检查的超时时间
connect_timeout 2
# 重试次数
nb_get_retry 3
# 间隔时间
delay_before_retry 3
}
}
}
由于负载均衡规则已经由 keepalived定义了, 那我们可以清除 LVS此前定义的负载均衡规则
ipvsadm -C
启动或重启 keepalived服务
systemctl start keepalived
或
systemctl restart keepalived
执行
ipvsadm -Ln
, 查看 LVS负载均衡规则是否设置成功
151节点的配置完成了,152节点类似配置。访问192.168.209.150即可访问nginx
最后,150节点在生产环境应当是公网ip, 其他节点都是内网ip