Nginx+Keepalived高可用集群搭建、主从热备

文章目录

        • 1、安装Keepalived
        • 2、编辑keepalived的配置文件
        • 3、现在就需要写shell脚本实现对Nginx的监控,并和Keepalived建立联系
        • 4、启动keepalived,日志报错分析
            • 错误一、
            • 错误二、
            • 错误三、
            • 错误四、
        • 5、Keepalived配置文件参数大全详解
    • 配置要点透析

众所周知,Nginx凭借它的高性能、稳定性成为IT人员青睐的WEB服务器和反向代理服务器,Nginx负载均衡一般位于网站架构的最前端或者中间层,如果为最前端时,单台Nginx会存在单点故障。因此我们需要加入Nginx备份服务器,让Nginx主备之间形成高可用,当Nginx主服务器宕机,可以达到热切换的目的。让主备之间达到热切换这就是Keepalived的作用。

网站架构图:
Nginx+Keepalived高可用集群搭建、主从热备_第1张图片这里只需要两台服务器就行了,实现Keepalived的功能即可。
首先确定自己的Nginx服务两台服务器上都已经配置好了

配置Keepalived

1、安装Keepalived

yum install keepalived -y

2、编辑keepalived的配置文件

  • 备份配置文件
mv keepalived.conf keepalived.conf.bak
  • 编辑配置文件
    主服务器:
//vim keepalived.conf

!Configuration File for keepalived
global_defs {
    router_id node1 //这里是标明不同的节点服务器,需要改
}

vrrp_script chk_nginx { //声明Nginx检查脚本的位置及其执行间隔时间
    script "/data/sh/check_nginx.sh"
    interval 2
    weight 2
}

#VIP
vrrp_instance VI_1 {
    state MASTER //这里是标明该服务器的地位,主还是从,需要改
    interface ens33  //定义VIP绑定的真实网卡
    virtual_router_id 60  //此router_id不同于上面那个,这个一定要一样,不然会造成脑裂
    priority 100 //注意上面两个标注可以改,可以不改,只是一个标记而已,未标注的不要改,当前这个参数必须改,而且主>从
    advert_int 5  //健康检查的时间间隔
    nopreempt  //不抢占
    authentication {  //Keepalived高可用对之间需要做认证
        auth_type PASS  //认证类型
        auth_pass 1111  //认证密码
    }
	virtual_ipaddress {  //定义VIP
        192.168.1.1
    }
    track_script {  //调用上面定义的chk_Nginx函数
        chk_nginx
    }
}

从服务器:

!Configuration File for keepalived
global_defs {
    router_id node2
}

vrrp_script chk_nginx {
    script "/data/sh/check_nginx.sh"
    interval 2
    weight 2
    fall 3
    rise 2
}

#VIP
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 60
    priority 99
    advert_int 5
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
	virtual_ipaddress {
        192.168.1.1
    }
    track_script {
        chk_nginx
    }
}

3、现在就需要写shell脚本实现对Nginx的监控,并和Keepalived建立联系

1)mkdir -pv /data/sh/2)vim /data/sh/check_nginx.sh //脚本如下3)chmod +x /data/sh/check_nginx.sh

//自己写的:
#!/bin/bash
#auto check nginx state
NUM=`ps -ef|grep nginx|egrep -vc "grep|chk"` //检查当前Nginx进程的个数
ip addr list|grep 192.168.1.1  //查看VIP是否在当前服务器
if [[ $? -eq 0 ]];then
    if [[ $NUM -eq 0 ]];then
        systemctl stop keepalived
    fi
fi

//改进版:
#!/bin/bash
#auto check nginx state
killall -0 nginx  //killall给指定进程发送0信号,如果返回值为0,则说明该进程存在,否则不存在
if [[ $? -ne 0 ]];then
    systemctl stop keepalived
fi

//终极版:
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    exit 1 //退出状态为1,说明执行脚本失败,fall++
fi
exit 0 //退出状态为0,说明脚本执行成功,rise++
此终极版才是最为正确的!

//切记不可用systemctl stop keepalived,如果真的停下来了,如果本地nginx服务好了,你还要启动keepalived服务,这样不符合高可用的初衷。

注意:无论是脚本还是Keepalived配置文件两个服务器都需要配置。

4、启动keepalived,日志报错分析

启动时需要查看keepalived日志文件,/var/log/messages

错误一、
WARNING - default user 'keepalived_script' for script execution does not exist - please create.

我们需要创建user:keepalived_script

useradd -s /sbin/nologin -M keepalived_script
错误二、
SECURITY VIOLATION - scripts are being executed but script_security not enabled.

这个报错不影响!正常!

错误三、
Keepalived_vrrp[32284]: /data/sh/check_nginx.sh due to signal 15

错误解决: check_nginx.sh脚本中的sleep时间必须比配置文件中的interval时间少

错误四、
/data/sh/check_nginx.sh exited with status 1

一直报这个错误,nginx停了,VIP也不漂移,也不显示脚本执行成功字样。

错误解决:先看脚本中的退出状态码的位置是否设置适当,再看看自己的priority是否设置适当,具体方法请见配置要点透析

