docker 安装及配置 nginx + tomcat(四):高可用

news/2024/7/7 21:46:46 标签: docker, nginx, tomcat

文章目录

  • 1. 引言
  • 2. 高可用架构
  • 3. 实际步骤
    • 3.1 虚拟机新建系统
    • 3.2 安装 keepalived
    • 3.3 配置 keepalived
    • 3.4 启动 keepalived
    • 3.5 验证高可用
      • 3.5.1 查看当前效果
      • 3.5.2 模拟灾难
  • 4 参考


1. 引言

前情提要:
docker 安装及配置 nginx + tomcat(一):基础安装》
docker 安装及配置 nginx + tomcat(二):负载均衡》
docker 安装及配置 nginx + tomcat(三):动静分离》
本文主要描述在在 nginx + tomcat 基础上实现高可用。

2. 高可用架构

高可用(High Availability,简称HA)是分布式系统架构设计中必须考虑的因素之一,它通常是指通过设计减少系统不能提供服务的时间。高可用的主要目的是为了保障“业务的连续性”,即在用户眼里,业务永远是正常对外提供服务的。

对于我们这里就是避免单点故障,当某个 nginx 服务器出现问题之后可以切到到其他的 nginx 服务。

先看下最终的架构图:
在这里插入图片描述

3. 实际步骤

3.1 虚拟机新建系统

为了模拟高可用的场景,需要在两台机器上模拟,在虚拟机上再开一台机器,作为 nginx 备服务器,如果在阿里云或者其他服务器上有两台机器也可以模拟。

Mac 系统可以参考这篇文章 《Mac VMware Fusion 安装 Centos 系统》 用虚拟机再来开一台机器。

在新的机器上,参考 《docker 安装及配置 nginx + tomcat(一):基础安装》 安装 dockernginx 等(tomcat 可不安装),并启动 nginx 容器。

新机器的 nginx 配置如下:

