使用 keepalived配置虚拟ip(VIP):https://blog.csdn.net/Jason160918/article/details/100101791
Nginx主从热备参考:https://www.cnblogs.com/youzhibing/p/7327342.html
使用集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力、存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求。这种情况下,更恰当的做法是增加一台服务器分担原有服务器的访问及存储压力。通过负载均衡调度服务器,将来自浏览器的访问请求分发到应用服务器集群中的任何一台服务器上,如果有更多的用户,就在集群中加入更多的应用服务器,使应用服务器的负载压力不再成为整个网站的瓶颈。我们使用应用服务器集群来保证服务的高可用,Nginx作为负载均衡的中间件,但如果nginx服务宕机,应用集群将不可用。所以我们如何保证Nginx服务的高可用呢?今天我们来探讨一下keepalived实现Nginx的主从热备。
今天和运维同事讨论了一下生产环境的nginx实践。生产应用服务用的F5 + 2台相同配置的Nginx集群做的负载均衡和反向代理。那既然F5已经实现了负载均衡,为什么还有必要再加一层的Nginx呢。我们在什么时候需要用Nginx集群,什么时候该用主从热备呢?以下是基于我的一些思考:
如果你本地有两台虚拟机了。可以跳过安装步骤。
$ yum install -y net-tools
查看【虚拟机1】的ifconfig:
查看【虚拟机2】的ifconfig:
可以看到,两台虚拟机在网卡2(enp0s8),Host-Only模式下,其ip地址和主机已经是在同一网段,可以通信了。
$ yum install -y keepalived
我们还需要在虚拟机安装jdk,在104和 102 分别启动1个web服务。
# 这是下载包的地址,具体安装教程网上有很多,我就不罗列了
$ wget http://nginx.org/download/nginx-1.6.2.tar.gz
分别添加如下配置到nginx.conf
nginx1 (192.168.56.104)
nginx2 (192.168.56.102)
验证完成,现在两台Nginx都已经完成了负载均衡。我们继续~
我们理论上应该有4台服务器,分别用来部署nginx1、nginx2 和 web1、web2。但我只有2台。我在这两台虚拟机(192.168.56.104、192.168.56.102)分别部署一个Nginx和一个web服务。
正常情况下是nginx1作为负载均衡,分别向web1,web2分发请求。如果nginx1所在服务器宕机 或者 keepalavid 挂掉或者 keepalived 不能把Nginx服务重新唤起,那nginx2将取代nginx1,继续保证服务可用。直到nginx1恢复。
192.168.56.104 # nginx1(主) + web1
192.168.56.102 # nginx2(备) + web2
keepalived的安装本文就不讲述了,具体可参考:主从热备+负载均衡(LVS + keepalived)
keepalived作用其实在第一张图中已经有所体现,主要起到两个作用:实现VIP到本地ip的映射; 以及检测nginx状态。
master(虚拟机1,192.168.56.104)上的keepalived.conf内容如下:
$ vim /etc/keepalived/keepalived.conf
global_defs {
script_user root # 这两行很重要。否则执行不到检测脚本
enable_script_security
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server smtp.hysec.com
smtp_connection_timeout 30
router_id nginx_master # 设置nginx master的id,在一个网络应该是唯一的
}
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx_pid.sh" #最后手动执行下此脚本,以确保此脚本能够正常执行
interval 2 #(检测脚本执行的间隔,单位是秒)
weight 2
}
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
interface enp0s8 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
virtual_router_id 66 # 虚拟路由编号,主从要一致
priority 100 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port #(调用检测脚本)
}
virtual_ipaddress {
192.168.56.200 # 定义虚拟ip(VIP),与我主机及虚拟机在同一网段。可多设,每行一个
}
}
backup(虚拟机2,192.168.56.102)上的keepalived.conf内容如下:
$ vim /etc/keepalived/keepalived.conf
global_defs {
script_user root # 这两行很重要。否则执行不到检测脚本
enable_script_security
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server smtp.hysec.com
smtp_connection_timeout 30
router_id nginx_backup # 设置nginx backup的id,在一个网络应该是唯一的
}
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx_pid.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备
interface enp0s8 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
virtual_router_id 66 # 虚拟路由编号,主从要一直
priority 99 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port #(调用检测脚本)
}
virtual_ipaddress {
192.168.56.200 # 定义虚拟ip(VIP),与我主机及虚拟机在同一网段。可多设,每行一个
}
}
nginx检测脚本 /usr/local/src/check_nginx_pid.sh 内容如下:
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx #重启nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败
systemctl stop keepalived.service #重启失败就杀掉keepalived服务。
else
exit 0
fi
else
exit 0
fi
keepalived 配置 Nginx 检测脚本的意义:
添加执行权限
$ chmod +x check_nginx_pid.sh
启动keepalived
$ systemctl start keepalived.service # 启动keepalived服务
$ systemctl enable keepalived.service # 设置开机启动
查看keepalived启动后。配置的虚拟ip(virtual ip)是否生效
# 着重说明一下:
1. 这个enp0s8是虚拟机查看 ifconfig 时显示的网卡。
2. 在这个网卡下虚拟机的ipv4地址分别是:192.168.56.102, 192.168.56.104。
3. 这两个ip网段和主机在同一网段,可以通信。
4. 浮动ip(即vip),就是在这个网卡下给虚拟机ip绑定一个别名ip。我设为192.168.56.200
$ ip addr show enp0s8
虚拟机1(192.168.56.102)作为主,我们查看一下其网卡信息,发现我们设置的 vip=192.168.56.200 已经绑定到了该机器。说明 keepalived 设置的vip确实生效了。
虚拟机1(192.168.56.102)作为备,我们查看一下备份机上的 enp0s8 网卡的信息,因为 vip 已经被虚机1 绑定占用。所以我们看不到其绑定的 vip 信息。
vip(virtual ip),又称为虚拟ip、浮动ip。vip在一个网卡里,只有分配给一台主机。当有2台或多台服务器配置了vip后。会将此vip地址分配给已存活的优先级最高的服务器。此时这台服务器,用其本机ip或者vip都能访问,也可以理解成vip是其ip的又一别名。当这台服务器宕机或其keeplived服务挂掉。vip会继续向次优先级分配,但当更高优先级的服务器恢复keepalived服务时,vip会还回去。vip在这些服务器之间来回浮动,所以又被称为浮动ip。
访问VIP,效果如下:
1. 虚拟机1 (192.168.56.104)作为 keepalived master 服务,我们停止该 keepalived 服务,并查看日志
$ systemctl stop keepalived.service # 关闭keepalived服务
$ tail -f /var/log/messages # 查看keepalived日志
2. 监控虚拟机2(192.168.56.102)的keepalived日志,并分析
3. 继续访问该服务。验证 vip 生效后,热备机上的nginx 继续生效并提供服务
由此可以得出结论:keepalived已经生效,并在主机 keepalived 服务挂掉的情况下。vip浮动到了备机上。
4. 监控主备机的 nginx 日志,来继续验证是备机的Nginx生效
$ cd /usr/local/nginx/logs # nginx日志目录
$ tail -f access.log # 监控运行日志
我看到备机上的nginx日志每次访问都有日志输出。主机上的Nginx 日志并无继续输出。
由此确认是备机的Nginx 在提供服务。
5. 当我们恢复主机的 keepalived 服务。会发现vip继续浮动到主机。由主机继续来主持Nginx工作。
tail -f /var/log/messages
查看主机Nginx日志。再次请求服务的日志又输出出来了。
现在我的虚拟机2(192.168.56.102)已经替代虚机1 成为 keepalived master 主机。我在此基础上,将该机器上的nginx 服务停止。验证 keepalived 会监控 nginx 状态并自动启动。开始吧:
3.1 停止 nginx服务
$ ./nginx -s stop
停止nginx服务后。我这里访问服务还是正常。