5、Keepalived配置文件参数大全详解

#全局定义块
global_defs {
      notification_email {           			    #指定keepalived在发生切换时需要发送email到的对象,一行一个;
         wgkgood@gmail.com	
      }	
     notification_email_from  root@localhost	    #指定发件人
     smtp_server  mail.jfedu.net           		#指定smtp服务器地址
     smtp_connect_timeout 3          			#指定smtp连接超时时间
     router_id LVS_DEVEL             			#运行keepalived机器的标识
}	
#监控Nginx进程			
vrrp_script	chk_nginx  {	
    script "/data/script/nginx.sh"      		    #监控服务脚本,脚本x执行权限;
    interval 2                    				#检测时间间隔(执行脚本间隔)
    weight 2	
}				
#VRRP实例定义块				
vrrp_sync_group VG_1{                			#监控多个网段的实例
        group {			 	
  VI_1                     			            #实例名
  VI_2	
 }	
 notify_master /data/sh/nginx.sh          		#指定当切换到master时,执行的脚本
 notify_backup /data/sh/nginx.sh          		#指定当切换到backup时,执行的脚本
 notify   /data/sh/nginx.sh						#发生任何切换,均执行的脚本
 smtp_alert                         			    #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知;
}		
vrrp_instance VI_1 {		
    state BACKUP                    			#设置主机状态,MASTER|BACKUP
	nopreempt                       			#设置为不抢占
interface eth0                   			    #对外提供服务的网络接口
lvs_sync_daemon_inteface eth0               #负载均衡器之间监控接口; 
    track_interface {               	 			#设置额外的监控,网卡出现问题都会切换;
     eth0	
     eth1	
    }	
    mcast_src_ip                    			    #发送多播包的地址,如果不设置默认使用绑定网卡的primary ip
    garp_master_delay              				#在切换到master状态后,延迟进行gratuitous ARP请求
    virtual_router_id 50            			     #VRID标记 ,路由ID,可通过#tcpdump vrrp查看
    priority 90                    				#优先级,高优先级竞选为master
    advert_int 5                    			    #健康检查间隔,默认5秒
    preempt_delay                   			#抢占延时,默认5分钟
    debug                           			#debug日志级别
    authentication {                			    #设置认证
        auth_type PASS              			    #认证方式
        auth_pass 1111          				    #认证密码
    }
	track_script {                      		    #以脚本为监控chk_nginx;
        chk_nginx		
    }		
    virtual_ipaddress {             			#设置vip
        192.168.111.188
    }
}
注意:使用了脚本监控Nginx或者MYSQL,不需要如下虚拟服务器设置块。
#虚拟服务器定义块
virtual_server 192.168.111.188 3306 {
	delay_loop 6                   	#健康检查时间间隔
    lb_algo rr                     	#调度算法rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind DR                     	#负载均衡转发规则NAT|DR|TUN
    persistence_timeout  5        	#会话保持时间
    protocol TCP                   	#使用的协议
    real_server 192.168.1.12 3306 {	
               weight 1            	#默认为1,0为失效
               notify_up   <string> | <quoted-string> #在检测到server up后执行脚本;
               notify_down <string> | <quoted-string> #在检测到server down后执行脚本;
               TCP_CHECK {
               connect_timeout 3    #连接超时时间;
               nb_get_retry  1      #重连次数;
               delay_before_retry 1  #重连间隔时间;
               connect_port 3306  	#健康检查的端口;
               }
      		   HTTP_GET {    
       		   	url  {
               	path /index.html        #检测url,可写多个
               	digest  24326582a86bee478bac72d5af25089e    #检测效验码
               	#digest效验码获取方法:genhash -s IP -p 80 -u http://IP/index.html 
               status_code 200         #检测返回http状态码
                }
               }
	}     
}

配置要点透析

主要对keepalived中的VIP漂移作出解释。
实现VIP漂移主要是依靠的vrrp协议。但是具体实现是由配置文件哪几个参数决定的呢?
Nginx+Keepalived高可用集群搭建、主从热备_第2张图片还有一个最重要参数:
Nginx+Keepalived高可用集群搭建、主从热备_第3张图片这五个参数不能随便配置。否则可能会造成VIP无法漂移!

interval 2 #间隔两秒执行一次定义的脚本
weight 2 #如果失败,本地priority优先级会降低2,后续再继续失败,不再降低!如果执行成功,本地priority优先级上升2,后续再持续成功,不再上升。
fall 3 #连续三次失败,认为此服务器已废,VIP漂移
rise 2 #至少连续成功两次,认为此服务器可用,VIP可以在此服务器。

停下主nginx,fall三次,VIP漂移:
Nginx+Keepalived高可用集群搭建、主从热备_第4张图片启动主nginx,成功两次,如果配置了nopreempt,就不会VIP漂移,我没配,表示默认开启抢占,所以会漂移:

成功只显示一次,其实成功了两次。
接下来配置参数的要点:
priority(优先级),master角色必须比slave角色优先级高,且master下降weight之后必须比slave角色优先级低,不然slave不能成为新master角色,也就无法接管VIP等资源。

你可能感兴趣的:(Linux运维)