博客信息

Keepalived搭建Nginx集群实现高可用

发布时间:『 2020-03-06 19:15』  博客类别:中间件  阅读(704)

keepalived简介


keepalived是集群管理中保证集群高可用的一个服务软件,通过keepalived,我们可以实现Nginx集群,实现高可用。

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。 keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。


小李飞刀_Nginx

keepalived安装

安装yum命令:

yum install keepalived -y

keepalived常用命令:

systemctl start keepalived.service
systemctl stop keepalived.service
systemctl restart keepalived.service

keepalived查看日志:

tail -f  /var/log/messages

安装目录: 我们查找即可:

find / -name keepalived

我们平时玩的就是一个keepalived配置

小李飞刀_Nginx

/etc/keepalived 下的keepalived.conf配置


高可用集群配置


1)centos上安装nginx

默认情况Centos7中没有Nginx的源,Nginx官方提供了源,所以执行如下命令添加源

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安装Nginx

yum install -y nginx

启动Nginx并设置开机自动运行

systemctl start nginx.service
systemctl enable nginx.service

Nginx关闭命令

systemctl stop nginx.service

Nginx重启命令

systemctl restart nginx.service

关闭防火墙

systemctl stop firewalld 临时关闭
systemctl disable firewalld ,然后reboot 永久关闭
systemctl status firewalld 查看防火墙状态。

输入IP测试; http://192.168.195.129/

出现Welcome to nginx!字样的页面,算是安装成功;

2)高可用集群配置

我们首先要搞两台机器,每个机器都安装有keepalived以及Nginx,为了演示得更逼真,nginx也要反向代理搞两个tomcat实现负载均衡;所以这两台机器,每个机器上都再搞个docker以及tomcat;

首先我们配置keepalived 找到第一台机器的/etc/keepalived目录的keepalived.conf配置文件,打开;


小李飞刀_Nginx

我们主要是配置这两个节点,下方其他的是配置的lvs,我们都删除掉 不需要;

global_defs是全局定义 vrrp_instance VI_1 是实例配置;

配置讲解:

全局配置

global_defs {
  notification_email { # keepalived服务宕机异常出现的时候,发送通知邮件 可以是多个
    acassen@firewall.loc # 收件人邮箱1
    failover@firewall.loc # 收件人邮箱2
    sysadmin@firewall.loc # 收件人邮箱3
  }
  notification_email_from Alexandre.Cassen@firewall.loc #邮件发件人
  smtp_server 192.168.200.1 # 邮件服务器地址
  smtp_connect_timeout 30   # 超时时间
  router_id LVS_DEVEL   # 路由id 多个keepalived集群的时候 必须一致
  vrrp_skip_check_adv_addr # 默认是不跳过检查。检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)。
  vrrp_strict   # 这个东西要注释掉,否则要出乱子。严格遵守VRRP协议。下列情况将会阻止启动Keepalived:1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址。
  vrrp_garp_interval 0 # 小数类型,单位秒,在一个网卡上每组gratuitous arp消息之间的延迟时间,默认为0,一个发送的消息=n组 arp报文
  vrrp_gna_interval 0 # 小数类型,单位秒, 在一个网卡上每组na消息之间的延迟时间,默认为0
}

vrrp实例 我们集群设置 多机配置,除了state和priority不一样,其他都一样

vrrp_instance VI_1 {
  state MASTER # 服务器状态 MASTER是主服务器 BACKUP是备份服务器 主服务器的priority要比备份服务器大
  interface eth0 # 通信端口 通过ip addr可以看到 根据自己的机器配置
  virtual_router_id 51 # vrrp实例id keepalived集群,实例id必须一致
  priority 100 # 权重比 主服务器的priority要比备份服务器大
  advert_int 1 # 心跳间隔 单位秒 keepalived多机器集群 通过心跳检测,如果发送心跳没反应 就立刻接管;
  authentication { # 服务器之间通信密码
      auth_type PASS
      auth_pass 1111
  }
  virtual_ipaddress { # 自定义虚拟IP
      192.168.200.16
      192.168.200.17
      192.168.200.18
  }
}

