最近看很多文章,总是很难看懂。主要是感觉作者上手就来,没有整理整个方案的思路,导致我费了半天心思来理解整个框架。好吧,我们不能沉浸在自己的世界里写文章,这样的文章是没有灵魂的:)
好了!我先整理一下这个搭建框架的思路。
keepalived+nginx+tomcat+redis ,这么一长串英文,索性就用KNTR来表示了,下文中提到KNTR,就是代表这个框架。
KNTR是一套完善的服务防灾体系,通过软件服务的有机结合,将tomcat数量增加,通过数量优势,可以有效防止服务出现宕机的现象。
我们一般的web服务只有一个tomcat,一即所有,一损俱损。如果有两个tomcat、三个tomcat,甚至更多的tomcat,那么坏一个又有什么关系呢?本着这种思想,KNTR就出现了。
本篇文章,就重点说明一下如何通过KNTR实现有效的防灾,实现应用服务的高可靠性。
顾名思义,keepalived就是保持活着的意思。在KNTR框架中,keepalived一直监控着本机的nginx的状态,同时也时刻监听着备用机器上的心跳,此外,keepalived还虚拟生成一个IP,简称VIP。简言之:
(1)监控nginx
(2)主备心跳同步
(3)虚拟IP
这里解释一下,为什么要增加keepalived。
这个方案使用nginx来保障tomcat的稳定运行,那么靠什么来保障nginx的稳定运行的呢?答案就是keepalived。
keepalived通过定时执行nginx的监控脚本,来保障nginx的稳定,同时通过监控主备机间的心跳,通过权重的大小产生主备的切换(虚拟ip的飘移)。
这里nginx的作用主要是实现负载均衡,使得tomcat互为主备。负载均衡就是平均(或按权重)分配任务,使得web服务之间分摊任务。
tomcat的作用主要是发布web服务。我们能访问到的网页页面,都是tomcat的功劳。
redis这里是作session共享之用。所谓session共享,就是将用户的请求在tomcat之间共享,让所有的tomcat保持同步。(好像不是很严谨)
192.168.10.13 | 192.168.10.14 |
---|---|
主机 | 备机 |
tomcat-1 | tomcat-2 |
nginx-1 | nginx-2 |
keepalived-1 | keepalived-2 |
/ | redis |
本次操作案例是在centos7.3版本下进行的,在操作之前,请准备以下工具:
名称 | 版本/安装包 |
---|---|
操作系统 | centos7.3_DVD |
JDK | java 1.8.0_102 |
keepalived | keepalived-2.0.20.tar.gz |
nginx | nginx-1.17.10.tar.gz |
tomcat | apache-tomcat-8.5.54.tar.gz |
redis | redis-5.0.8.tar.gz |
用途 | IP |
---|---|
主节点 | 192.168.10.13 |
备节点 | 192.168.10.14 |
虚拟IP | 192.168.10.15 |
注:将安装包统一放置到linux操作系统的/opt目录下。
环境安装这里还是简单介绍一下吧,因为很多基本的东西,看似很简单,但是也往往容易忽略,而且忽略了就很麻烦,这里还是再多说一下吧!
操作系统安装的时候,千万不要偷懒图快,最好不要选择最小化安装,最好选择最大化安装。这里的软件安装包都是需要编译安装,其中需要很多依赖关系。如果操作系统是最小化安装,请做个yum源吧。。。
之前写过一个jdk一键安装的脚本,需要的话可以自行获取。
一键安装,简单方便。
传送门:https://download.csdn.net/download/weixin_43968988/11390695
这里下载的是二进制的安装包,所以采用编译安装的方法。编译安装可以指定安装目录,安装位置如下表所示:
项目 | 内容 |
---|---|
安装位置 | /usr/local/redis |
配置文件 | /usr/local/redis/redis.conf |
(1)解压
cd /opt
tar -zxvf redis-5.0.8.tar.gz
(2)安装
cd /opt/redis-5.0.8
make
make install PREFIX=/usr/local/redis
(3)启动
cd /usr/local/redis/bin
./redis-server
执行成功,无报错,使用ps -ef|grep redis命令检查进程,进程存在即说明安装成功。
注:redis配置文件安装后是不会存在于/usr/local/redis/目录下的,需要从解压后的文件中拷贝一份至/usr/local/redis/中。
(4)复制配置文件
cp /opt/redis-5.0.8/redis.conf /usr/local/redis/
至此安装结束…
redis最关键的是修改redis.conf文件,修改以下两项内容:
项目 | 值 |
---|---|
redis.conf | 修改bind 127.0.0.1为 bind 192.168.10.14 |
密码 | redis123 |
vi /usr/local/redis/redis.conf
将bind 其余信息全部注释,在其下方增加下面一行内容:
bind 192.168.10.14
注:要想其他服务器可以远程访问,一定要将redis绑定本机IP,其他服务器可以远程访问本机IP连接redis。若是bind127.0.0.1,其他主机是没有办法访问的。
在redis配置文件中找到requirepass 这一行,将其注释掉,并在下方增加下面命令。
reqiurepass redis123
首先在192.168.10.14上将redis启动后,在192.168.10.13上测试redis的连接。
在192.168.10.13上执行如下命令:
(1)连接
redis-cli -h 192.168.10.14 -p 6379 -a redis123
(2)获取密码
192.168.10.14:6379>config get requirepass
(3)结果
1)"reqiurepass"
2)"redis123"
出现以上信息,即说明redis安装配置成功,可进行下一步。
附:
redis安装教程
tomcat的安装就不细说了,因为确实没有什么内容。
tomcat安装教程
tomcat配置需要尤为注意,此处涉及如何连接redis。
cd /opt/tomcat/conf
cat server.xml
找到下面一段代码,这里规定了tomcat开放的端口8080,可以根据自己喜好修改,只要端口不冲突就行。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
此次实操,使用的tomcat8.5版本,所以配置文件、jar包都是按照这个标准进行配置的。
(1)修改context.xml文件
vi /opt/tomcat/conf/context.xml
在context文件中增加一句话
<context>
...省略部分内容
<Valve className="com.naritech.nicole.gump.RedisSessionHandlerValve" />
<Manager className="com.naritech.nicole.gump.RedisSessionManager"
host="192.168.10.14"
port="6379"
password="redis123"
database="0"
maxInactiveInterval="60"
/>
</context>
(2)增加jar包工具
在/opt/tomcat/lib文件夹下增加jar包工具,用来连接redis。工具如下:
commons-pool2-2.3.jar
jedis-2.7.3.jar
tomcat-redis-session-manager-master-2.0.0.jar
下载链接:tomcat连接redis的jar包
在/opt/tomcat/webapps/test/下增加index.jsp文件
mkdir -p /opt/tomcat/webapps/test/
touch /opt/tomcat/webapps/test/index.jsp
192.168.10.13 上tonmcat的index.jsp文件内容:
<html>
<body bgcolor="red">
<div>
<%= request.getSession().getId() %>
<h1>192.168.10.13</h1>
</div>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%><BR>
SessionIP:<%=request.getServerName()%> <BR>
SessionPort:<%=request.getServerPort()%>
192.168.10.14 index.jsp文件内容:
<html>
<body bgcolor="yellow">
<div>
<%= request.getSession().getId() %>
<h1>192.168.10.14</h1>
</div>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%><BR>
SessionIP:<%=request.getServerName()%> <BR>
SessionPort:<%=request.getServerPort()%>
重启两台服务器上tomcat,保证日志没有报错,可以通过在浏览器上输入访问地址,正常打开页面。
http://139.2.136.13:8080/test/index.jsp
http://139.2.136.14:8080/test/index.jsp
(1)解压
cd /opt
tar -xvf nginx-1.17.10.tar.gz
(2)编译
cd /opt/nginx-1.17.10
make
make install --prefix=/usr/local/nginx
(3)启动
cd /usr/local/nginx/sbin
./nginx
(4)关闭
./nginx -s stop
因为使用编译安装,可以指定安装目录,在安装目录下知道nginx的配置文件,并编辑。
cd /usr/local/nginx/conf/
vi nginx.conf
【配置文件】
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
upstream tocmat{
server 192.168.10.13:8080
server 192.168.10.14:8080
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://tomcat;
proxy_set_header X-NGINX "NGINX-1" ;
}
}
}
配置文件的核心内容如上文件所示,修改完IP端口后,可以直接复用。
使用命令,启动nginx.
cd /usr/local/nginx/sbin
./nginx
保证可以实现访问任意一个nginx,均可访问到tomcat发布的web服务页面。在浏览器上分别输入以下两个IP地址访问:
http://139.2.136.13:80/test/index.jsp
http://139.2.136.14:80/test/index.jsp
在不断的刷新中,页面背景颜色在红色和黄色之间进行切换,切换比例是1:1。
项目 | 绝对路径 |
---|---|
安装包 | /opt/keepalived-2.0.20.tar.gz |
安装位置 | /usr/local/keepalived/ |
配置文件 | /etc/keepalived/keepalived.conf |
应用程序 | /usr/local/keepalived/sbin/keepalived |
(1)解压
cd /opt
tar -zxvf keepalived-2.0.20.tar.gz
(2)编译
cd /opt/keepalived-2.0.20
make
make install --prefix=/usr/local/keepalived
(3)启动
cd /usr/local/keepalived/sbin
./keepalived
(4)关闭
killall keepalived
(1)配置
cd /etc/keepalived
vi keepalived.conf
可将如下文件直接替换原文件,根据情况修改修改。
【主机配置文件】
! Configuration File for keepalived
#邮件配置,不需要可以忽略
global_defs {
notification_email {
root@localhost #改为本机
}
notification_email_from [email protected]
smtp_server localhost #改为localhost
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#nginx探测脚本
vrrp_script check_nginx {
script "/ect/keepalived/chech_nginx.sh"
interval 3 #执行周期,3秒一次
weight -20 #权重
}
#核心配置
vrrp_instance VI_1 {
state MASTER #主机配置MASTER,备机配置BACKUP
interface eth0 #网卡名称,以本机在用网卡为准
virtual_router_id 51
priority 100 #权重,主机值要大于备机值,主备间抢夺虚拟IP
advert_int 1
authentication {
auth_type PASS #主备间的验证方式,密码验证
auth_pass 1111 #主备相同
}
virtual_ipaddress {
192.168.10.15/16 dev eth0 #虚拟IP,亦VIP
}
track_script {
check_nginx #追踪脚本执行
}
}
#还有很多不用的配置内容,这里直接删了
(2)增加nginx监测脚本
①编辑
vi /etc/keepalived/chech_nginx.sh
②添加内容
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ]; then
/usr/local/nginx/sbin/nginx
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ]; then
killall keepalived
fi
fi
③保存
:wq
④授权
cd /etc/keepalived/
chmod 777 chech_nginx.sh
(3)启动
cd /usr/local/keepalived/sbin
./keepalived
至此,主机安装配置完成。
备机与主的配置基本一致,其中keepalived的配置文件替换一下即可。
【备机配置文件】
! Configuration File for keepalived
#邮件配置,不需要可以忽略
global_defs {
notification_email {
root@localhost #改为本机
}
notification_email_from [email protected]
smtp_server localhost #改为localhost
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#nginx探测脚本
vrrp_script check_nginx {
script "/ect/keepalived/chech_nginx.sh"
interval 3 #执行周期,3秒一次
weight -20 #权重
}
#核心配置
vrrp_instance VI_1 {
state BACKUP #主机配置MASTER,备机配置BACKUP
interface eth0 #网卡名称,以本机在用网卡为准
virtual_router_id 51
priority 99 #权重,主机值要大于备机值,主备间抢夺虚拟IP
advert_int 1
authentication {
auth_type PASS #主备间的验证方式,密码验证
auth_pass 1111 #主备相同
}
virtual_ipaddress {
192.168.10.15/16 dev eth0 #虚拟IP,主备一致
}
track_script {
check_nginx
}
}
先将主机192.168.10.13和备机192.168.10.14两台服务器上的keepalived开启,观察IP的状态
输入命令
ip a
正常情况下应该如下所示:
192.168.10.13结果
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:14:59:9d brd ff:ff:ff:ff:ff:ff
inet 192.168.10.13/24 brd 192.168.63.255 scope global dynamic eth0
inet 192.168.10.15/24 brd 192.168.63.255 scope global dynamic eth0
valid_lft 299523255sec preferred_lft 299523255sec
192.168.10.14结果
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:14:59:9d brd ff:ff:ff:ff:ff:ff
inet 192.168.10.14/24 brd 172.17.191.255 scope global dynamic eth0
valid_lft 299523255sec preferred_lft 299523255sec
(1)关闭1个tomcat,检查页面访问情况
(2)关闭1个nginx,检查页面访问情况
(3)关闭1个keepalived,检查页面访问情况
编译过程中,如果缺少依赖关系,注意看报错日志,遵循“缺什么,补什么”的原则,将所需要的的依赖包补齐。安装过程中,必须是上一步成功后,再执行下一步,不要越级执行命令。
配置过程中,一定要注意注释部分小心配置。