背景
为保证业务7*24小时不间断运行从而提供高效、稳定、可靠的信息化服务,前端采双Nginx+Keepalived,Nginx反向代理到后端文件集群实现负载均衡(Load Balancing),Keepalived实现集群高可用(High Available),主Nginx故障后虚拟IP自动漂移到备Nginx。
Nginx+Keepalived 高可用架构
主机清单
HOSTNAME | IP | MAC | VIP |
---|---|---|---|
nginx-m | 192.168.99.144/24 | 00:0c:29:ad:73:a1 | 192.168.99.146 |
nginx-s | 192.168.99.145/24 | 00:0c:29:a1:8e:14 | 192.168.99.146 |
文件服务器 | 192.168.99.107/24 |
Nginx
Nginx是一款轻量级的开源Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。
优点:
支持高并发连接:官方测试Nginx能够支撑5万并发连接,实际生产环境中可以 支撑2~4万并发连接数;
配置文件简洁;
占用内存少;
内部有健康检查功能;
支持Rewrite重写:可根据不同的域名、URL将请求转发至后端不同的服务群;
支持热部署;
稳定性高。
安装Nginx官方源
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
安装Nginx
#yum 安装nginx
yum install nginx -y
#查看nginx 版本
rpm -qa nginx
nginx-1.18.0-2.el7.ngx.x86_64
#查看nginx 安装位置
rpm -ql nginx
Nginx 配置文件(两台主机配置相同)
cat /etc/nginx/conf.d/nginx.conf
upstream webserver_file {
#ip_hash;
server 192.168.99.107:18686;
}
server {
listen 18686;
#server_name ;
location / {
proxy_pass http://webserver_file/software/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_send_timeout 60;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
运行Nginx
#启动nginx服务
systemctl start nginx
# 配置开机自启动
systemctl enable nginx
#关闭nginx服务
systemctl stop nginx
Nginx 测试
Keepalived
Keepalived 是集群管理中保证集群高可用的一个软件解决方案,其功能类似于heartbeat,用来防止单点故障。keepalived是以VRRP协议为实现基础的,VRRP全称VirtualRouter Redundancy Protocol,即虚拟路由冗余协议。虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip,master会发组播(组播地址为224.0.0.18),当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core 、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。同时为了避免出现脑裂,应关闭防火墙或者开启防火墙但允许接收VRRP协议。
选举算法
keepalived中优先级高的节点为MASTER。MASTER其中一个职责就是响应VIP的arp包,将VIP和mac地址映射关系告诉局域网内其 他主机,同时,它还会以多播的形式(目的地址224.0.0.18)向局域网中发送VRRP通告,告知自己的优先级。网络中的所有BACKUP节点只负责 处理MASTER发出的多播包,当发现MASTER的优先级没自己高,或者没收到MASTER的VRRP通告时,BACKUP将自己切换到MASTER状 态,然后做MASTER该做的事:1.响应arp包,2.发送VRRP通告。
安装keepalived
#yum 安装keepalived
yum install-y keepalived
#查看keepalived 版本
rpm -qa keepalived
keepalived-1.3.5-19.el7.x86_64
#查看keepalived 安装位置
rpm -ql keepalived
keepalived 主
[root@nginx-m keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lvs-nginx01
}
vrrp_script chknginx
{
script "/etc/keepalived/chknginx.sh"
interval 2
weight -20
}
vrrp_instance nginx-ha {
state MASTER
interface ens33
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.99.146
}
track_script {
chknginx
}
}
keepalived 备
[root@nginx-s keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lvs-nginx02
}
vrrp_script chknginx
{
script "/etc/keepalived/chknginx.sh"
interval 2
weight -20
}
vrrp_instance nginx-ha {
state BACKUP
interface ens33
virtual_router_id 100
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.99.146
}
track_script {
chknginx
}
}
vrrp_script
在Keepalived中,可以通过vrrp_script调用shell命令或一个脚本,通过该命令或脚本的返回值来判断监控的资源是否出问题。当返回值为0时,Keepalived认为被监控的资源正常;当返回值为非0时,Keepalived认为被监控的资源出现了问题。
weight 为正时,脚本检测成功时此weight会加到priority上,检测失败时不加;
主失败:
主 priority < 从 priority + weight 时会切换。
主成功:
主 priority + weight > 从 priority + weight 时,主依然为主
B:weight 为负时,脚本检测成功时此weight不影响priority,检测失败时priority – abs(weight);
主失败:
主 priority – abs(weight) < 从priority 时会切换主从
主成功:
主 priority > 从priority 主依然为主
vrrp_script 格式 参数
vrrp_script 自定义名称 {
script "命令或脚本"
interval 数字
fall 数字
rise 数字
}
vrrp_instance VRRP实例名 {
...
track_script {
vrrp_script的自定义名称
}
}
script:调用shell命令或脚本
interval:定义执行命令或脚本的时间间隔,单位秒
fall:定义检测失败的最大次数,如设置为2表示当请求失败两次时就认为节点资源故障
rise:定义请求成功的次数,如设置为1表示当进行一次请求成功后就认为节点资源恢复正常
vrrp_instance中的track_script:调用vrrp_script使之生效
keepalived 配置文件注释
nginx 检测脚本
第一种
cat chknginx.sh
#!/bin/bash
nginx=$(netstat -na|grep "LISTEN"|grep "18686"|wc -l)
if [ "${nginx}" -eq 0 ]; then
systemctl stop keepalived
killall keepalived
fi
第二种
#!/bin/bash
nginx=$(netstat -na|grep "LISTEN"|grep "18686"|wc -l)
if [ "${nginx}" -eq 0 ]; then
exit 1
else
exit 0
fi
添加脚本的执行权限
chmod a+x chknginx.sh
shell 判断参数
-eq //等于
-ne //不等于
-gt //大于 (greater )
-lt //小于 (less)
-ge //大于等于
-le //小于等于
命令的逻辑关系:在linux 中 命令执行状态:0 为真,其他为假
逻辑与:&&
第一个条件为假时,第二条件不用再判断,最终结果已经有;第一个条件为真时,第二条件必须得判断;逻辑或:||
逻辑非:!
运行keepalived
#启动keepalived服务
systemctl start keepalived
# 配置开机自启动
systemctl enable keepalived
#关闭keepalived服务
systemctl stop keepalived
抢占和非抢占模式
抢占模式
抢占模式,ip1的状态为MASTER,ip2的状态为BACKUP,不需要配置nopreempt非抢占标识,默认为抢占的模式。
非抢占模式
1、ip1的keepalived.conf中状态为MSASTER,ip2的keepalived.conf状态为BACKUP,且都需要配置nopreempt;当master宕机时,会自动飘到backup,但是当master恢复时,又会重新飘到master上。
2、ip1和ip2的状态都为BACKUP,且都配置了非抢占标识“nopreempt”,则会根据优先级来选举一个master,当master从故障中恢复后,不会抢占vip,避免了VIP切换造成的延迟。
主备切换测试
停止 nginx 服务后VIP 切换至备主机
备机验证VIP
终端查看MAC
arp -a
浏览器访问
Firewalld 防火墙
#添加keepalived 报文规则
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
#重载配置
firewall-cmd --reload
#查看规则
firewall-cmd --direct --get-all-rules
keepalived 日志
keepalived 默认的日志输出到/var/log/messages,自定义日志输出。
配置keepalived日志文件
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 0"
配置 rsyslog文件
vim /etc/rsyslog.conf
local0.* /var/log/keepalived.log
重启rsyslog服务
systemctl restart rsyslog
重启keepalived 服务
systemctl restart keepalived
查看keepalived日志
tail -f /var/log/keepalived.log
Zabbix 监控Keepalived VIP
keepalived vip 监测脚本
vim chkvip.sh
#!/bin/bash
vip=`ip add show ens33 |grep $1 -c`
if [ "${vip}" -eq 0 ]; then
echo 0
else
echo 1
fi
监控项
最新数据