router_id 配置方式 我们修改/etc/hosts文件 加一行

127.0.0.1 KEEPALIVED_NGINX_MASTER

小李飞刀_Nginx


这里的KEEPALIVED_NGINX_MASTER 就可以配置到router_id 里;

vrrp_instance 的 interface 配置: 我们ip addr看

小李飞刀_Nginx

我这边是 ens33

主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 KEEPALIVED_NGINX_MASTER
  vrrp_skip_check_adv_addr
  #vrrp_strict
  vrrp_garp_interval 0
  vrrp_gna_interval 0
}

vrrp实例 我们集群设置 多机配置,除了state和priority不一样,其他都一样

vrrp_instance VI_1 {
  state MASTER
  interface ens33
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
      auth_type PASS
      auth_pass 1111
  }
  virtual_ipaddress {#自定义虚拟ip
      192.168.195.66
  }
}

备份机配置:

全局配置

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 KEEPALIVED_NGINX_BACKUP
  vrrp_skip_check_adv_addr
  #vrrp_strict
  vrrp_garp_interval 0
  vrrp_gna_interval 0
}

vrrp实例 我们集群设置 多机配置,除了state和priority不一样,其他都一样

vrrp_instance VI_1 {
  state BACKUP
  interface ens33
  virtual_router_id 51
  priority 50
  advert_int 1
  authentication {
      auth_type PASS
      auth_pass 1111
  }
  virtual_ipaddress {
      192.168.195.66
  }
}

启动systemctl start keepalived.service

我们可以通过192.168.195.66访问到我们的集群机器;

3)高可用集群测试

先修改页面192.168.195.129、192.168.195.132两台机器Nginx访问页内容

小李飞刀_Nginx


小李飞刀_Nginx


192.168.195.129、192.168.195.132开启keepalived

systemctl start keepalived.service

虚拟IP 【192.168.195.66】 生效,访问到的是keepalived主机对应的Nginx服务器(192.168.195.129)

小李飞刀_Nginx

192.168.195.129关闭keepalived,访问到的是keepalived备份机对应的Nginx服务器(192.168.195.132)

systemctl stop keepalived.service

小李飞刀_Nginx

如果主机(192.168.195.129)的keepalived再次开启的话,那么【192.168.195.66】会访问主机上的nginx;

整个高可用配置图如下

小李飞刀_Nginx



shell脚本优化集群配置


前面我们测试的情况是 keepalived挂掉的情况,实际情况是keepalived不容易挂掉,容易挂掉的是nginx; 所以这里就有有问题了,nginx挂了,但是keepavlied没挂,这时候 依然可以访问机器,但是访问不到服务; 所以这里需要借助keepalived的vrrp_script配置;来调用自定义shell脚本;

#!/bin/bash
echo 'xxxxxx'
count_nginx=`ps -ef|grep -w nginx|grep -v grep|wc -l`
echo $count_nginx
if [ $count_nginx -eq 0 ];then
  systemctl start nginx.service
   sleep 2
   if [ `ps -ef|grep -w nginx|grep -v grep|wc -l` -eq 0 ];then
      systemctl stop keepalived.service
   fi  
fi

这个shell脚本的意思是 统计nginx进程数,假如是0个 说明Nginx挂掉了,那就启动nginx,等2秒,再统计,假如还是0,说明nginx启动失败, 那我们就把keepalived也啥掉 切换备份机器,假如不是0,说明启动成功,那就继续运行;

把上面shell脚本命名nginx_check.sh文件,存/hone/shell/目录下; 下面是shell脚本测试; 切换shell目录

小李飞刀_Nginx


脚本没毛病,再配合Linux定时器,就可以解决nginx宕机问题;


over......


关键字:     反向代理       Nginx       keepalived       高可用       集群  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有