1、使用Keepalived程序让nginx高可用
下载:https://www.keepalived.org/download.html
上传到服务器
解压:tar -zxvf keepalived-2.0.18.tar.gz
然后就安装三部曲,./configure、make、make install
打开配置文件
vim keepalived.conf
global_defs {
# 路由id:当前安装keepalived的节点主机标识符,保证全局唯一
router_id keep_171
}
vrrp_instance VI_1 {
# 表示状态是MASTER主机还是备用机BACKUP
state MASTER
# 该实例绑定的网卡 #查看网卡名称 ip addr
interface ens33
# 保证主备节点一致即可
virtual_router_id 51
# 权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
priority 100
# 主备之间同步检查时间间隔,单位秒
advert_int 2
# 认证权限密码,防止非法节点进入
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟出来的ip,可以有多个(vip)
virtual_ipaddress {
192.168.1.161
}
}
启动
./keepalived
注册为系统服务
在keepalived下有个etc目录的,进入去
cp init.d/keepalived /etc/init.d/
cp sysconfig/keepalived /etc/sysconfig/
systemctl start keepalived.service
2、keepalived也可能崩的,也需要主备
配置备
global_defs {
router_id keep_172
}
vrrp_instance VI_1 {
# 备用机设置为BACKUP
state BACKUP
interface ens33
virtual_router_id 51
# 权重低于MASTER
priority 80
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
# 注意:主备两台的vip都是一样的,绑定到同一个vip
192.168.1.161
}
}
增加Nginx重启检测脚本
vim /etc/keepalived/check_nginx_alive_or_not.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
# 判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
# 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
增加运行权限
chmod +x /etc/keepalived/check_nginx_alive_or_not.sh
配置keepalived监听nginx脚本
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive_or_not.sh"
interval 2 # 每隔两秒运行上一行脚本
weight 10 # 如果脚本运行失败,则升级权重+10
}
在 vrrp_instance 中新增监控的脚本
track_script {
check_nginx_alive # 追踪 nginx 脚本
}
重启Keepalived使得配置文件生效
systemctl restart keepalived
3、双主热备
规则:以一个虚拟ip分组归为同一个路由
![](https://img.haomeiwen.com/i11311593/907202f2f566e43e.png)
主节点配置:
global_defs {
router_id keep_171
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.161
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.162
}
}
备节点配置
global_defs {
router_id keep_172
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.161
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.162
}
}
4、LVS
一般不会直接使用keepalived直接作用在nginx上,而是keepalived+LVS+Nginx实现高可用。
LVS 基于四层,工作效率高
单个Nginx承受不了压力,需要集群
LVS 充当Nginx集群的调度者
Nqinx 接受请求来回,LVS可以只接受不响应
![](https://img.haomeiwen.com/i11311593/86b731797086a771.png)
![](https://img.haomeiwen.com/i11311593/fd478fecd268de06.png)
![](https://img.haomeiwen.com/i11311593/f2e6cd3b94cd7c1a.png)
5、前期准备:
服务器与ip规划:
LVS - 1台
VIP(虚拟IP):192.168.1.150
DIP(转发者IP/内网IP):192.168.1.151
Nginx - 2台(RealServer)
RIP(真实IP/内网IP):192.168.1.171
RIP(真实IP/内网IP):192.168.1.172
所有计算机节点关闭网络配置管理器,因为有可能会和网络接口冲突:
systemctl stop NetworkManager
systemctl disable NetworkManager
创建子接口
cd /etc/sysconfig/network-scripts/
#数字可以是其他,只是随便起个别名
cp ifcfg-ens33 ifcfg-ens33:1
修改子接口配置: vim ifcfg-ens33:1,保留这些即可
BOOTPROTO="static"
DEVICE="ens33:1"
ONBOOT="yes"
IPADDR=192.168.1.150 #虚拟IP
NETMASK=255.255.255.0
service network restart
安装集群管理工具
yum install ipvsadm
6、搭建LVS-DR模式- 为两台RS配置虚拟IP
#这个文件上网查一查
cp ifcfg-lo ifcfg-lo:1
修改为
DEVICE=lo:1
IPADDR=192.168.1.150
NETMASK=255.255.255.255
NETWORK=127.0.0.1
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
service network restart
另一台
cp ifcfg-lo ifcfg-lo:1
修改为
DEVICE=lo:1
IPADDR=192.168.1.150
NETMASK=255.255.255.255
NETWORK=127.0.0.1
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
这样两台虚拟ip都构建好了
7、搭建LVS-DR模式- 为两台RS配置arp
ARP响应级别与通告行为的概念
- arp-ignore:ARP响应级别(处理请求)
只要本机配置了ip,就能响应请求
请求的目标地址到达对应的网络接口,才会响应请求 - arp-announce:ARP通告行为(返回响应)
本机上任何网络接口都向外通告,所有的网卡都能接受到通告
尽可能避免本网卡与不匹配的目标进行通告
只在本网卡通告
打开sysctl.conf:
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.1.150 dev lo:1
route -n
开机自启
echo "route add -host 192.168.1.150 dev lo:1" >> /etc/rc.local
8、搭建LVS-DR模式- 使用ipvsadm配置集群规则
创建LVS节点,用户访问的集群调度者
ipvsadm -A -t 192.168.1.150:80 -s rr -p 5
-A:添加集群
-t:tcp协议
ip地址:设定集群的访问ip,也就是LVS的虚拟ip
-s:设置负载均衡的算法,rr表示轮询
-p:设置连接持久化的时间
创建2台RS真实服务器
ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.171:80 -g
ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.172:80 -g
-a:添加真实服务器
-t:tcp协议
-r:真实服务器的ip地址
-g:设定DR模式
保存到规则库,否则重启失效
ipvsadm -S
检查集群
查看集群列表
ipvsadm -Ln
查看集群状态
ipvsadm -Ln --stats
其他命令:
# 重启ipvsadm,重启后需要重新配置
service ipvsadm restart
# 查看持久化连接
ipvsadm -Ln --persistent-conn
# 查看连接请求过期时间以及请求源ip和目标ip
ipvsadm -Lnc
# 设置tcp tcpfin udp 的过期时间(一般保持默认)
ipvsadm --set 1 1 1
# 查看过期时间
ipvsadm -Ln --timeout
#更详细的帮助文档
ipvsadm -h
man ipvsadm
至此,已经实现单个LVS+两个Nginx,但这样LVS还是有可能崩的,所以LVS要配置主备
9、Keepalived+LVS,主配置
修改Keepalived的配置文件
global_defs {
router_id LVS_151
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 41
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.150
}
}
#配置集群地址访问的IP+端口,端口和nginx保持一致,都是80
virtual server 192.168.1.150 80 {
# 健康检查的时问,单位:秒
delay_loop 6
#配置负载均衡的算法,默认是轮询
lb_algo rr
# 设置LVS的模式 NAT | TUN | DR
lb_kind DR
# 设置会话持久化的事件
persistence_timeout 5
#协议 -t
protocol TCP
#负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址
real_server 192.168.1.171 80 {
#轮询的默认权重配比设置为1
weight 1
#设置健康检查
TCP_CHECK {
#检查的80端口
connect_port 80
#超时时间
connect_timeout 2
# 重试次数 2次
nb_get_retry 2
# 间隔时间 3秒
delay_before_retry 3
}
}
real_server 192.168.1.172 80 {
weight 1
#设置健康检查
TCP_CHECK {
#检查的80端口
connect_port 80
#超时时间
connect_timeout 2
# 重试次数 2次
nb_get_retry 2
# 间隔时间 3秒
delay_before_retry 3
}
}
}
清空规则
ipvsadm -C
重启
systemctl restart keepalived
10、Keepalived+LVS,备配置
修改Keepalived的配置文件
global_defs {
router_id LVS_152
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 41
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.150
}
}
#配置集群地址访问的IP+端口,端口和nginx保持一致,都是80
virtual server 192.168.1.150 80 {
# 健康检查的时问,单位:秒
delay_loop 6
#配置负载均衡的算法,默认是轮询
lb_algo rr
# 设置LVS的模式 NAT | TUN | DR
lb_kind DR
# 设置会话持久化的事件
persistence_timeout 5
#协议 -t
protocol TCP
#负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址
real_server 192.168.1.171 80 {
#轮询的默认权重配比设置为1
weight 1
#设置健康检查
TCP_CHECK {
#检查的80端口
connect_port 80
#超时时间
connect_timeout 2
# 重试次数 2次
nb_get_retry 2
# 间隔时间 3秒
delay_before_retry 3
}
}
real_server 192.168.1.172 80 {
weight 1
#设置健康检查
TCP_CHECK {
#检查的80端口
connect_port 80
#超时时间
connect_timeout 2
# 重试次数 2次
nb_get_retry 2
# 间隔时间 3秒
delay_before_retry 3
}
}
}
清空规则
ipvsadm -C
重启
systemctl restart keepalived
网友评论