Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

时间:2022-03-04 00:33:41

拓扑环境

以下表格是这次測试须要的拓扑环境,几台server。每台server上安装什么,都有介绍。

server名称 系统版本号 预装软件 IP地址/VIP
Nginx主server CentOS 7 最小安装 Nginx +Keepalived 192.168.22.227/192.168.22.231
Nginx从server CentOS 7 最小安装 Nginx +Keepalived 192.168.22.228/192.168.22.231
WebserverA CentOS 7 最小安装 tomcat+jdk 192.168.22.229
WebserverB CentOS 7 最小安装 tomcat+jdk 192.168.22.230

前置条件

这是一个系列博客,假设有困难能够查看之前的博客。
server配置VIP:http://blog.csdn.net/u010028869/article/details/50574907
Keepalived安装见:http://blog.csdn.net/u010028869/article/details/50527817
Keepalived原理解析:http://blog.csdn.net/u010028869/article/details/50596805
Nginx动静分离、负载均衡:http://blog.csdn.net/u010028869/article/details/50522033

原理图

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

開始搭建

一、配置VIP

关于VIP(即虚拟IP)的作用,上篇博客《Keepalived原理篇》已经介绍过了。

227和228server须要配置同样的VIP。虚拟IP在某时刻仅仅能属于某一个节点。还有一个节点作为备用节点存在。当主节点不可用时。备用节点接管虚拟IP。成为主节点(即虚拟IP漂移至从节点),提供正常服务。

这个VIP就像个墙头草,两头跑,谁是主他就为谁服务。

配置VIP的博客。上面也有链接哦。

二、安装软件

依照上面的表格,在对应server上安装软件。安装过程不再多说了,有问题能够点击上面的博客链接哦。

三、配置Nginx

server上的Nginx配置:

     user nobody;

     worker_processes ;

     events{
worker_connections ;
} http{
#设置默认类型为二进制流
default_type application/octet-stream; server_names_hash_bucket_size ;
#指定来自client请求头的headerbuffer大小,设置为32KB
client_header_buffer_size 32k;
#指定client请求中较大的消息头的缓存最大数量和大小,这里是4个32KB
large_client_header_buffers 32k;
#上传文件大小
client_max_body_size 356m;
#nginx的HttpLog模块指定。指定nginx日志的输出格式,输出格式为access
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access日志存在未知
access_log /usr/local/nginx/logs/access.log access;
#开启高效模式文件传输模式。将tcp_nopush和tcp_nodelay两个指另设置为on。用于防止网络堵塞。
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#设置client连接保持活动的超时时间
keepalive_timeout ;
server_tokens off;
#client请求主体读取缓存
client_body_buffer_size 512k;
proxy_connect_timeout ;
proxy_send_timeout ;
proxy_read_timeout ;
proxy_buffer_size 16k;
proxy_buffers 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k; #fastcgi_connect_timeout ;
#fastcgi_send_timeout ;
#fastcgi_read_timeout ;
#fastcgi_buffer_timeout ;
#fastcgi_buffers 64k;
#fastcgi_busy_buffers_size 128k;
#fastcgi_temp_file_write_size 128k; #开启gzip
gzip on;
#同意压缩的最小字节数
gzip_min_length 1k;
#4个单位为16k的内存作为压缩结果流缓存
gzip_buffers 16k;
#设置识别HTTP协议版本号。默认是1.
gzip_http_version 1.1;
#gzip压缩比,可在1~9中设置。1压缩比最小。速度最快。9压缩比最大,速度最慢,消耗CPU
gzip_comp_level ;
#压缩的类型
gzip_types text/plain application/x-javascript text/css application/xml;
#让前端的缓存server混村经过的gzip压缩的页面
gzip_vary on; upstream mycluster{
server 192.168.22.229: weight=;
server 192.168.22.230: weight=;
} server{
listen ;
server_name 192.168.22.228;
charset utf-; #设置编码为utf-
#root html; #location / {
# root html;
# index index.html index.htm;
#} #location ~ .*\.(jsp|do|action)$
location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://mycluster;
# 真实的clientIP
proxy_set_header X-Real-IP $remote_addr;
# 请求头中Host信息
proxy_set_header Host $host;
# 代理路由信息,此处取IP有安全隐患
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 真实的用户訪问协议
proxy_set_header X-Forwarded-Proto $scheme;
}
#静态文件交给nginx处理
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{
root /usr/local/webapps;
expires 30d;
}
#静态文件交给nginx处理
location ~ .*\.(js|css)? $ { root /usr/local/webapps; expires 1h; } error_page /50x.html; location = /50x.html { root html; } } }

另外还须要在227,228server上新建一个文件夹/usr/local/webapps/drp/img,在img文件夹中存放图片girl.jpg。

假设Nginxserver较多的话。能够使用Rsync做服务端自己主动同步或者使用NFS、MFS分布式共享存储,避免一个个复制文件。

还有。这块Nginx配置是做过一些优化的,比方开启gzip压缩,开启高效文件传输模式。设置缓存,动静分离,负载均衡等,能够直接拿到项目中使用。

四、配置Keepalived

