一,Nginx高可用遇到的问题

1,Nginx高可用集群解决的问题?

在我们负载均衡配置中有一台非常关键的服务器,nginx反向代理服务器,所有的任务分发都是从他这里发出的, 如果这台反向代理服务器挂了,整个流程全部down了,所以需要对负载均衡进行监听,添加一台备份服务器做容灾。

keepalive和nginx比较 keepalived和nginx做集群_java

2,Nginx高可用集群实现思路

keepalive和nginx比较 keepalived和nginx做集群_nginx_02

1:如上所述我们需要有个程序一直去监听nginx是否down,这里我们使用Keepalived来做
  2:当我们发现nginx反向代理服务器down了,我们需要找一台服务器做替代
  当nginx主服务故障,使用备份服务器的时候,对外暴露的IP会发生改变,为了减少web端的操作,我们需要统一对外的IP,这就是所谓的虚拟IP(VIP), 虚拟IP解决的问题就是当我的nginx故障切换了,对外暴露的IP始终是不变的, 不会对web层有影响。
  主要是采用 nginx负载均衡 + 监控(keepalived)来实现,keepalived来监听Nginx是否存活,同时维护 虚拟IP对外访问解决静态路由的单点故障。

二,Keepalived+Nginx高可用集群搭建步骤

(一)环境准备工作

linux下搭建Nginx详细步骤Nginx反向代理+负载均衡

1,Nginx服务器:

192.168.119.101

192.168.119.102

访问端口 8103

2,两个Nginx服务的nginx.config配置

keepalive和nginx比较 keepalived和nginx做集群_keepalive和nginx比较_03


keepalive和nginx比较 keepalived和nginx做集群_运维_04


配置很简单,只简单做了下负载均衡用来轮询9001和9002

3,后端web服务器:

使用idea自己跑的两个项目作为测试

192.168.245.1:9001

192.168.245.1:9002

keepalive和nginx比较 keepalived和nginx做集群_nginx_05

keepalive和nginx比较 keepalived和nginx做集群_keepalive和nginx比较_06


9001和9002本地服务也简单,返回当前端口的的字符串

4,安装 keepalived
在192.168.119.101和192.168.119.102机器上上面安装keepalived(也可以源码编译安装、此处直接使用yum安装)
(1)安装 keepalived

yum install keepalived -y

keepalive和nginx比较 keepalived和nginx做集群_java_07

(2)查看Keepalived核心配置文件,并备份

vim /etc/keepalived/keepalived.conf
cp /etc/keepalived/keepalived.conf  /etc/keepalived/keepalived.conf_default

keepalive和nginx比较 keepalived和nginx做集群_java_08

(3)设置开机启动

chkconfig keepalived on

环境配置完成,开始进行配置实现集群

(二)Keepalived+Nginx 高可用集群(主从模式)

1,修改 Keepalived 配置文件
(1)MASTER 节点配置文件(192.168.119.101)

# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
	#keepalived 自带的邮件提醒需要开启 sendmail 服务。 
	#建议用独立的监控或第三方 SMTP 
	#notification_email {
   #  acassen@firewall.loc
   #  failover@firewall.loc
     # sysadmin@firewall.loc
   # }
  #  notification_email_from Alexandre.Cassen@firewall.loc
    
	#标识本节点的字条串,通常为 hostname
	router_id master
} 
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态
#调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 
#weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果
#非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他
#情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_nginx {
	# 检测 nginx 状态的脚本路径,脚本后面会介绍
	script "/etc/keepalived/nginx_check.sh" 
	#检测时间间隔
	interval 2 
	#如果条件成立,权重-20
	weight -20 
}
## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
	#主节点为 MASTER, 对应的备份节点为 BACKUP
	state MASTER 
	#绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同, 
	#我的是 ens32
	interface ens32
	#虚拟路由的 ID 号, 两个节点设置必须一样, 可选 IP 最后一
	#段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址
	virtual_router_id 51
	#本机 IP 地址
	mcast_src_ip 192.168.119.101 
	#节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高
	priority 100 
	# 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
	nopreempt 
	# 组播信息发送间隔,两个节点设置必须一样, 默认 1s
	advert_int 1 
	#设置验证信息,两个节点必须一致
	authentication {
		auth_type PASS
		auth_pass 1111 ## 真实生产,按需求对应该过来
	}
	#将 track_script 块加入 instance 配置块
	track_script {
	#执行 Nginx 监控的服务
		chk_nginx 
	}
	# 虚拟 IP 池, 两个节点设置必须一样
	virtual_ipaddress {
	##虚拟 ip,可以定义多个
		192.168.119.241
      	#192.168.119.17
     	#192.168.119.18	
 
	}
}

