在前面的一篇文章《架构系列二:使用Nginx+tomcat实现集群部署》,介绍了通过Nginx配置Tomct集群,当其中一个Tomcat服务停止后,Nginx可自动识别并选择另一个服务器响应用户请求,达到了Tomcat集群的效果,那如果Nginx服务器停掉后,就会导致整个应用不可用,因此引入了keepalived,通过keepalived配置Nginx集群,保证Nginx的高可用性。
一、环境介绍
VM1:Ubuntu-S100 IP:192.168.130.128
VM2:Ubuntu-S101 IP:192.168.130.129
物理机:192.168.1.101 用于作客户端
JDK:1.8.0_171
Tomcat:apache-tomcat-7.0.62
Keepalived:
二、集群架构图
先看下引入keepalived后的集群架构图
我在两台VM上都安装了Nginx及Keepalived,一台作Master,另一台作Backup,同时在VM上还部署了Web应用,要实现的场景是,当Master不工作后,作为Backup的这台Nginx接替原来Master的工作,继续提供服务,保证应用的高可用
三、在VM2上安装Nginx
安装nginx就不介绍了,请参考《架构系列二:使用Nginx+tomcat实现集群部署》
安装完成后,进入到nginx安装目录/usr/local/nginx/sbin,进行sudo ./nginx -t检查nginx是否安装成功,如果出现如下结果,说明nginx已经安装成功
ubuntu@ubuntu-virtual-machine:/usr/local/nginx/sbin$ sudo ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
启动Nginx服务并校验
#启动nginx服务
ubuntu@ubuntu-virtual-machine:/usr/local/nginx/sbin$ sudo ./nginx
#检查nginx启动进程,发现启动了两个进程,一个master,一个worker
ubuntu@ubuntu-virtual-machine:/usr/local/nginx/sbin$ ps -ef | grep nginx
root 109164 8174 0 16:27 ? 00:00:00 nginx: master process ./nginx
nobody 109165 109164 0 16:27 ? 00:00:00 nginx: worker process
ubuntu 109245 101144 0 16:34 pts/4 00:00:00 grep --color=auto nginx
在浏览器中输入IP地址,校检nginx服务是否成功启动,如下结果说明Nginx服务已经启动成功
四、配置VM2上的Nginx+Tomcat集群
进入安装路径/usr/local/nginx/conf编辑nginx.conf文件,内容如下
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream myserver{
server 192.168.130.129:8080 weight=5 max_fails=2;
server 192.168.130.128:8080 weight=1 max_fails=2;
}
server {
listen 80;#监听80端口
server_name myserver;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://myserver; #这里的myserver必须要和upstream中指定的一致
#proxy_redirect on;
proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
重新检查并加载配置文件
ubuntu@ubuntu-virtual-machine:/usr/local/nginx/sbin$ sudo ./nginx -t
ubuntu@ubuntu-virtual-machine:/usr/local/nginx/sbin$ sudo ./nginx -s reload
由于我用的域名访问,因此还需要修改hosts文件,在/etc/hosts中增加如下记录
#192.168.130.129是当前VM2的IP
192.168.130.129 myserver
五、在VM1、VM2上安装Keepalived
登录http://www.keepalived.org/download.html,下载keepalived安装包,这里下载的是keepalived-1.4.5.tar.gz,先在VM1上安装keepalived
解压keepalived-1.4.5.tar.gz,得到keepalived-1.4.5目录
tar -xf keepalived-1.4.5.tar.gz
进入到keepalived-1.4.5目录下,执行如下命令安装keepalived
cd keepalived-1.4.5/
# 配置,指定安装目录
./configure --prefix=/usr/local/keepalived-1.4.5
# 编译nginx
sudo make
# 安装nginx
sudo make install
为了将keepalived做成系统服务,需要拷贝一些文件到指定的路径下,如下:
sudo mkdir /etc/sysconfig
sudo cp /usr/local/keepalived-1.4.5/etc/sysconfig/keepalived /etc/sysconfig/
sudo cp /usr/local/keepalived-1.4.5/sbin/keepalived /usr/sbin/
#注意这里是copy源码包中的文件,不是在安装目录的,这是一个启动keepalived服务的脚本,以守护进程方式运行
#Startup script for the Keepalived daemon
sudo cp /home/ubuntu/dev_tools/keepalived-1.4.5/keepalived/etc/init.d/keepalived /etc/init.d/
sudo mkdir /etc/keepalived
sudo cp /usr/local/keepalived-1.4.5/etc/keepalived/keepalived.conf /etc/keepalived/
注意,经过以上步骤后,keepalived的配置文件是/etc/keepalived/keepalived.conf,keepalived启动时,默认会读这个配置文件
在/usr/local/keepalived-1.4.5/bin目录下创建check_nginx.sh脚本文件,用于检测nginx的状态,脚本内容如下
#!/bin/sh
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
/usr/local/nginx/sbin/nginx
fi
sleep 2
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
service keepalived stop
fi
解释下上面脚本
1.统计nginx的进程,如果数量为0,则认为nginx没有启动,就启动nginx服务
2.等待2秒,再次统计nginx进程,如果数量还是0,则停止keepalived服务
配置VM1为Master
先看下VM1上的网卡信息
ubuntu@ubuntu-virtual-machine:~$ ifconfig
ens33 Link encap:以太网 硬件地址 00:0c:29:88:a0:46
inet 地址:192.168.130.128 广播:192.168.130.255 掩码:255.255.255.0
inet6 地址: fe80::414b:266b:ba4f:57e9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:519535 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:128982 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:752557831 (752.5 MB) 发送字节:9951982 (9.9 MB)
发现VM的网卡设备是ens33,这个参数在配置keepalived.conf文件时要用到,下面开始修改配置文件/etc/keepalived/keepalived.conf,最终配置如下
! Configuration File for keepalived
# global setting , notify email setting
global_defs {
#存在于同一个网段中,一组keepalived的各个节点都有不同的名字
#在全局设置中,我们还可以设置管理员的email信息等。
router_id LVS_V1
}
#这个上面介绍的检查脚本,我们保存在这个文件中(注意文件权限)
vrrp_script chknginx {
script "/usr/local/keepalived-1.4.5/bin/check_nginx.sh"
#每2秒钟,检查一次
interval 2
}
#keepalived实例设置,是最重要的设置信息
vrrp_instance VI_1 {
#state状态MASTER表示是主要工作节点。
#一个keepalived组中,最多只有一个MASTER节点,当然也可以没有
state MASTER
#实例所绑定的网卡设备
interface ens33
#同一个keepalived组,节点的设置必须一样,这样才会被识别
virtual_router_id 52
#节点优先级,BACKUP的优先级一定要比MASTER的优先级低
priority 100
#组播信息发送间隔,两个节点设置必须一样
advert_int 1
#实际的ens33上的固定ip地址
mcast_src_ip=192.168.130.128
#验证信息,只有验证信息相同,才能被加入到一个组中。
authentication {
auth_type PASS
auth_pass 1111
}
#虚拟地址和绑定的端口,如果有多个,就绑定多个
#dev 是指定浮动IP要绑定的网卡设备号
virtual_ipaddress {
192.168.130.100 dev ens33
}
#设置的检查脚本
#关联上方的“vrrp_script chknginx”
track_script {
chknginx
}
}
按以上步骤,在VM2上安装keepalived,安装完成后配置VM2为backup
配置VM2为BACKUP
先看下VM2上的网卡信息
ubuntu@ubuntu-virtual-machine:/usr/local/keepalived-1.4.5/bin$ ifconfig
ens33 Link encap:以太网 硬件地址 00:0c:29:40:cf:6a
inet 地址:192.168.130.129 广播:192.168.130.255 掩码:255.255.255.0
inet6 地址: fe80::37cf:3643:3082:32e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:509261 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:152992 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:747391907 (747.3 MB) 发送字节:10269294 (10.2 MB)
发现VM的网卡设备是ens33,这个参数在配置keepalived.conf文件时要用到,下面开始修改配置文件/etc/keepalived/keepalived.conf(这里将keepalived.conf文件作了下备份keepalived.conf.back),最终配置如下
! Configuration File for keepalived
# global setting , notify email setting
global_defs {
#存在于同一个网段中,一组keepalived的各个节点都有不同的名字
#在全局设置中,我们还可以设置管理员的email信息等。
router_id LVS_V1
}
#这个上面介绍的检查脚本,我们保存在这个文件中(注意文件权限)
vrrp_script chknginx {
script "/usr/local/keepalived-1.4.5/bin/check_nginx.sh"
#每2秒钟,检查一次
interval 2
}
#keepalived实例设置,是最重要的设置信息
vrrp_instance VI_1 {
#这里和Master不一样
state BACKUP
#实例所绑定的网卡设备
interface ens33
#同一个keepalived组,节点的设置必须一样,这样才会被识别
virtual_router_id 52
#节点优先级,BACKUP的优先级一定要比MASTER的优先级低
priority 99
#组播信息发送间隔,两个节点设置必须一样
advert_int 1
#这里和Master不一样,是VM2的IP
mcast_src_ip=192.168.130.129
#验证信息,只有验证信息相同,才能被加入到一个组中。
authentication {
auth_type PASS
auth_pass 1111
}
#虚拟地址和绑定的端口,如果有多个,就绑定多个
#dev 是指定浮动IP要绑定的网卡设备号
virtual_ipaddress {
192.168.130.100 dev ens33
}
#设置的检查脚本
#关联上方的“vrrp_script chknginx”
track_script {
chknginx
}
}
启动VM1,VM2上的keepalived服务
#启动
service keepalived start
#停止
service keepalived stop
我们配置的绑定在VM1上的浮动IP:192.168.130.100,通过ifconfig是查看不到的,要通过ip addr 命令才能查看到
到此,keepalived配置nginx集群就已经配置完成
配置集群后,怎么快速部署我们的应用呢?如果还一台一台机器部署,效率就太低了,能否实现一键部署的功能呢,请看:《架构系列四:一键部署应用到Tomcat集群中》
参考博文:https://blog.csdn.net/love_is_simple/article/details/47903527