前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx+Keepalived 集群高可用

Nginx+Keepalived 集群高可用

作者头像
Kevin song
发布2021-03-24 13:47:48
1.1K0
发布2021-03-24 13:47:48
举报

背景

为保证业务7*24小时不间断运行从而提供高效、稳定、可靠的信息化服务,前端采双Nginx+Keepalived,Nginx反向代理到后端文件集群实现负载均衡(Load Balancing),Keepalived实现集群高可用(High Available),主Nginx故障后虚拟IP自动漂移到备Nginx。

Nginx+Keepalived 高可用架构

主机清单

HOSTNAME

IP

MAC

VIP

nginx-m

192.168.99.144/24

00:0c:29:ad:73:a1

192.168.99.146

nginx-s

192.168.99.145/24

00:0c:29:a1:8e:14

192.168.99.146

文件服务器

192.168.99.107/24

Nginx

Nginx是一款轻量级的开源Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。

优点:

支持高并发连接:官方测试Nginx能够支撑5万并发连接,实际生产环境中可以 支撑2~4万并发连接数;

配置文件简洁;

占用内存少;

内部有健康检查功能;

支持Rewrite重写:可根据不同的域名、URL将请求转发至后端不同的服务群;

支持热部署;

稳定性高。

安装Nginx官方源

代码语言:javascript
复制
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安装Nginx

代码语言:javascript
复制
#yum 安装nginx
yum install nginx -y
#查看nginx 版本
rpm -qa nginx
nginx-1.18.0-2.el7.ngx.x86_64
#查看nginx 安装位置
rpm -ql  nginx

Nginx 配置文件(两台主机配置相同)

代码语言:javascript
复制
cat  /etc/nginx/conf.d/nginx.conf 
upstream webserver_file {
        #ip_hash;
        server 192.168.99.107:18686;
}

server {
        listen 18686;
        #server_name ;
        location / {
        proxy_pass       http://webserver_file/software/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_connect_timeout   60;
                proxy_read_timeout      60;
                proxy_send_timeout      60;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
             root   /usr/share/nginx/html;
        }
}

运行Nginx

代码语言:javascript
复制
#启动nginx服务
 systemctl    start nginx
# 配置开机自启动
systemctl enable nginx
#关闭nginx服务
systemctl stop nginx

Nginx 测试

Keepalived

Keepalived 是集群管理中保证集群高可用的一个软件解决方案,其功能类似于heartbeat,用来防止单点故障。keepalived是以VRRP协议为实现基础的,VRRP全称VirtualRouter Redundancy Protocol,即虚拟路由冗余协议。虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip,master会发组播(组播地址为224.0.0.18),当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,这样的话就可以保证路由器的高可用了。

keepalived主要有三个模块,分别是core 、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。同时为了避免出现脑裂,应关闭防火墙或者开启防火墙但允许接收VRRP协议。

选举算法

keepalived中优先级高的节点为MASTER。MASTER其中一个职责就是响应VIP的arp包,将VIP和mac地址映射关系告诉局域网内其 他主机,同时,它还会以多播的形式(目的地址224.0.0.18)向局域网中发送VRRP通告,告知自己的优先级。网络中的所有BACKUP节点只负责 处理MASTER发出的多播包,当发现MASTER的优先级没自己高,或者没收到MASTER的VRRP通告时,BACKUP将自己切换到MASTER状 态,然后做MASTER该做的事:1.响应arp包,2.发送VRRP通告。

安装keepalived

代码语言:javascript
复制
#yum 安装keepalived
yum install-y keepalived 
#查看keepalived 版本
rpm -qa keepalived
keepalived-1.3.5-19.el7.x86_64
#查看keepalived 安装位置
rpm -ql keepalived

keepalived 主

代码语言:javascript
复制
[root@nginx-m keepalived]# cat  keepalived.conf 
! Configuration File for keepalived

global_defs {
  router_id lvs-nginx01
}
vrrp_script chknginx 
{
  script "/etc/keepalived/chknginx.sh"
  interval 2
  weight -20         
}
vrrp_instance nginx-ha {
  state MASTER
  interface ens33
  virtual_router_id 100
  priority 100
  advert_int 1
  authentication {
        auth_type PASS
        auth_pass 1111
  }
virtual_ipaddress {
      192.168.99.146
   }
track_script {
        chknginx
   }
}

keepalived 备

代码语言:javascript
复制
[root@nginx-s keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
  router_id lvs-nginx02
}
vrrp_script chknginx 
{
  script "/etc/keepalived/chknginx.sh"
  interval 2
  weight -20         
}
vrrp_instance nginx-ha {
  state BACKUP
  interface ens33
  virtual_router_id 100
  priority 90
  advert_int 1
  authentication {
        auth_type PASS
        auth_pass 1111
  }
virtual_ipaddress {
      192.168.99.146
   }
track_script {
        chknginx
   }
}

