Nginx + keepalived 实现双机热备高可用

/ Nginx / 2 条评论 / 746人围观

keepalived是什么

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件

keepalived主要功能

  1. 管理LVS负载均衡软件
  2. 实现LVS集群节点的健康检查
  3. 作为系统网络服务的高可用性(failover)

keepalived故障转移

Keepalived高可用服务之间的故障切换转移,是通过 VRRP 来实现的。在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

keepalived的主从切换和redis的主从切换是不一样的,keepalived的主节点挂了以后,从节点变为主节点,之前的主节点恢复以后继续做主节点。redis的主节点挂了以后,重新恢复以后变为从节点。

keepalived高可用架构示意图

请输入图片描述 说明:

虚拟ip(VIP):10.167.201.56,对外提供服务的ip,也可称作浮动ip

10.167.201.57:nginx + keepalived master 主

10.167.201.58:nginx + keepalived backup 从

10.167.201.59:tomcat-8081

10.167.201.59:tomcat-8082

keepalived安装以及高可用配置

环境准备:

  1. centOS7
  2. JDK1.8
  3. 虚拟IP地址:10.167.201.56
  4. 三台服务器分别安装

10.167.201.57:nginx + keepalived master 主

10.167.201.58:nginx + keepalived backup 从

10.167.201.59:tomcat-8081

10.167.201.59:tomcat-8082

安装keepalived

下载压缩包

wget www.keepalived.org/software/keepalived-1.3.5.tar.gz

解压

tar -zxvf keepalived-1.3.5.tar.gz

进入解压缩以后的文件目录:

cd keepalived-1.3.5

编译安装:

./configure --prefix=/usr/local/keepalived

系统提示警告 *** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

yum -y install libnl libnl-devel

再次执行

./configure --prefix=/usr/local/keepalived

系统提示错误 configure: error: libnfnetlink headers missing

yum install -y libnfnetlink-devel

再次执行

./configure --prefix=/usr/local/keepalived

make && make install

安装完成后,进入安装目录的etc目录下,将keepalived相应的配置文件拷贝到系统相应的目录当中。keepalived启动时会从/etc/keepalived目录下查找keepalived.conf配置文件

mkdir /etc/keepalived

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived

修改keepalived.conf配置文件

主节点(master):

#bal_defs {             
 #   notification_email {
  #      zhangjianbing777@163.com  #设置报警邮件地址,可以设置多个,每行一个。需要开启sendmail服务。
   # }
   # notification_email_from 449246146@qq.com
   # smtp_server smtp.hysec.com   #设置SMTP Server地址
   # smtp_connection_timeout 30   #设置SMTP Server的超时时间
   # router_id nginx_master       #表示运行Keepalived服务器的一个标识,唯一的
#}
#检测脚本
vrrp_script chk_https_port {
    script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动
    interval 2                          #(检测脚本执行的间隔,单位是秒)
    weight 2                            #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {        
    state MASTER            # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface ens160         # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
    virtual_router_id 66    # 虚拟路由编号,主从要一直
    priority 100            # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
    #授权访问
    authentication {
        auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
        auth_pass 1111
    }
    track_script {
        chk_https_port            #(调用检测脚本)
    }
    virtual_ipaddress {
        10.167.201.56            # 定义虚拟ip(VIP),可多设,每行一个
    }
}

从节点(bankup):

#bal_defs {
 #   notification_email {
  #       zhangjianbing777@163.com  #设置报警邮件地址,可以设置多个,每行一个。需要开启sendmail服务。
   # }
   # notification_email_from 449246146@qq.com
   # smtp_server smtp.hysec.com #设置SMTP Server地址
   # smtp_connection_timeout 30 #设置SMTP Server的超时时间
   # router_id nginx_backup              # 设置nginx backup的id,在一个网络应该是唯一的
#}
#检测脚本
vrrp_script chk_https_port {
    script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动
    interval 2                          #(检测脚本执行的间隔)
    weight 2                            #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
    state BACKUP                        # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface ens160                     # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
    virtual_router_id 66                # 虚拟路由编号,主从要一直
    priority 99                         # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1                        # 检查间隔,默认为1s(vrrp组播周期秒数)
    #授权访问
    authentication {
        auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
        auth_pass 1111
    }
    track_script {
        chk_https_port                   #(调用检测脚本)
    }
    virtual_ipaddress {
        10.167.201.56                   # 定义虚拟ip(VIP),可多设,每行一个
    }
}

主要是网卡要写对

编写shell脚本

#!/bin/bash
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then    #如果nginx没有启动就启动nginx                        
      /usr/local/nginx/sbin/nginx                #重启nginx
      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重启失败,则停掉keepalived服务,进行VIP转移
              killall keepalived                    
      fi
fi

修改nginx配置文件

主从一样:

#user  nobody;
worker_processes  1;
events {
    worker_connections  1024;
}

https {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream mystory {
        server 10.167.201.59:8081 weight=1;
        server 10.167.201.59:8082 weight=1;
    }
    server {
        listen       80;
        server_name  10.167.201.56; # 配置VIP
        location / {
            root   html;
            index  index.html index.htm;
	    proxy_pass https://mystory;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

演示效果

1. 启动主从keepalived

/usr/local/keepalived/sbin/keepalived

启动keepalived的时候,有可能会遇到keepalived能起来,但nginx脚本未执行的情况。首先先看一下网卡是否配正确,再查看sh脚本文件的权限中有没有“X”这个字符,如图: 请输入图片描述 给文件添加权限命令:chmod u+x check_nginx_pid.sh 来授权。

通过命令 ps -ef | grep keepalived 和 ps -ef | grep nginx来查看是否启动成功 请输入图片描述 2. 停掉主节点的keepalived

keepalived的日志默认在/var/log/messages中

查看从节点的打印日志: 请输入图片描述 可见,从节点自动切换到了主节点。

3. 重新启动主节点的keepalived

查看从节点的打印日志: 请输入图片描述 可见,从节点由主节点自动切换到了从节点

到此,通过定义好的域名或者虚拟IP来访问项目,出现交替访问的效果,说明配置成功啦~

  1. 可以很详细啊

    回复

    @中国-北京网友 111

    回复