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

news2024/11/16 0:05:12

文章目录

  • 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(一):基础安装》 安装 docker,nginx 等(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.coloradmin.cn/o/1323591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.vue学习(8-13)

文章目录 8.数据绑定9.el与data的2种写法10.理解mvvm11.object.defineProperty12. 理解数据代理13 vue中的数据代理 8.数据绑定 单向数据绑定就是我们学的v-bind的方式,vue对象变了,页面才变。但是页面变了,vue对象不会变。 双向数据绑定需要…

项目经理和产品经理的区别,如何判断自己适合哪个,从事该岗位前期需做的准备(学习技能考、哪些证书)?

最近很多人咨询“项目经理跟产品经理该怎么选,我更适合哪个?”“项目经理跟产品经理哪个更有钱途 ”“项目经理转产品经理好转吗”等等,今天就一次性说清楚项目经理跟产品经理有什么区别,应该怎么选择。 不想看长篇大论的&#x…

[计网02] 数据链路层 笔记 总结 详解

目录 数据链路层概述 主要功能 封装成帧 透明传输 差错检测 冗余码 差错控制 检错编码 纠错编码 奇偶效验法 CRC循环冗余码 静态分配信道 频分多路复用FDM 时分多路复用TDM 波分多路复用WDM 码分多路复用CDM 随机访问介质的访问控制 ALOHA CSMA CSMA/CD CSMA/…

关于“Python”的核心知识点整理大全30

目录 12.2.3 在 OS X 系统中安装 Pygame 12.2.4 在 Windows 系统中安装 Pygame 12.3 开始游戏项目 12.3.1 创建 Pygame 窗口以及响应用户输入 首先,我们创建一个空的Pygame窗口。使用Pygame编写的游戏的基本结构如下: alien_invasion.py 12.3.2 设…

零刻EQ12 N100 双2.5G网口 All In One新手教程

零刻EQ12 N100 双2.5G网口 All In One新手教程 前言1.硬件配置2.准备工作2.1. ESXI8.0U2镜像2.2. Rufus磁盘工具下载2.3. ikuai镜像下载2.4. StarWindConverter虚拟磁盘格式转换工具下载2.5. OpenWrt镜像下载2.6. 黑群晖RR引导镜像下载(DSM7.2)2.7. 需要准备的硬件2.8. 格式化需…

【C语言(十五)】

动态内存管理 一、为什么要有动态内存分配? 我们已经掌握的内存开辟方式有: int val 20 ; // 在栈空间上开辟四个字节 char arr[ 10 ] { 0 }; // 在栈空间上开辟 10 个字节的连续空间 但是上述的开辟空间的方式有两个特点: • 空间开辟大小是固…

vCenter HA拆分和部署

原创作者:运维工程师 谢晋 vCenter HA拆分和部署 拆分vCenter HA部署vCenter HA 拆分vCenter HA 客户vCenter HA内一台虚拟机出现故障无法连接,报错如下: 点击移除集群报错如下: 查找官方KB,按照官方KB进行移除…

货仓选址

title: 货仓选址 date: 2023-12-19 15:06:02 tags: 排序 categories: 算法进阶指南 题目大意 解题思路 将数组排序后&#xff0c;将货仓建在 x x x 坐标处&#xff0c;其左侧和右侧的商家数量相同的时候最优 实现代码 #include<bits/stdc.h>using namespace std; type…

SQL进阶理论篇(十三):数据库的查询优化器是什么?

文章目录 简介什么是查询优化器查询优化器的两种优化方式总结参考文献 简介 事务可以让数据库在增删改查的过程中&#xff0c;保证数据的正确性和安全性&#xff0c;而索引可以帮数据库提升数据的查找效率。查询优化器&#xff0c;则是帮助我们获取更高的SQL查询性能。 本节我…

FreeRTOS的heap文件

在动态创建任务的时候, 只需要提供一个任务句柄, 内存的分配, TCB的分配, 都是系统来进行的, 也是这个文件做的工作. heap文件一共有5个, 都是内存管理文件, 工程只需要一个就行, 这五个的内存分配方法都不一样. heap1: 只实现了malloc功能, 没有实现free功能.(不用) heap2: 实…

小程序使用web-view无法打开该H5页面不支持打开的解决方法

我在正式上线版小程序使用 web-view 组件测试时提示&#xff1a;“无法打开该页面&#xff0c;不支持打开 https://xxxxxx&#xff0c;请在“小程序右上角更多->反馈与投诉”中和开发者反馈。” 奇怪的是&#xff0c;“真机调试”、“开发模式”都可以使用 web-view 组件访…

【Netty】NIO与Netty核心概念

目录 NIO编程NIO介绍NIO和BIO的比较缓冲区(Buffer)基本介绍常用API缓冲区对象创建添加数据读取数据 通道(Channel)基本介绍Channel常用类ServerSocketChannelSocketChannel Selector (选择器)基本介绍常用API介绍示例代码 NIO 三大核心原理 Netty核心概念Netty 介绍原生 NIO 存…

扑克牌炸金花

1.创建类 使用权限修饰符定义所需要参数&#xff0c;使用this关键字生成方法 public class gamejinhua { private String suit;//花色 private int rank;//数字 public gamejinhua(String suit, int rank) { this.suit suit; this.rank rank; } 2.使用快捷键生成get和…

基于ssm生鲜配送系统设计及实现论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对生鲜配送信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

换热站数字孪生 | 图扑智慧供热 3D 可视化

换热站作为供热系统不可或缺的一部分&#xff0c;其能源消耗对城市环保至关重要。在双碳目标下&#xff0c;供热企业可通过搭建智慧供热系统&#xff0c;实现供热方式的低碳、高效、智能化&#xff0c;从而减少碳排放和能源浪费。通过应用物联网、大数据等高新技术&#xff0c;…

Java多线程技术三:锁的使用——使用ReentrantReadWriteLock类

1 概述 ReentrantLock类具有完全互斥排它的特点&#xff0c;同一时间只有一个线程在执行ReentrantLock.lock()方法后面的任务&#xff0c;这样做保证了同时写实例变量的线程安全性&#xff0c;但 效率是非常低下的。在JDK提供了一种读写锁ReentrantReadWriteLock类&#xff0c;…

Android开发中报错总结之一

在我们开发中经常会遇到报错&#xff0c;今天主要是记录一下&#xff0c;我在开发中遇到的问题&#xff1a; 问题一&#xff1a;material-1.5.0-alpha03\res\values-v31\values-v31.xml:3:5-94: AAPT: error: resource android:color/system_neutral1_1000 not found 解决方案…

基于“Galera+MariaDB”搭建多主数据库集群的实例

1、什么是多主数据库集群 多主数据库集群是一种数据库集群架构&#xff0c;每个节点都可以接收写入操作和读取操作&#xff0c;并且通过心跳机制同步数据&#xff0c;保证数据一致性和高可用性。因多主数据库集群每个节点都可以承担读写操作&#xff0c;因此它可以充分利用各个…

HarmonyOS应用开发-手写板(二)

在前一篇手写板的文章中&#xff08;HarmonyOS应用开发-手写板-CSDN博客&#xff09;&#xff0c;我们通过使用Path实现了一个基本的手写板&#xff0c;但遗憾的是&#xff0c;无法保存所绘制的图像。在本文中&#xff0c;我们将采用canvas和Path2D来重新构建手写板应用。依然只…

数据可视化---柱状图

类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统计学检验箱…