| 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 | Centos7.2 | Keepalived master | Keepalived1.12.18 | |
Web2 | 物理IP:192.168.56.102 | Centos7.2 | Keepalived backup | Keepalived1.12.18 | |
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 然后执行命令生效环境变量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,可以定义多个 } }
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,服务正常。




