高可用示意图如下:

nginx集群架构 nginx集群方案_Nginx

NGINX主从备份
    NGINX实现主从备份目前主流方案是Keepalived+Nginx实现双机热备。

Keepalived介绍:
    Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。
    但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用

VRRP协议:
    虚拟路由冗余协议
    可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,
    但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),
    占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。
    master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,
    这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用
    
具体实现原理:
    1)Master没挂,则Master占有vip且nginx运行在Master上
    2)Master挂了,则backup抢占vip且在backup上运行nginx服务
    3)如果master服务器上的nginx服务挂了,则vip资源转移到backup服务器上
    4)检测后端服务器的健康状态
    Master和Backup两边都开启nginx服务,无论Master还是Backup,当其中的一个keepalived服务停止后,vip都会漂移到keepalived服务还在的节点上

开始部署实现:
1.准备工作
    1.1有两台服务器:wmd01 wmd02
    1.2各自安装nginx和keepalived 
        1.keepalived 通过yum安装:
            yum install keepalived –y
            安装后,keepalive的配置文件路径:/etc/keepalived/keepalivec.conf 
2.nginx的配置文件:
    两个服务器的nginx配置文件都相同,没有什么变动,做主备节点
3.keepalive的配置:/etc/keepalived/keepalivec.conf
    主节点(Master节点配置)
    (1)修改/etc/keepalived/keepalivec.conf 配置文件
        global_defs {
        	 notification_email {
        		 acassen@firewall.loc
        		 failover@firewall.loc
        		 sysadmin@firewall.loc
        	 }
        	 notification_email_from Alexandre.Cassen@firewall.loc
             #当前主机ip
        	 smtp_server 192.168.17.129
        	 smtp_connect_timeout 30
        	 # 重点1:通过它,可以访问到主机,在hosts文件中,要做映射关系,类似于 127.0.0.1 LVS_DEVEL,host文件路径:/etc/hosts
        	 router_id LVS_DEVEL  
        }
        
        #重点2:检测脚本,目的是定时执行,检测nginx的状态,如果挂了尝试重启,如果启动失败,则停止该节点的nginx和keepaive
        vrrp_script chk_http_port {
        	 script "/usr/local/src/nginx_check.sh"	 # 执行脚本所在的位置,自定义脚本后面会提及
        	 interval 2 	#检测脚本执行的间隔,单位秒,每个2秒执行一次脚本
        	 weight 2       #脚本执行满足,权重加2,这里其实没搞明白..
        }

        #重点3:主备节点的区别配置	
        vrrp_instance VI_1 {
        	 state MASTER	 # 备份服务器上将 MASTER 改为 BACKUP
        	 interface ens33	 # 绑定的网卡,通过ipconfig查看
        	 virtual_router_id 51	 # 主、备机的 virtual_router_id 必须相同
        	 priority 100 	# 主、备机取不同的优先级,主机值较大,备份机值较小(比如主机100,备机90)
        	 advert_int 1 	#每隔一秒发送一次心跳,确保从服务器(keepalive)是否还活着
        	 authentication {		# 心跳检测需要的密码
        		 auth_type PASS
        		 auth_pass 1111
         	}
        	 virtual_ipaddress {
            	 192.168.17.50 	# VRRP H 虚拟地址(重点:虚拟ip配置,客户端通过该ip进行访问,主节点和备用节点谁占有这个ip,谁提供反向代理服务)
        	 }
        }
    (2)在/usr/local/src 添加检测脚本nginx_check.sh,检查Nginx是否还活着
            #!/bin/bash
            #查看ningx的进程号,并统计数量
            A=`ps -C nginx –no-header |wc -l`
            #等于0时,即nginx挂了,尝试重启
            if [ $A -eq 0 ];then
             /usr/local/nginx/sbin/nginx 	#Nginx启动命令的位置
             sleep 2
             #启动失败,杀掉keepalive
             if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
             killall keepalived
             fi
            fi
    (3)把两台服务器上 nginx 和 keepalived 启动
            启动 nginx:	./nginx
            启动 keepalived:	systemctl start keepalived.service

可以使用ipconfig,查看虚拟Ip的绑定

nginx集群架构 nginx集群方案_Nginx_02

5、最终测试

(1)在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50(虚拟ip:这就是keepalive的强大处,统一了nginx集群的统一入口)


nginx集群架构 nginx集群方案_nginx_03

(2)把主服务器上的(192.168.17.129)Nginx 和 keepalived 停止,再输入 192.168.17.50,依旧可以访问Nginx。

nginx集群架构 nginx集群方案_nginx_04

nginx集群架构 nginx集群方案_nginx集群架构_05