server上的Keepalived配置:

! Configuration File for keepalived

    #配置邮件相关信息
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
} #配置Nginx健康监測脚本
vrrp_script check_nginx {
script "</dev/tcp/127.0.0.1/8088"
interval 3
weight -2
} vrrp_instance VI_1 {
state MASTER
#网卡名称
interface eno16777736
virtual_router_id 151
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
} track_script {
check_nginx
} virtual_ipaddress {
192.168.22.231
}
}

228server上的Keepalived配置:

    ! Configuration File for keepalived

    global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
} vrrp_script check_nginx {
#script "/opt/chknginx.sh"
script "</dev/tcp/127.0.0.1/8088"
interval 3
weight -2
} vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 151
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
} track_script {
check_nginx
} virtual_ipaddress {
192.168.22.231
}
}

特别注意,Nginx健康监測脚本。

在本地写一个shell脚本,Keepalived监測不到。不知道为什么,网上的博客都是这么写的。可是在我这里就不行。最后直接在Keepalived配置文件的script标签中写了这段监測的脚本。才得以成功。

    vrrp_script chk_http_port {
script "</dev/tcp/192.168.22.227/80"
interval 1
weight -10
}

另外,假设你不明确某些配置的意思。能够查看上篇博客,里面针对每条配置文件都做了具体解析。

五、Tomcat配置

server,加入默认页

在Tomcat的webapps文件夹下新建文件夹drp,而且创建index.jsp页面

        <%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%> <HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Nginx+Keepalived高可用,负载均衡。动静分离測试</title>
</head> <body>
<h1>您正在訪问server:192.168.22.229</h1>
<img src="/drp/img/girl.jpg" alt="女孩" />
</body> </html>

230server同上

六、启动服务并測试

分别启动各个server上的Nginx、Keepalived、Tomcat,并測试是否能正常訪问。

①启动測试Tomcat

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

能够看到229和230server上的Tomcat已经能够正常訪问。图片没有载入出来,是由于图片没有在Tomcatserver上存储,而放在了Nginx上。

②启动測试Nginx

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

能够看到227和228上的Nginx启动成功。而且实现了负载均衡和动静分离的效果,图片被成功的载入了出来。

③ 保证全部服务均可正常訪问后,启动Keepalived測试。

启动227。228server上的Keepalived。在浏览器中输入地址:http://192.168.22.231:8088/drp/index.jsp

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

192.168.22.231是咱们设置的虚拟ip,在訪问站点的时候不在通过Nginx的ip了。而要通过这个vip进行訪问。

Keepalived启动后咱们能够通过查看/var/log 下的messages文件(日志文件),查看主从状态。
查看227server/var/log/messages:

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

能够看到227为Masterserver。那么咱们如今通过192.168.22.231訪问的就是227上的Nginx。

Nginx高可用測试

如今咱们通过两个方面来測试高可用:

① server层的双机热备。模拟方式为关闭server。或者关闭Keepalived。

a. 关闭227Keepalived进程

如今提供服务的是227server,使用命令service keepalived stop将227上的Keepalived进程关闭掉之后。

查看227servermessas日志:

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

将192.168.22.231这个虚拟ip移除,关闭Keepalived。

查看228servermessages日志:

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

228原来为从server。当227server宕机后,228server由从server升级为主server,而且绑定上192.168.22.231这个虚拟IP,以继续提供服务。站点能够继续訪问。

b. 启动227Keepalived

查看227servermessas日志:

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

Keepalived成功启动后。227server继续接管192.168.22.231,成为MASTERserver,继续提供服务。

查看228servermessages日志:

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

对应的228server。转变为BACKUPserver,而且移除VIP。

② 应用层的双机热备。模拟方式为Kill掉Nginx进程

a. 关闭227Nginx

查看227servermessages日志:

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

VRRP_Script(check_nginx) failed ,意思是健康监測脚本运行失败,表明Nginx服务坏掉,或者没有启动。然后Keepalived会使227server转变为BACKUP状态,移除VIP。

查看228servermessages日志:

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

当然不出所料,228server已经变为MASTER状态。从而继续提供服务。

b. 又一次启动227Nginx

查看227servermessages日志:

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

VRRP_Script(check_nginx) succeeded 。意思是健康监測脚本运行成功。Nginx正常运行。

然后227server就会转变为MASTER状态。并提供服务。

查看228servermessages日志:

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群

228server已经变为BUCKUP状态。

小结

至此,高可用的一系列測试就已经完毕了。在整个測试过程中,不管是关闭某台server的Nginx。Keepalived还是整个server宕机。站点一直没有中断提供服务,这已经达到了主要的高可用;可是还有个缺陷就是假设Nginx主server不出问题的话,那么备用server将长期处于备份状态。这种巨大资源浪费是不能容忍的。

当然这也有对应的方案来解决:Nginx双主集群+DNS轮询。敬请期待。。

这就是一个架构不断演变。进化的过程。

