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


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

网站架构图:
在这里插入图片描述这里只需要两台服务器就行了,实现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
}

#VIP
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 60
    priority 90
    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

注意:无论是脚本还是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.

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状态码
                }
               }
	}     
}
发布了162 篇原创文章 · 获赞 142 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44571270/article/details/104178644