vrrp_script

在Keepalived中,可以通过vrrp_script调用shell命令或一个脚本,通过该命令或脚本的返回值来判断监控的资源是否出问题。当返回值为0时,Keepalived认为被监控的资源正常;当返回值为非0时,Keepalived认为被监控的资源出现了问题。

weight 为正时,脚本检测成功时此weight会加到priority上,检测失败时不加;

主失败:

主 priority < 从 priority + weight 时会切换。

主成功

主 priority + weight > 从 priority + weight 时,主依然为主

B:weight 为负时,脚本检测成功时此weight不影响priority,检测失败时priority – abs(weight);

主失败:

主 priority – abs(weight) < 从priority 时会切换主从

主成功:

主 priority > 从priority 主依然为主

vrrp_script 格式 参数

代码语言:javascript
复制
vrrp_script 自定义名称 {
    script "命令或脚本"
    interval 数字
    fall 数字
    rise 数字
}
vrrp_instance VRRP实例名 {
    ...
    track_script {
        vrrp_script的自定义名称
    }
}

script:调用shell命令或脚本

interval:定义执行命令或脚本的时间间隔,单位秒

fall:定义检测失败的最大次数,如设置为2表示当请求失败两次时就认为节点资源故障

rise:定义请求成功的次数,如设置为1表示当进行一次请求成功后就认为节点资源恢复正常

vrrp_instance中的track_script:调用vrrp_script使之生效

keepalived 配置文件注释

nginx 检测脚本

第一种

代码语言:javascript
复制
cat  chknginx.sh 
#!/bin/bash
nginx=$(netstat -na|grep "LISTEN"|grep "18686"|wc -l)
        if [ "${nginx}" -eq 0 ]; then
            systemctl stop keepalived
            killall keepalived
fi

第二种

代码语言:javascript
复制
#!/bin/bash
nginx=$(netstat -na|grep "LISTEN"|grep "18686"|wc -l)
        if [ "${nginx}" -eq 0 ]; then
           exit 1
        else
           exit 0
fi

添加脚本的执行权限

代码语言:javascript
复制
chmod   a+x chknginx.sh

shell 判断参数

代码语言:javascript
复制
-eq           //等于
-ne           //不等于
-gt            //大于 (greater )
-lt            //小于  (less)
-ge            //大于等于
-le            //小于等于
命令的逻辑关系:在linux 中 命令执行状态:0 为真,其他为假
逻辑与:&&
第一个条件为假时,第二条件不用再判断,最终结果已经有;第一个条件为真时,第二条件必须得判断;逻辑或:||
逻辑非:!

运行keepalived

代码语言:javascript
复制
#启动keepalived服务
 systemctl    start keepalived
# 配置开机自启动
systemctl enable keepalived
#关闭keepalived服务
systemctl stop keepalived

抢占和非抢占模式

抢占模式

抢占模式,ip1的状态为MASTER,ip2的状态为BACKUP,不需要配置nopreempt非抢占标识,默认为抢占的模式。

非抢占模式

1、ip1的keepalived.conf中状态为MSASTER,ip2的keepalived.conf状态为BACKUP,且都需要配置nopreempt;当master宕机时,会自动飘到backup,但是当master恢复时,又会重新飘到master上。

2、ip1和ip2的状态都为BACKUP,且都配置了非抢占标识“nopreempt”,则会根据优先级来选举一个master,当master从故障中恢复后,不会抢占vip,避免了VIP切换造成的延迟。

主备切换测试

停止 nginx 服务后VIP 切换至备主机

备机验证VIP

终端查看MAC

代码语言:javascript
复制
arp -a

浏览器访问

Firewalld 防火墙

代码语言:javascript
复制
#添加keepalived 报文规则
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
#重载配置
firewall-cmd   --reload
#查看规则
firewall-cmd --direct --get-all-rules

keepalived 日志

keepalived 默认的日志输出到/var/log/messages,自定义日志输出。

配置keepalived日志文件

代码语言:javascript
复制
vim /etc/sysconfig/keepalived 
KEEPALIVED_OPTIONS="-D -d -S 0"

配置 rsyslog文件

代码语言:javascript
复制
vim /etc/rsyslog.conf 
local0.* /var/log/keepalived.log

重启rsyslog服务

代码语言:javascript
复制
systemctl    restart   rsyslog

重启keepalived 服务

代码语言:javascript
复制
systemctl    restart  keepalived

查看keepalived日志

代码语言:javascript
复制
tail -f   /var/log/keepalived.log

Zabbix 监控Keepalived VIP

keepalived vip 监测脚本

代码语言:javascript
复制
vim chkvip.sh 
#!/bin/bash
vip=`ip add show ens33 |grep $1 -c`
        if [ "${vip}" -eq 0 ]; then
            echo 0
        else
            echo 1
fi

监控项

最新数据

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源搬运工宋师傅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档