暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

高可用神器:Nginx负载均衡与KeepAlived高可用实践

Happy IT 2017-09-03
445



1、背景介绍

由于当前业务系统使用Tomcat单机承载业务,时刻面临着单机故障。为了提高业务系统的高可用性,避免单点故障、甚至因硬件故障造成的停机,造成不良的影响,以及经济损失。需要考虑解决前端系统高可用性,增强系统访问吞吐量及数据处理能力。负载均衡可以将负载分发到多个服务器共同分担,能够解决单个服务器时面临的大量并发访问造成的内存、CPU、I/O等的高负载问题。

我们决定采用Nginx+KeepAlived这对最佳拍档来实现业务高可用,NGINX做负载均衡分发到两台tomcat应用服务器,哪怕其中一台tomcat服务异常,nginx通过负载高可用配置自动转发到正常的tomcat服务器上面。却保系统7*24小时在线服务。而keepAlived是为了保障两台nginx服务器的高可用,一旦nginx服务存在故障,keepAlived的VIP自动切换到正常的nginx服务器上面去。以保障系统不终止服务,就能更好的提供服务。


2、开源组件介绍

本方案是为了解决客户应用系统单点故障,同时为了减轻系统性能压力引发的故障问题,现需要在web前端放置nginx负载均衡,同时结合keepAlived对前端nginx实现HA高可用。

1、Nginx组件介绍

Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

nginx进程基于Master+Slave(worker)多进程模型,自身具有非常稳定的子进程管理功能。在Master进程分配模式下,Master进程永远不进行业务处理,只是进行任务分发,从而达到Master进程的存活高可靠性,Slave(worker)进程所有的业务信号都 由主进程发出,Slave(worker)进程所有的超时任务都会被Master中止,属于非阻塞式任务模型。

2、KeepAlived组件介绍

KeepAlived是一种高性能的服务器高可用或热备解决方案,KeepAlived 可以用来防止服务器单点故障的发生,通过配合Nginx可以实现WEB前端服务的高可用。

KeepAlived是Linux下面实现VRRP备份路由的高可靠性运行件。基于Keepalived设计的服务模式能够真正做到主服务器和备份服务器故障时IP瞬间无缝交接。二者结合,可以构架出比较稳定的软件LB方案。


3、负载均衡架构图


4、高可用实践

4.1、主机规划

主机名

IP地址

操作系统

用途

软件


Web1

虚拟IP:192.168.56.100
物理IP:192.168.56.101

Centos7.2

Keepalived master
 nginx

Keepalived1.12.18
 Nginx1.10.3



Web2

物理IP:192.168.56.102

Centos7.2

Keepalived backup
 nginx

Keepalived1.12.18
 Nginx1.10.3



Web3

物理IP:192.168.56.103

Centos7.2

应用服务器

Tomcat7、java1.8



Web4

物理IP:192.168.56.104

Centos7.2

应用服务器

Tomcat7、java1.8




4.2 、软件信息

Nginx 1.10.3

Keepalived 1.12.18

Tomcat7

java1.8


4.3 、安装tomcat与jdk软件

需要在web3~web4这两台应用服务器部署java和tomcat软件,然后发布应用程序到这两台服务器。

1、软件下载

tomcat下载地址

http://apache.fayea.com/tomcat/tomcat-7/v7.0.77/bin/apache-tomcat-7.0.77.tar.gz

java下载地址

http://download.oracle.com/otn/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.tar.gz

2、安装JDK

1)、上传java软件到应用服务器主机

ftp jdk-8u121-linux-x64.tar.gz

2)、解压软件包

tar xzvf jdk-8u121-linux-x64.tar.gz  –C /usr

3)、配置环境变量

打开文件/etc/profile并在文件末尾添加

export  JAVA_HOME=/usr/jdk1.8.0_121 
 export PATH=$JAVA_HOME/bin:$PATH 
 export  CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 

然后执行命令生效环境变量source /etc/profile

4)、验证jdk安装

java –versoin

3、安装tomcat

1)、上传tomcat软件到两台应用服务器上面

ftp apache-tomcat-7.0.77.tar.gz

2)、安装tomcat

tar xvzf apache-tomcat-7.0.77.tar.gz  –C /opt

然后解压的目录程序在/opt/apache-tomcat-7.0.77

软件安装完毕!

4、tomcat部署应用程序包

1)、上传代码包test.war(举例部署一个测试包

ftp test.war

2)、将代码包部署到tomcat应用服务器

cp test.war  /opt/apache-tomcat-7.0.77/webapps

3)、启动tomcat服务

/opt/apache-tomcat-7.0.77/bin/shutdown.sh

/opt/apache-tomcat-7.0.77/bin/startup.sh

4)、访问代码

http://192.168.56.103:8080/test

http://192.168.56.104:8080/test


4.4、Nginx软件安装

需要在web1~web2这两台服务器部署nginx软件,然后执行下面操作。

1、安装Nginx软件

1)、软件下载

wegt http://nginx.org/download/nginx-1.10.3.tar.gz

2)、安装nginx依赖包

yum -y install pcre-devel  gcc*   #支持正则的pcre模块

yum -y install openssl  openssl-devel

3)、解压和安装nginx

tar -xvzf   nginx-1.10.3.tar.gz  -C /opt

cd /opt/nginx-1.10.3

./configure  --prefix=/usr/local/nginx \

--sbin-path=/usr/local/nginx/nginx  \

--conf-path=/usr/local/nginx/nginx.conf  \

--pid-path=/usr/local/nginx/nginx.pid

make && make  install

4)、测试nginx是否安装成功

