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.rhkb.cn/news/221407.html

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

相关文章

nodejs连接mongodb报错SyntaxError: Unexpected token .

nodejs连接mongodb报错SyntaxError: Unexpected token 如下图 经过排查,原因是npm默认安装的mongodb插件是最新版6.3.0 ,而mongodb数据库版本是4.0.0 ,两者版本不同导致nodejs报错。 解决方法是npm卸载新版本的mongodb插件,再安…

建行驻江门市分行纪检组党支部开展“以廉养人,以案警人”清廉文化现场教学活动

近日,建行驻江门市分行纪检组党支部联合建设支行党支部到江门市党群服务中心开展“以廉养人,以案警人”清廉文化现场教学活动。 名言语句亮初心。一楼展馆入口处竖立着“拔烂树、治病树、正歪树”“以猛药去疴刮骨疗毒的勇气反腐”“理想信念是共产党人的…

【数据结构】并查集的简单实现,合并,查找(C++)

文章目录 前言举例: 一、1.构造函数2.查找元素属于哪个集合FindRoot3.将两个集合归并成一个集合Union4.查找集合数量SetCount 二、源码 前言 需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规…

「X」Embedding in NLP|神经网络和语言模型 Embedding 向量入门

在「X」Embedding in NLP 进阶系列中,我们介绍了自然语言处理的基础知识——自然语言中的 Token、N-gram 和词袋语言模型。今天,我们将继续和大家一起“修炼”,深入探讨神经网络语言模型,特别是循环神经网络,并简要了解…

车载蓝牙物联网解决方案

车载蓝牙物联网解决方案是一种基于蓝牙技术,结合物联网技术的智能车载系统。它利用蓝牙技术将智能手机、智能手表、智能车载设备等连接起来,实现设备之间的无缝通信和数据共享,为驾驶者提供更加便捷、安全和智能的驾驶体验。 车载蓝牙物联网解…

RocketMQ系统性学习-RocketMQ原理分析之Broker接收消息的处理流程

Broker接收消息的处理流程? 既然要分析 Broker 接收消息,那么如何找到 Broker 接收消息并进行处理的程序入口呢? 那么消息既然是从生产者开始发送,消息是有单条消息和批量消息之分的,那么消息肯定是有一个标识&#…

Codeforces Round 916 (Div. 3)(G未补)

目录 A. Problemsolving Log B. Preparing for the Contest C. Quests D. Three Activities E1.E2. Game with Marbles F. Programming Competition A. Problemsolving Log 题意:A任务需要一分钟完成,B任务需要两分钟完成,……以此类推…

ASP.NET MVC实战之权限拦截Authorize使用

1&#xff0c;具体的实现方法代码如下 public class CustomAuthorizeAttribute : FilterAttribute, IAuthorizationFilter{/// <summary>/// 如果需要验证权限的时候&#xff0c;就执行进来/// </summary>/// <param name"filterContext"></par…

代码随想录算法训练营第四十一天|198.打家劫舍 ,213.打家劫舍II ,337.打家劫舍III

198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#…

设计模式(三)-结构型模式(5)-外观模式

一、为何需要外观模式&#xff08;Facade&#xff09;? 要实现一个大功能&#xff0c;我们需要将它拆分成多个子系统。然后每个子系统所实现的功能&#xff0c;就由一个称为外观的高层功能模块来调用。这种设计方式就称为外观模式。该模式在开发时常常被使用过&#xff0c;所…

HTML CSS 进度条

1 原生HTML标签 <meter>&#xff1a;显示已知范围的标量值或者分数值<progress>&#xff1a;显示一项任务的完成进度&#xff0c;通常情况下&#xff0c;该元素都显示为一个进度条 1.1 <meter> <html><head><style>meter{width:200px;}…

飞天使-k8s知识点1-kubernetes架构简述

文章目录 名词功能要点 k8s核心要素CNCF 云原生框架简介k8s组建介绍 名词 CI 持续集成, 自动化构建和测试&#xff1a;通过使用自动化构建工具和自动化测试套件&#xff0c;持续集成可以帮助开发人员自动构建和测试他们的代码。这样可以快速检测到潜在的问题&#xff0c;并及早…

解决 Hbuilder打包 Apk pad 无法横屏 以及 H5 直接打包 成Apk

解决 Hbuilder打包 Apk pad 无法横屏 前言云打包配置 前言 利用VUE 写了一套H5 想着 做一个APP壳 然后把 H5 直接嵌进去 客户要求 在pad 端 能够操作 然后页面风格 也需要pad 横屏展示 云打包 配置 下面是manifest.json 配置文件 {"platforms": ["iPad"…

Axure中如何使用交互样式交互事件交互动作情形

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、Axure中交互样式 1、什么是交互样式&#xff1f; 2、交互样式的作用&#xff1f; 3、Axure中如何…

Postman使用总结--生成测试报告

1.执行生成的命令格式 newman run 用例集文件 .json -e 环境文件 .json -d 数据文件 .json/.csv -r htmlextra --reporter- htmlextra-export 测试报告名 .html -e 和 -d 是 非必须的。 如果没有使用 环境&#xff0c;不需要指定 -e 如果没有使用 数据…

Educational Codeforces Round 160 (Div. 2) A~E

A.Rating Increase&#xff08;思维&#xff09; 题意&#xff1a; 给出一个仅包含数字的字符串 s s s&#xff0c;要求将该字符串按以下要求分成左右两部分 a , b a,b a,b&#xff1a; 两个数字均不包含前导 0 0 0 两个数字均大于 0 0 0 b > a b > a b>a 如果…

董宇辉“回归”成为东方甄选高级合伙人,尘埃落地后是谁赢了?

董宇辉“回归”成为东方甄选高级合伙人&#xff0c;尘埃落地后是谁赢了&#xff1f; 董宇辉的“小作文事件”“CEO摔手机事件”迎来大结局了&#xff01; 就在12月18日&#xff0c;董宇辉被任命为新东方教育科技集团董事长文化助理&#xff0c;兼任新东方文旅集团副总裁。有朋…

java中常用的加密算法总结

目前在工作中常用到加密的一些场景&#xff0c;比如密码加密&#xff0c;数据加密&#xff0c;接口参数加密等&#xff0c;故通过本文总结以下常见的加密算法。 1. 对称加密算法 对称加密算法使用相同的密钥进行加密和解密。在Java中&#xff0c;常见的对称加密算法包括&…

网络基础介绍

1.网线制作 1.1 网线制作需要的工具 网线 网线钳 水晶头 测试仪 ​编辑 1.2 网线的标准 1.3 网线的做法 2.集线器&交换机&路由器的介绍 3.OSI七层模型 4.路由器的设置 4.1 常见的路由器设置地址 4.2 常见的路由器账号密码 4.3 登录路由器 设置访客网…

【Axure RP9】中继器应用及相关案例

一 中继器简介 1.1 中继器是什么 中继器&#xff08;Repeater&#xff09;是一种高级的组件&#xff08;Widget&#xff09;&#xff0c;用于显示文本、图像和其他元素的重复集合。它是一个容器&#xff0c;容器中的每一个项目称作“item”&#xff0c;由于“item”中的数据由…