(2)BACKUP 节点配置文件(192.168.119.102)
和master差不多只是改动下state、mcast_src_ip、priority

# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
	#keepalived 自带的邮件提醒需要开启 sendmail 服务。 
	#建议用独立的监控或第三方 SMTP 
	#notification_email {
    # acassen@firewall.loc
    # failover@firewall.loc
    #  sysadmin@firewall.loc
    #}
   #notification_email_from Alexandre.Cassen@firewall.loc
    
	#标识本节点的字条串,通常为 hostname
	router_id master
} 
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态
#调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 
#weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果
#非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他
#情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_nginx {
	# 检测 nginx 状态的脚本路径,脚本后面会介绍
	script "/etc/keepalived/nginx_check.sh" 
	#检测时间间隔
	interval 2 
	#如果条件成立,权重-20
	weight -20 
}
## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
	#主节点为 MASTER, 对应的备份节点为 BACKUP
	state BACKUP
	#绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同, 
	#我的是 ens32
	interface ens32
	#虚拟路由的 ID 号, 两个节点设置必须一样, 可选 IP 最后一
	#段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址
	virtual_router_id 51
	#本机 IP 地址
	mcast_src_ip 192.168.119.102
	#节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高
	priority 90
	# 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
	nopreempt 
	# 组播信息发送间隔,两个节点设置必须一样, 默认 1s
	advert_int 1 
	#设置验证信息,两个节点必须一致
	authentication {
		auth_type PASS
		auth_pass 1111 ## 真实生产,按需求对应该过来
	}
	#将 track_script 块加入 instance 配置块
	track_script {
	#执行 Nginx 监控的服务
		chk_nginx 
	}
	# 虚拟 IP 池, 两个节点设置必须一样
	virtual_ipaddress {
	##虚拟 ip,可以定义多个
		192.168.119.241
      	#192.168.119.17
     	#192.168.119.18	
 
	}
}

(3)主备库都要创建nginx的监控脚本, 如果不适用keepalived自带的vrrp_script也可以自己写一个脚本,常驻后台去判断nginx是否存活!新安装的可能没有这个需要自己建

vim /usr/etc/keepalived/nginx_check.sh
#!/bin/sh
#配置说明:判断nginx是否存活,如果nginx挂了,就把keepalived
#停掉,备库的keepalived就会争抢主库的虚拟IP变成主库, 因为
#keepalived是服务器级别的监控,nginx挂掉并不会有什么反应,
#所以用脚本关闭keepalived让备库去抢占虚拟IP
nginxpid=$(ps -C nginx --no-header|wc -l)
#判断Nginx是否存活
if [ $nginxpid -eq 0 ];then
    systemctl stop keepalived
    exit 1
fi



# nginx_check.sh 授权
chmod -R 744 /etc/keepalived/nginx_check.sh

(4)启动keepalived

# 启动
systemctl start keepalived
# 停止
systemctl stop keepalived
# 查收看状态
systemctl statu keepalived
#查看日志
tailf /var/log/message

查看主服务器虚拟ip

ip addr

keepalive和nginx比较 keepalived和nginx做集群_linux_09

查看主服务器广播

#通过keepalived的vrrp通信发布存活信息给备库
sudo tcpdump -i ens32 vrrp -n

keepalive和nginx比较 keepalived和nginx做集群_运维_10

(5)确保 主从服务器都能ping通VIP,如果ping不同请注释keepalived.conf中的 vrrp_strict

ping 192.168.119.241

192.168.119.101

keepalive和nginx比较 keepalived和nginx做集群_运维_11

192.168.119.102

keepalive和nginx比较 keepalived和nginx做集群_nginx_12


(6)Keepalived+Nginx 的高可用测试

