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(一):基础安装》 安装 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 keepalivedglobal_defs {router_id node01  # 路由 id: 当前安装 keepalived 节点主机的标识符,全局唯一vrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh" # 检查 nginx 是否正常工作的脚本interval 2 # 脚本检测间隔,单位为秒weight -10fall 3 	# 连续检测3次失败就算失败,每次失败优先级减去 weight 的值rise 2 	# 连续检测2次成功就算成功
}vrrp_instance VI_1 {state MASTER		# 表示当前为 ngxin 的主节点,masterinterface ens160	# 当前实例绑定的网卡名称: ifconfig 或者 ip a 可以查看virtual_router_id 51 # 虚拟路由 id,保证主备节点一致priority 100 		# 优先级,主的优先级设置的应该比备高advert_int 1		# 主备之间同步检查的时间间隔,默认1sauthentication {	# 认证授权的密码auth_type PASSauth_pass 1111}# vip,保证主备一致,且最好跟主机 ip 在同一个网段下,例如我的主机 ip 是 172.16.2.128virtual_ipaddress {	172.16.2.120}# 检查的脚本track_script {check_nginx}
}

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

! Configuration File for keepalivedglobal_defs {router_id node02  # 路由 id: 当前安装 keepalived 节点主机的标识符,全局唯一vrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh" # 检查 nginx 是否正常工作的脚本interval 2 # 脚本检测间隔,单位为秒weight -10fall 3 	# 连续检测3次失败就算失败,每次失败优先级减去 weight 的值rise 2 	# 连续检测2次成功就算成功
}vrrp_instance VI_1 {state BACKUP		# 表示当前为 ngxin 的主节点,backupinterface ens160	# 当前实例绑定的网卡名称: ifconfig 或者 ip a 可以查看virtual_router_id 51 # 虚拟路由 id,保证主备节点一致priority 90 		# 优先级,主的优先级设置的应该比备高advert_int 1		# 主备之间同步检查的时间间隔,默认1sauthentication {	# 认证授权的密码auth_type PASSauth_pass 1111}# vip,保证主备一致,且最好跟主机 ip 在同一个网段下,例如我的主机 ip 是 172.16.2.129virtual_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 ]; thenps -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.mzph.cn/news/233835.shtml

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

相关文章

Arcgis导出为tiff

原有一幅影像,在进行一些操作之后,需要导出为tiff 比如我对他进行一个重采样,48m分辨率变为96m 在重采样后的数据图层上右键,导出数据 为什么有时会导出为.gdb格式的呢? 可能是位置处在一个文件地理数据库.gdb下

【go-zero】 go-zero API 如何接入 Nacos 被 java 服务调用 | go集成java服务

一、场景 外层使用的是springcloud alibaba 这一套java的分布式架构 然后需要接入go-zero的api服务 这里我们将对api服务接入Nacos进行一个说明 二、实战 1、package 因为使用的是go-zero框架 这里我们会优先使用go-zero生态的包 github 包如下: github.com/nacos-group/naco…

「Verilog学习笔记」游戏机计费程序

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1nsmodule game_count(input rst_n, //异位复位信号,低电平有效input clk, //时钟信号input [9:0]money,input set,input boost,output reg[9:0…

java线程池执行任务时异常被吃掉

问题 今天在测试环境通过线程池执行任务时突然被中断,跟踪日志发现代码跑到一半后面的日志就不再打印,而且也没有任何异常堆栈信息,也就是说程序执行被中断了,后面反复尝试经排查发现是线程池使用不当导致。 测试验证 我们用线程…

网络的发展历史,ip地址

TCP/IP 是获得最广泛支持的通信协议集合 包含了大量internet应用的标准协议 -支持跨网络架构,跨操作系统平台的通信 主机与主机之间通信的三个要素 1.ip地址(ip address) 2.子网掩码(subent mask) 3.ip路由(ip router) ip地址: 作用:用…

【深度学习】语言模型与注意力机制以及Bert实战指引之一

文章目录 统计语言模型和神经网络语言模型注意力机制和Bert实战Bert 统计语言模型和神经网络语言模型 区别:统计语言模型的本质是基于词与词共现频次的统计,而神经网络语言模型则是给每个词赋予了向量空间的位置作为表征,从而计算它们在高维…

【从服务器获取共享列表失败】【无法与设备或资源通信】解决方案!

【从服务器获取共享列表失败】背景: 某项目搭建有samba共享,使用一段时间后,不知何种原因,客户端链接共享时报:从服务器获取共享列表失败,无效的参数。 可参考解决方案A: 银河麒麟samba共享文…

Spring Boot自动装配原理以及实践

了解自动装配两个核心 Import注解的作用 Import说Spring框架经常会看到的注解,它有以下几个作用: 导入Configuration类下所有的bean方法中创建的bean。导入import指定的bean,例如Import(AService.class),就会生成AService的bean&#xff0…

杰发科技AC7840——SPM电源管理之低功耗模式

0、SPM简介 很早以前就听过低功耗模式,一直没有怎么深入了解,最近遇到几个项目都是跟低功耗有关。正好AutoChips的芯片都有电源管理的功能,在此借用AC7840的SPM对低功耗进行测试。 1、AC7840的5种功耗模式 2、AC7840的模式转换 3、唤醒 在…

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

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

易优建站修改文章模板中的地图大小

我是新建了一个栏目放置的百度地图 然后再这个栏目下创建地图 然后再页面中添加代码标签,显示地图,其实就是显示文章的内容 接下来就是修改地图的大小 第一步:打开文件public/plugins/Ueditor/dialogs/map/show.html 第二步:打开…

从西工大安全事件浅谈特权账号管理系统

去年9月,国家计算机病毒应急处理中心发布《西北工业大学遭美国NSA网络攻击事件调查报告(之一)》(以下简称“西工大事件报告”),以充分详实的证据揭示了美国NSA使用41种武器,先后使用了遍布17个国…

长短期记忆(LSTM)神经网络-多输入回归预测

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、部分程序: 四、完整代码数据下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编…

AI降重工具

WEB版 体验一下 from docx import Document import requestsdef call_api_and_get_content(content, prompt):api_url "http://XXXXXXXX/api?content" content promptresponse requests.get(api_url)if response.status_code 200:api_result response.text.re…

el-select如何去掉placeholder属性

功能要求是&#xff1a;当el-select的disabled属性为true的时候不展示“请选择”字样 1、要去掉 el-select 元素的 placeholder 属性&#xff0c;可以在代码中将其设置为空字符串。 <el-select placeholder"" ...></el-select> 注意&#xff1a;这种方…

1_js基本简介数据类型变量的使用

1. 编程语言简介 1.1 计算机编程语言 计算机编程语言是程序设计的最重要的工具&#xff0c;它是指计算机能够接受和处理的、具有一定语法规则的语言。从计算机诞生&#xff0c;计算机语言经历了机器语言、汇编语言和高级语言几个阶段。 高级语言&#xff1a;JavaScript&#x…

游戏出海-选择云观测监控

相较于国内发展企业&#xff0c;出海企业能更加快速自身发展&#xff0c;但也相对的获取到的业务压力也远远高于国内。对于游戏出海企业&#xff0c;各地玩家带来的庞大数据&#xff0c;企业需要时时刻刻监控玩家数据波动、服务器运行、有无外挂篡改等等。九河云通过自身多年从…

使用Httpclient来替代客户端的jsonp跨域解决方案

最近接手一个项目&#xff0c;新项目需要调用老项目的接口&#xff0c;但是老项目和新项目不再同一个域名下&#xff0c;所以必须进行跨域调用了&#xff0c;但是老项目又不能进行任何修改&#xff0c;所以jsonp也无法解决了&#xff0c;于是想到了使用了Httpclient来进行服务端…

[MySQL] MySQL中的用户管理

文章目录 一、用户 1、1 用户信息 1、2 创建用户 1、3 删除用户 1、4 修改用户密码 二、数据库的权限 2、1 用户权限 2、2 回收权限 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x1f64b;‍♂️ &#x1f440; 专栏&#xff1a;MySQL &#x1f440; &#x1f4a5; 标题…

SpringBoot+WebSocket

SpringBootWebSocket 1.导入依赖&#xff1a; -- Spring Boot 2.x 使用 javax.websocket-- Spring Boot 3.x 使用 jakarta.websocket<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId&g…