/usr/local/nginx/nginx  -t

出现一下信息安装成功

nginx: the configuration file  /usr/local/nginx/nginx.conf syntax is ok

nginx: configuration file  /usr/local/nginx/nginx.conf test is successful

2、配置负载均衡策略

编辑配置文件/usr/local/nginx/conf.d/app_tomcat.conf

##负载均衡采用轮询策略

upstream localhost{ 

       server 192.168.56.103:8080;

       server 192.168.56.104:8080; 

     }

    server {

        listen       81;

        server_name  192.168.56.101;

        location / {

            proxy_pass http://localhost;

            root   html;

            index  index.html index.htm;

        }

        access_log   logs/access_api.log ;

注意:另一台主机配置也是一样

3、启动nginx服务

/usr/local/sbin/nginx 


4.5、安装keepAlived软件

需要在web1~web2这两台服务器部署keepalived软件,然后执行下面操作。

1、下载 keepalived到 /usr/local/src 目录

wget  http://www.keepalived.org/software/keepalived-1.2.18.tar.gz

2、解压安装

tar -zxvf keepalived-1.2.18.tar.gz   -c /usr/local/src

cd /usr/local/src/keepalived-1.2.18 

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

make && make install   

3、将 keepalived 配置成Linux 系统服务

#复制默认配置文件到默认路径   

mkdir /etc/keepalived 

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

#复制 keepalived 服务脚本到默认的地址 

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/init.d/ 

cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/ 

ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/ 

4、设置 keepalived 服务开机启动

chkconfig keepalived on 

5、修改 Keepalived 配置文件

在MASTER 节点配置文件/etc/keepalived/keepalived.conf(192.168.56.101)

global_defs {

  router_id 192.168.56.101   ##指定本机物理主机IP

}

vrrp_script chk_nginx {

   script  "/etc/keepalived/nginx_check.sh" ## 检测 nginx服务状态

   interval 2 ## 检测时间间隔

   weight -20 ## 如果条件成立,权重-20

}

vrrp_instance VI_1 {

   state MASTER      ##指定这台主机keepalived为主节点

   interface enp0s8  ##指定物理网卡接口

   virtual_router_id 11 ## 虚拟路由的ID号,两个节点设置必须一样,建议用IP最后段

   mcast_src_ip  192.168.56.101 ##指定本机物理主机IP

   priority 100 ## 节点优先级,值范围0-254,MASTER要比BACKUP高

   nopreempt ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题

   advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样,默认 1s

   ## 设置验证信息,两个节点必须一致

   authentication {

      auth_type PASS

      auth_pass 1111

   }

   ## 将 track_script 块加入 instance 配置块

      track_script {

      chk_nginx ## 执行 Nginx 监控的服务

   }

   ## 虚拟 IP 池, 两个节点设置必须一样

   virtual_ipaddress {

      192.168.56.100 ## 虚拟ip,可以定义多个

   }

}

 

Keepalived Backup
备机节点配置文件(192.168.56.102)

global_defs {

  router_id  192.168.56.102    ##指定备机物理主机IP

}

vrrp_script chk_nginx {

   script  "/etc/keepalived/nginx_check.sh"  ##检测 nginx服务状态

   interval 2

   weight -20

}

vrrp_instance VI_1 {

   state BACKUP   ##指定这台主机keepalived为备节点

   interface enp0s8 ##指定物理网卡接口

   virtual_router_id 11

   mcast_src_ip 192.168.56.102  ##指定本机物理主机IP

   priority 90

   advert_int 1

   authentication {

      auth_type PASS

      auth_pass 1111

   }

   track_script {

      chk_nginx

   }

   virtual_ipaddress {

      192.168.56.100  ## 虚拟ip,可以定义多个

   }

}

6、Nginx状态检测脚本

/etc/keepalived/nginx_check.sh

脚本:如果nginx停止运行,尝试启动,如果无法启动则杀死本机的keepalived进程,

keepalied将虚拟ip绑定到 backup机器上。内容如下:

#!/bin/bash

A=`ps -C nginx --no-header |wc -l`

if [ $A -eq 0 ];then

    /usr/local/nginx/nginx -c  /usr/local/nginx/nginx.conf

    sleep 2

    if [ `ps -C nginx  --no-header |wc -l` -eq 0 ];then

        ps -ef |grep  keepalived|grep -v grep |awk '{print  $2}'|xargs kill

    fi

fi

7、启动 Keepalived

systemctl start keepalived


4.6、高可用测试

1、
关闭Keepalived主节点(192.168.56.101)上面的 Nginx服务后,Keepalived服务是否自动会将将nginx服务拉起来,前端业务无感知。

验证结果:
(1)
、杀掉nginx服务进程,keepalived自动拉起nginx服务。
(2)
、浏览器访问应用192.168.56.100:81/test,服务正常
2、
模拟Keepalived主节点(192.168.56.101)宕机或是Keepalive服务挂死务,VIP 会自动切换到Keepalived备节点(192.168.56.102)上面 ,前端业务无感知。

验证结果:

(1)、模拟停止keepalived服务或模拟主机宕机,VIP正常自动切换到keepalive备机。

(2)、
浏览器访问应用192.168.56.100:81/test,服务正常。

3、
重新启动Keepalived主节点( 192.168.56.101)上面的Keepalived服务,VIP 又会切回到 Keepalived主节点(192.168.56.101)上面。

验证结果:

(1)、
恢复keepalive主节点,VIP正常回切到keepalive主节点。

(2)、
浏览器访问应用192.168.56.100:81/test,服务正常。



文章转载自Happy IT,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论