Nginx+Keepalived主从配置(双机主从热备)+Tomcat集群的更多相关文章

  1. 第十节&colon; 利用SQLServer实现Quartz的持久化和双机热备的集群模式 &colon;

    背景: 默认情况下,Quartz.Net作业是持久化在内存中的,即 quartz.jobStore.type = "Quartz.Simpl.RAMJobStore, Quartz&quot ...

  2. Redis安装、主从配置及两种高可用集群搭建

    Redis安装.主从配置及两种高可用集群搭建 一.            准备 Kali Linux虚拟机 三台:192.168.154.129.192.168.154.130.192.168.154 ...

  3. Jboss集群(五)--F5硬件负载均衡器双击热备 &plus; Jboss集群终极实现

    BIG/IP利用定义在其上面的虚拟IP地址来为用户的一个或多个应用服务器提供服务.因此,它能够为大量的基于TCP/IP的网络应用提供服务器负载均衡服务.BIG/IP连续地对目标服务器进行L4到L7合理 ...

  4. 使用Nginx&plus;Keepalived组建高可用负载平衡Web server集群

    一,首先说明一下网络拓扑结构: 1,Nginx 反向代理Server(HA):     ①Nginx master:192.168.1.157     ②Nginx backup:192.168.1. ...

  5. Docker下配置双机热备PXC集群

    架构: 步骤: 1.安装centos7   ,设置宿主机IP:192.168.1.224 2.先更新yum软件管理器,再安装docker 1.yum -y update 2.yum install - ...

  6. KeepAlived&plus;HaProxy&plus;MyCat&plus;Percona双机热备PXC集群

    一.搭建PXC集群 1.环境:centos7+PXC5.7.21+mycat1.6.5 2.卸载mariadb rpm -qa | grep mariadb* yum -y remove mariad ...

  7. mysql双机热备&plus;heartbeat集群&plus;自动故障转移

    环境说明:本环境由两台mysql 数据库和heartbeat 组成,一台的ip 为 192.168.10.197,一台为192.168.10.198,对外提供服务的vip 为192.168.10.20 ...

  8. Apache &plus; Tomcat集群配置详解 (1)

    一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...

  9. Nginx知多少系列之&lpar;十四&rpar;Linux下&period;NET Core项目Nginx&plus;Keepalived高可用(主从模式)

    目录 1.前言 2.安装 3.配置文件详解 4.工作原理 5.Linux下托管.NET Core项目 6.Linux下.NET Core项目负载均衡 7.负载均衡策略 8.加权轮询(round rob ...

随机推荐

  1. 直接使用提交过来的类来更新字段EntityState&period;Modified并过滤null值的方法

    public T Update<T>(T entity) where T : ModelBase { var set = this.Set<T>(); set.Attach(e ...

  2. Web 测试经验总结

    Web功能测试常用方法 1.页面链接检查每一个链接是否都有对应的页面,并且页面之间切换正确: 2.相关性检查删除/增加一项会不会对其他项产生影响,如果产生影响,这些影响是否都正确. 3.检查按钮的功能 ...

  3. Inside TSQL Querying - Chapter 1&period; Logical Query Processing

    Logical Query Processing Phases Summary (8) SELECT (9) DISTINCT (11) <TOP_specification> <s ...

  4. mysql 查询执行的流程

    1.客户端发送一个请求给服务器.2.服务器先检查查询缓存,命中了缓存,直接返回缓存中的数据,否则进入下一个阶段.3.服务器进行sql解析,预处理,再由优化器生成对应的执行计划.4.mysql根据执行计 ...

  5. 【转】 NSArray copy 问题

    转自:   http://blog.sina.com.cn/s/blog_6b1e4a060102uz0i.html   好久没写博客了,今天看到同事的代码中用到了 copy 这个 方法,之前也有了解 ...

  6. Java进阶03 IO基础

    链接地址:http://www.cnblogs.com/vamei/archive/2013/04/11/3000905.html 作者:Vamei 出处:http://www.cnblogs.com ...

  7. How to fix &&num;39&semi;sudo&colon; no tty present and no askpass program&&num;39&semi;以及硬盘序列号的读写

    在调用system命令读写硬盘序列号的过程中遇到问题,报错如下: sudo: no tty present and no askpass program 发现此问题是由于帐号并没有开启免密码导致的 . ...

  8. Zookeeper 笔记-应用场景

    应用场景:数据发布,订阅:分布式应用配置项:分布式计数器:统一命名服务:状态同步服务:集群管理:Master选举:分布式锁:定时任务争夺:分布式队列:分布式协调通知 特点:顺序一致性,原子性,单一视图 ...

  9. numpy版本查看以及升降

     如题,参考:https://zhuanlan.zhihu.com/p/29026597 pip show numpy 查看numpy版本; pip install -U numpy==1.12.0, ...

  10. SQLite保存报错sqlite&period;SQLiteConstraintException&colon; UNIQUE constraint failed&colon; &&num;183&semi;&&num;183&semi;&&num;183&semi;&&num;183&semi;&&num;183&semi;&&num;183&semi; code 1555

    往数据库里保存数据的时候报错,用的afinal框架,明明在save操作之前执行了一遍deleteAll操作,还是报错. 百度了一下说报这种错有两种情况:一是定义的字段为not null ,插入时对应的 ...