在生产环境中,经常使用Nginx作为反向代理对外提供服务,但是总有一天Nginx难免会遇到故障,比如服务器宕机。当Nginx宕机时,所有外部接口都将无法访问。虽然我们不能保证服务器100%可用,但是我们必须想办法避免这种悲剧发生。今天我们使用keepalived来实现Nginx的高可用。什么是高可用性?高可用性HA(HighAvailability)是分布式系统架构设计中必须考虑的因素之一。通常是指通过设计减少系统不能提供服务的时间。如果一个系统可以一直提供服务,那么可用性就是100%,但是也有不可预知的事情。所以我们只能尽可能的减少服务失败。双机热备方案该方案是目前国内企业最为普遍的高可用方案。双机热备实际上就是一台服务器提供服务,另一台服务器为某项服务处于备用状态。当一台服务器不可用时,将其替换为另一台服务器。什么是保活?Keepalived软件最初是为LVS设计的负载均衡软件,用于管理和监控LVS集群系统中各个服务节点的状态,后来加入了VRRP(VirtualRouterRedundancyProtocol,虚拟路由器冗余协议)可以实现高可用性的功能。因此,Keepalived除了可以管理LVS软件外,还可以作为其他服务(如:Nginx、Haproxy、MySQL等)的高可用解决方案。当Keepalived服务正常工作时,主Master节点会不断向备节点发送(组播)心跳消息,告诉备Backup节点它还活着。当主Master节点出现故障时,无法发送心跳消息。因此节点无法继续检测来自主节点的心跳,于是调用自己的接管程序接管主节点的IP资源和服务。而当主Master节点恢复时,备份Backup节点将释放其在主节点故障时接管的IP资源和服务,恢复到原来的备份角色。实施过程准备192.168.16.128192.168.16.129两台虚拟机。安装Nginx安装Nginx更新yum源文件:rpm-ivhhttp://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpmwget-O/etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-7.repo安装Nginx:yum-yinstallnginx运行命令:systemctlstartnginx;#启动Nginxsystemctlstopginx;#停止Nginx安装keepalivedyum模式直接安装即可,此方法会自动安装依赖:yum-yinstallkeepalived修改主机(192.168.16.128)keepalived配置文件yum安装会在/etc/keepalived下产生配置文件:vikeepalived.confkeepalived.conf:#检测脚本vrrp_scriptchk_http_port{script"/usr/local/src/check_nginx_pid.sh"#检测nginx是否启动的心跳执行脚本interval2#(检测脚本执行间隔,单位秒)weight2#weight}#vrrp实例定义部分vrrp_instanceVI_1{stateMASTER#指定keepalived的角色,MASTER为master,BACKUP为备份接口ens33#当前进行vrrp通信的网卡(当前centos网卡)使用ifconfig查看你具体的网卡virtual_router_id66#虚拟路由号,masterandslave必须始终是priority100#Priority,值越大获取和处理的优先级越高essingrequestsadvert_int1#检查间隔,默认为1s(vrrp组播周期秒)#授权访问认证{auth_typePASS#设置认证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信auth_pass1111}track_script{chk_http_port#(call检测脚本)}virtual_ipaddress{192.168.16.130#Definevirtualip(VIP),可以多设,每行一个}}virtual_ipaddress可以在vip中配置,通过vip在线访问服务接口需要根据服务器网卡进行设置。通常的查看方式是ipaddrauthentication配置。授权访问备用机也需要相同的配置。修改备机(192.168.16.129)keepalived配置文件keepalived.conf:#检测脚本vrrp_scriptchk_http_port{script"/usr/local/src/check_nginx_pid.sh"#心跳执行脚本检测nginx是否启动interval2#(检测脚本执行间隔)weight2#weight}#vrrp实例定义部分vrrp_instanceVI_1{stateBACKUP#指定keepalived的作用,MASTER为主,BACKUP为备份接口ens33#使用ifconfig查看你具体的网卡virtual_router_id66#虚拟路由号,master-slave应该一直bepriority99#优先级,值越大,获取和处理请求的优先级越高advert_int1#检查间隔,默认为1s(vrrp组播周期秒)#授权接入认证{auth_typePASS#设置认证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信auth_pass1111}track_script{chk_http_port#(calldetectionscript)}virtual_ipaddress{192.168.16.130#定义虚拟ip(VIP),可以设置多个,每行一个}}检测脚本:#!/bin/bash#检测nginx是否启动A=`ps-Cnginx--no-header|wc-l`if[$A-eq0];then#如果nginx没有启动,启动nginxsystemctlstartnginx#Restartnginxif[`ps-Cnginx--no-header|wc-l`-eq0];then#nginx重启失败,stop关闭keepalived服务,执行VIP转移killallkeepalivedfifi脚本授权:chmod775check_nginx_pid.sh说明:脚本必须授权,否则无法访问,这里执行两台服务器,VIP(virtual_ipaddress:192.168.16.130),我们在生产环境直接通过vip访问服务来模拟nginx故障:修改两台服务器默认访问的Nginxhtml页面作为区别。先访问192.168.16.130,通过vip访问,页面显示192.168.16.128;表示当前是主服务器提供的服务。此时192.168.16.128主服务器执行命令:systemctlstopginx;#停止nginx,再次访问vip(192.168.16.130),发现此时页面显示:192.168.16.128,这是脚本中的自动重启。现在直接关闭192.168.16.128服务器,访问vip这里(192.168.16.130)现在发现页面显示192.168.16.129。这时候keepalived会自动进行failover,搭建一个企业级生产环境的高可用解决方案。keepalived还有很多其他的功能,比如:邮件提醒等,可以去官网看文档。
