高可用示意图如下:
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的绑定
5、最终测试
(1)在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50(虚拟ip:这就是keepalive的强大处,统一了nginx集群的统一入口)
(2)把主服务器上的(192.168.17.129)Nginx 和 keepalived 停止,再输入 192.168.17.50,依旧可以访问Nginx。