# 高可用
upstream testservers {
  server 172.16.2.128:8080; # 指向之前实际的 tomcat 服务器1,如果不需要,可以去掉
  server 172.16.2.128:8081; # 指向之前实际的 tomcat 服务器2,如果不需要,可以去掉
  server 172.16.2.128:8082; # 指向之前实际的 tomcat 服务器3,如果不需要,可以去掉
}
server {
    listen       80;
    listen  [::]:80;
    server_name  172.16.2.129;  # 当前新机器的主机 ip

    #access_log  /var/log/nginx/host.access.log  main;

    location = / {
        root   /usr/share/nginx/html;
        proxy_pass http://testservers;
        index  index.html index.htm;
    }

    location ^~ /static {
    	root /data/;
        index index.html;
    }

    location / {
	proxy_pass http://testservers;
    }
    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

注意 nginx 配置修改了后,记得重启服务,否则不生效!

# 在容器里
nginx -s reload
# 在容器外
docker exec -it nginx nginx -s reload

3.2 安装 keepalived

在主、备机器上均需下载 keepalived,如下:

yum install -y keepalived       # CentOS 7 / RHEL 7
dnf install -y keepalived       # CentOS 8 / RHEL 8

3.3 配置 keepalived

在主机器上,/etc/keepalived/keepalived.conf 上配置如下:

! Configuration File for keepalived

global_defs {
   router_id node01  # 路由 id: 当前安装 keepalived 节点主机的标识符,全局唯一
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script check_nginx {
   script "/etc/keepalived/check_nginx.sh" # 检查 nginx 是否正常工作的脚本
   interval 2 # 脚本检测间隔,单位为秒
   weight -10
   fall 3 	# 连续检测3次失败就算失败,每次失败优先级减去 weight 的值
   rise 2 	# 连续检测2次成功就算成功
}

vrrp_instance VI_1 {
    state MASTER		# 表示当前为 ngxin 的主节点,master
    interface ens160	# 当前实例绑定的网卡名称: ifconfig 或者 ip a 可以查看
    virtual_router_id 51 # 虚拟路由 id,保证主备节点一致
    priority 100 		# 优先级,主的优先级设置的应该比备高
    advert_int 1		# 主备之间同步检查的时间间隔,默认1s
    authentication {	# 认证授权的密码
        auth_type PASS
        auth_pass 1111
    }
    # vip,保证主备一致,且最好跟主机 ip 在同一个网段下,例如我的主机 ip 是 172.16.2.128
    virtual_ipaddress {	
        172.16.2.120
    }
    # 检查的脚本
    track_script {
        check_nginx
    }
}

在备机器下,/etc/keepalived 上配置如下:

! Configuration File for keepalived

global_defs {
   router_id node02  # 路由 id: 当前安装 keepalived 节点主机的标识符,全局唯一
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script check_nginx {
   script "/etc/keepalived/check_nginx.sh" # 检查 nginx 是否正常工作的脚本
   interval 2 # 脚本检测间隔,单位为秒
   weight -10
   fall 3 	# 连续检测3次失败就算失败,每次失败优先级减去 weight 的值
   rise 2 	# 连续检测2次成功就算成功
}

vrrp_instance VI_1 {
    state BACKUP		# 表示当前为 ngxin 的主节点,backup
    interface ens160	# 当前实例绑定的网卡名称: ifconfig 或者 ip a 可以查看
    virtual_router_id 51 # 虚拟路由 id,保证主备节点一致
    priority 90 		# 优先级,主的优先级设置的应该比备高
    advert_int 1		# 主备之间同步检查的时间间隔,默认1s
    authentication {	# 认证授权的密码
        auth_type PASS
        auth_pass 1111
    }
    # vip,保证主备一致,且最好跟主机 ip 在同一个网段下,例如我的主机 ip 是 172.16.2.129
    virtual_ipaddress {	
        172.16.2.120
    }
    # 检查的脚本
    track_script {
        check_nginx
    }
}

主、备的区别在于 router_id、state、priority 的配置。

主、备机器都需要放置检测脚本 /etc/keepalived/nginx_check.sh ,内容如下:

A=`curl localhost:80/index.html --connect-timeout 3`
if [ $A -eq 0 ]; then
  ps -ef|grep keepalived|grep -v grep|awk '{print $2}'|xargs kill -9
fi

3.4 启动 keepalived

主、备机器,都需执行如下命令:

systemctl start keepalived.service

查看 vip 是否生效:

ip a 
# 或者 
ifconfig

在这里插入图片描述

3.5 验证高可用

3.5.1 查看当前效果

通过 keepalived 设置的 vip 访问,注意我这里是配置了负载均衡,后端有3个 tomcat 服务器,如果想达到同样的效果,请参考前两章的内容。如果没有配置 tomcat 服务器,请直接访问 vip 即可,不用带上 /test/test.html

以下是通过 vip 结合负载均衡的效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.5.2 模拟灾难

停止主机房的 nginx 容器

docker stop nginx

在这里插入图片描述
停止之后,整体架构退化成如下:
在这里插入图片描述

停止容器之后,由于 keepalived 脚本无法访问 nginx 服务异常,自动切换到备机器。此时还是访问 vip,注意服务是否中断。
在这里插入图片描述
服务依然正常,说明高可用已经生效。

4 参考

docker 安装及配置 nginx + tomcat(一):基础安装》
docker 安装及配置 nginx + tomcat(二):负载均衡》
docker 安装及配置 nginx + tomcat(三):动静分离》


http://www.niftyadmin.cn/n/5275107.html

相关文章

母猪智慧养殖VR虚拟互动教学给予学生充分的自主性和创新-深圳华锐视点

为了保障养殖场生物安全、避免疫情传播,学生开展育肥猪养殖培训,多以参观为主,在一对多的模式下被动了解生产过程,解决实训难的问题。基于元宇宙平台进行育肥猪养殖实训,开启新时代养殖培训领域的新篇章。 基于元宇宙进…

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)

git新建库与本地库同步 gitee使用教程,git的下载与安装接不在叙述了。 新建远程仓库 新建远程仓库必须要使用仓库提供的api,也就是仓库门户网站,例如gitee,github,gitlab等。在上图中使用gitee网址中新建了一个test仓…

springMVC-数据格式化

1、基本介绍 在一个springmvc项目中,当表单提交数据时,如何对表单提交的数据进行格式的转换呢? 只要是数据进行网络传输都是以字符串的形式,进入内存后才有数据类型。 springmvc在上下文环境内置了一些转换器&#xff0c…

PDF如何转换制作成翻页电子书

很多朋友想将PDF转换制作成一本翻页电子书,却不知道如何操作。其实,转换翻页电子书的过程并不难,只需要掌握一些基本的技巧和方法就可以了。 基本该怎么操作呢? 1.首先需要一个工具帮助我们成功转换,推荐使用FLBOOK这…

输出26个英文字母 C语言xdoj97

描述&#xff1a; 编写一个程序&#xff0c;分别按正向和逆向输出小写字母。 输入说明&#xff1a; 无。 输出说明&#xff1a; 字母间以空格分隔&#xff0c;正向输出完换行&#xff0c;再逆向输出。 输入样例 无。 输出样例 无。 #include <stdio.h>//输出26个英文字…

动态规划 - 509.斐波那契数(C#和C实现)

动态规划 - 509.斐波那契数(C#和C实现) 题目描述 斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为斐波那契数列。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1…

Ring Co-XOR encryption based reversible data hiding for 3D mesh model

期刊&#xff1a;Signal Processing 作者&#xff1a;Lingfeng Qu et al. -- 摘要&#xff1a; 加密域可逆数据隐藏被广泛应用于云存储数字媒体的内容安全、隐私保护和便捷管理。然而&#xff0c;RDH-ED技术在三维网格模型载体中的应用研究仍处于起步阶段。为解决现有针对三…

MyBatis-Plus全套笔记

一、MyBatis-Plus 1.简介 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 我们的愿景是成为 MyBatis 最好的搭档&…