访问192.168.119.241:8103/nginx/stream,会轮询9001和9002,关闭192.168.119.101主机,再次访问192.168.119.241:8103,依旧会轮询访问 9001和9002

① 启动9001和9002服务

② 访问 192.168.119.241:8103/nginx/stream

keepalive和nginx比较 keepalived和nginx做集群_nginx_13


keepalive和nginx比较 keepalived和nginx做集群_java_14


③关闭192.168.119.101nginx和keepalived,再次访问192.168.119.241:8103/nginx/stream

keepalive和nginx比较 keepalived和nginx做集群_运维_15

keepalive和nginx比较 keepalived和nginx做集群_nginx_16


keepalive和nginx比较 keepalived和nginx做集群_java_17

依旧可以访问

④查看从机192.168.119.102的keepalived.conf,VIP已经飘过来了

keepalive和nginx比较 keepalived和nginx做集群_java_18


⑤ 重启主机keepAlived和Nginx

发现从机上的Vip跑到主机上去了,查看的时候等会,不会立马转回去

keepalive和nginx比较 keepalived和nginx做集群_java_19

(三)Keepalived+Nginx 高可用集群(双主模式)

将keepalived做成双主模式,其实很简单,就是再配置一段新的vrrp_instance(实例)规则,主上面加配置一个从的实例规则,从上面加配置一个主的实例规则,即每个配置中都有一主一从,主从互相守护。

直接上配置,和主从模式差不多

192.168.119.101

keepalive和nginx比较 keepalived和nginx做集群_nginx_20


192.168.119.102

keepalive和nginx比较 keepalived和nginx做集群_nginx_21

对比下,大家可以看出关系来

重启192.168.119.101和192.168.119.102两个服务器的keepalived

并查看 ip addr。两太服务器都能显示VIP,按照主从配置我们得知,从机查看ip addr是没法查看到VIP的

keepalive和nginx比较 keepalived和nginx做集群_linux_22


keepalive和nginx比较 keepalived和nginx做集群_keepalive和nginx比较_23


访问192.168.119.242:8103/nginx/stream

keepalive和nginx比较 keepalived和nginx做集群_nginx_24

测试和主从测试结果一样,到此双主模式已完成
以下是两个配置文件的代码希望能帮助到大家,按照上述步骤配置成功的话动动鼠标给个小赞吧
192.168.119.101

! Configuration File for keepalived

global_defs {
  # notification_email {
   #  acassen@firewall.loc
    # failover@firewall.loc
    # sysadmin@firewall.loc
   #}
   #notification_email_from Alexandre.Cassen@firewall.loc
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   router_id LVS_MATSER101
   #vrrp_skip_check_adv_addr
   #vrrp_strict
   #vrrp_garp_interval 0
  # vrrp_gna_interval 0
}
vrrp_script chk_nginx {
          script "/etc/keepalived/nginx_check.sh"
          interval 2
          weight -20
  }

vrrp_instance VI_1 {
    state MASTER
    interface ens32
    virtual_router_id 51
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
      chk_nginx_alive
    }
    virtual_ipaddress {
        192.168.119.241
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface ens32
    virtual_router_id 52
    priority 90
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
      chk_nginx_alive
    }
    virtual_ipaddress {
        192.168.119.242
    }

}

192.168.119.102

! Configuration File for keepalived

global_defs {
  # notification_email {
   #  acassen@firewall.loc
    # failover@firewall.loc
    # sysadmin@firewall.loc
   #}
   #notification_email_from Alexandre.Cassen@firewall.loc
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   router_id LVS_MATSER102
   #vrrp_skip_check_adv_addr
   #vrrp_strict
   #vrrp_garp_interval 0
  # vrrp_gna_interval 0
}
vrrp_script chk_nginx {
          script "/etc/keepalived/nginx_check.sh"
          interval 2
          weight -20
  }

vrrp_instance VI_1 {
    state BACKUP
    interface ens32
    virtual_router_id 51
    priority 90
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
      chk_nginx_alive
    }
    virtual_ipaddress {
        192.168.119.241
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface ens32
    virtual_router_id 52
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
      chk_nginx_alive
    }
    virtual_ipaddress {
        192.168.119.242
    }
}