当前位置: 首页 > wzjs >正文

90设计网站怎么绑定手机号扬中零壹网站建设

90设计网站怎么绑定手机号,扬中零壹网站建设,安装wordpress提示500错误,百度搜索次数统计背景 在现代分布式系统中,高可用性(High Availability, HA)是一个至关重要的设计目标。为了实现高可用性,通常会采用双中心或多中心架构,并结合负载均衡技术(如Nginx)和高可用工具(…

背景

在现代分布式系统中,高可用性(High Availability, HA)是一个至关重要的设计目标。为了实现高可用性,通常会采用双中心或多中心架构,并结合负载均衡技术(如Nginx)和高可用工具(如Keepalived)来确保服务的连续性。然而,在高可用环境中进行服务管理时,可能会遇到一些复杂的问题,尤其是在批量关闭服务时。

本文将以一个实际的案例为基础,详细探讨如何优化Nginx服务管理脚本,以解决在高可用环境下批量关闭Nginx服务时遇到的问题。


问题描述

环境说明

  1. 双中心架构:每个中心有4台Web服务器,每台服务器上运行Nginx和Keepalived。
  2. VIP(虚拟IP)管理:每个中心通过Keepalived管理一个VIP,用于实现高可用性。
  3. 高可用演练:在演练过程中,需要关闭一个中心的所有Web服务器。

问题现象

在使用初始脚本批量关闭Nginx服务时,发现部分服务器的Nginx服务无法一次性关闭,需要多次执行关闭操作才能成功。经过分析,发现问题可能与Keepalived的VIP漂移过程有关。

问题分析

  1. Keepalived VIP漂移的影响
    • 当批量关闭Nginx服务时,Keepalived会检测到服务不可用,并将VIP漂移到其他节点。
    • 在VIP漂移过程中,Nginx服务可能无法立即关闭,导致部分服务器需要多次执行关闭操作。
  2. 脚本的局限性
    • 初始脚本仅尝试关闭Nginx服务一次,未考虑VIP漂移过程中的延迟。
    • 缺乏重试机制,无法应对服务关闭失败的情况。

初始脚本分析

以下是初始的Nginx服务管理脚本:

#!/bin/bash# 获取IP地址
IP_ADDRESS=$(hostname -I | awk '{print $1}')# 服务相关变量
SERVICE_NAME="nginx"
SERVICE_DIR="/app/metabank/nginx/sbin"
START_SCRIPT="nginx"
STOP_SCRIPT="nginx -s quit"
FORCE_STOP_SCRIPT="pkill -9 nginx"# 检查服务运行状态的函数
check_service_health() {if [ ! -d "$SERVICE_DIR" ]; thenecho "指定的服务目录不存在: $SERVICE_DIR"echo "非0"return 2fiif systemctl is-active --quiet "$SERVICE_NAME"; then# 服务正在运行return 0else# 服务未运行return 1fi
}# 输出服务的当前状态
print_status() {echo "--------------------------------------------------------------------------------"echo "| IP地址             | 服务名 | 状态    |"echo "--------------------------------------------------------------------------------"check_service_healthlocal status_code=$?local status="未知"case $status_code in0) status="运行中" ;;1) status="关闭" ;;2) status="服务目录不存在" ;;esacprintf "| %-18s | %-14s | %-8s |\n" "$IP_ADDRESS" "$SERVICE_NAME" "$status"echo "--------------------------------------------------------------------------------"echo "0"
}# 启动服务的函数
start_service() {local force=falseif [[ "$*" == *"FORCE"* ]]; thenforce=truefiif [ ! -d "$SERVICE_DIR" ]; thenecho "服务目录不存在:$SERVICE_DIR"echo "非0"return 1fiecho "正在检查并停止任何已存在的服务实例"stop_service FORCEecho "正在启动服务..."if systemctl start "$SERVICE_NAME"; thensleep 5check_service_healthif [ $? -eq 0 ]; thenecho "服务启动成功。"elseecho "服务启动失败,请检查日志。"echo "非0"return 1fielseecho "服务启动失败,请检查日志。"echo "非0"return 1fiecho "0"
}# 停止服务的函数
stop_service() {local force=falseif [[ "$*" == *"FORCE"* ]]; thenforce=truefiif [ ! -d "$SERVICE_DIR" ]; thenecho "服务目录不存在:$SERVICE_DIR"echo "非0"return 1fiif systemctl is-active --quiet "$SERVICE_NAME"; thenecho "正在尝试停止服务..."if systemctl stop "$SERVICE_NAME"; thensleep 3if ! systemctl is-active --quiet "$SERVICE_NAME"; thenecho "服务已成功停止。"elseif $force; thenecho "正在强制停止服务..."eval "$FORCE_STOP_SCRIPT"sleep 2if ! systemctl is-active --quiet "$SERVICE_NAME"; thenecho "服务已被强制停止。"elseecho "强制停止服务失败。"echo "非0"return 1fielseecho "尝试停止服务失败。"echo "非0"return 1fifielseif $force; thenecho "正在强制停止服务..."eval "$FORCE_STOP_SCRIPT"sleep 2if ! systemctl is-active --quiet "$SERVICE_NAME"; thenecho "服务已被强制停止。"elseecho "强制停止服务失败。"echo "非0"return 1fielseecho "服务停止命令执行失败。"echo "非0"return 1fifielseecho "无需停止服务,服务已处于停止状态。"fiecho "0"
}# 主执行逻辑
action=""
force=false# 解析参数
for arg in "$@"; docase "${arg^^}" inSTART|STOP|STATUS|CHECK)if [ "${arg^^}" = "CHECK" ]; thenaction="STATUS"elseaction="${arg^^}"fi;;FORCE)force=true;;*)echo "未知参数: $arg"echo "用法: $0 {start|stop|status|check} [FORCE]"echo "非0"exit 1;;esac
done# 如果单独使用 FORCE 参数,默认执行 stop FORCE
if [[ "$force" == true && -z "$action" ]]; thenaction="STOP"
fi# 执行操作
case "$action" inSTART)if $force; thenstart_service FORCEelsestart_servicefiprint_status;;STOP)if $force; thenstop_service FORCEelsestop_servicefiprint_status;;STATUS)print_status;;*)echo "用法: $0 {start|stop|status|check} [FORCE]"echo "非0"exit 1;;
esac

初始脚本的问题

  1. 缺乏重试机制:在关闭Nginx服务时,如果第一次关闭失败,脚本不会尝试再次关闭。
  2. 未考虑VIP漂移的延迟:在VIP漂移过程中,Nginx服务可能无法立即关闭,但脚本未对此进行处理。

优化方案

为了解决上述问题,我们对脚本进行了以下优化:

  1. 增加重试机制
    • 在关闭Nginx服务时,增加多次重试机制,定义间隔时间和重试次数变量。
    • 通过重试机制,确保在VIP漂移过程中能够成功关闭Nginx服务。
  2. 保持脚本独立性
    • 不修改Keepalived的配置或脚本,保持Nginx服务管理的独立性。

以下是优化后的脚本:

#!/bin/bash# 获取IP地址
IP_ADDRESS=$(hostname -I | awk '{print $1}')# 服务相关变量
SERVICE_NAME="nginx"
SERVICE_DIR="/app/metabank/nginx/sbin"
START_SCRIPT="nginx"
STOP_SCRIPT="nginx -s quit"
FORCE_STOP_SCRIPT="pkill -9 nginx"# 定义间隔时间和重试次数
RETRY_INTERVAL=5  # 每次重试的间隔时间(秒)
MAX_RETRIES=5     # 最大重试次数# 检查服务运行状态的函数
check_service_health() {if [ ! -d "$SERVICE_DIR" ]; thenecho "指定的服务目录不存在: $SERVICE_DIR"echo "非0"return 2fiif systemctl is-active --quiet "$SERVICE_NAME"; then# 服务正在运行return 0else# 服务未运行return 1fi
}# 输出服务的当前状态
print_status() {echo "--------------------------------------------------------------------------------"echo "| IP地址             | 服务名 | 状态    |"echo "--------------------------------------------------------------------------------"check_service_healthlocal status_code=$?local status="未知"case $status_code in0) status="运行中" ;;1) status="关闭" ;;2) status="服务目录不存在" ;;esacprintf "| %-18s | %-14s | %-8s |\n" "$IP_ADDRESS" "$SERVICE_NAME" "$status"echo "--------------------------------------------------------------------------------"echo "0"
}# 启动服务的函数
start_service() {local force=falseif [[ "$*" == *"FORCE"* ]]; thenforce=truefiif [ ! -d "$SERVICE_DIR" ]; thenecho "服务目录不存在:$SERVICE_DIR"echo "非0"return 1fiecho "正在检查并停止任何已存在的服务实例"stop_service FORCEecho "正在启动服务..."if systemctl start "$SERVICE_NAME"; thensleep 5check_service_healthif [ $? -eq 0 ]; thenecho "服务启动成功。"elseecho "服务启动失败,请检查日志。"echo "非0"return 1fielseecho "服务启动失败,请检查日志。"echo "非0"return 1fiecho "0"
}# 停止服务的函数
stop_service() {local force=falseif [[ "$*" == *"FORCE"* ]]; thenforce=truefiif [ ! -d "$SERVICE_DIR" ]; thenecho "服务目录不存在:$SERVICE_DIR"echo "非0"return 1fiif systemctl is-active --quiet "$SERVICE_NAME"; thenecho "正在尝试停止服务..."if systemctl stop "$SERVICE_NAME"; thensleep 3if ! systemctl is-active --quiet "$SERVICE_NAME"; thenecho "服务已成功停止。"elseif $force; thenecho "正在强制停止服务..."eval "$FORCE_STOP_SCRIPT"sleep 2if ! systemctl is-active --quiet "$SERVICE_NAME"; thenecho "服务已被强制停止。"elseecho "强制停止服务失败。"echo "非0"return 1fielseecho "尝试停止服务失败。"echo "非0"return 1fifielseif $force; thenecho "正在强制停止服务..."eval "$FORCE_STOP_SCRIPT"sleep 2if ! systemctl is-active --quiet "$SERVICE_NAME"; thenecho "服务已被强制停止。"elseecho "强制停止服务失败。"echo "非0"return 1fielseecho "服务停止命令执行失败。"echo "非0"return 1fifielseecho "无需停止服务,服务已处于停止状态。"fi# 增加间隔时间后再次检查并关闭Nginxlocal retry_count=0while [ $retry_count -lt $MAX_RETRIES ]; doretry_count=$((retry_count + 1))echo "第${retry_count}次重试关闭Nginx服务..."echo "等待${RETRY_INTERVAL}秒后再次检查Nginx服务状态..."sleep $RETRY_INTERVALif systemctl is-active --quiet "$SERVICE_NAME"; thenecho "Nginx服务仍在运行,再次尝试停止..."if systemctl stop "$SERVICE_NAME"; thensleep 3if ! systemctl is-active --quiet "$SERVICE_NAME"; thenecho "服务已成功停止。"breakelseecho "再次尝试停止服务失败。"fielseecho "再次尝试停止服务失败。"fielseecho "Nginx服务已停止。"breakfidoneif [ $retry_count -eq $MAX_RETRIES ]; thenecho "已达到最大重试次数(${MAX_RETRIES}),停止服务失败。"echo "非0"return 1fiecho "0"
}# 主执行逻辑
action=""
force=false# 解析参数
for arg in "$@"; docase "${arg^^}" inSTART|STOP|STATUS|CHECK)if [ "${arg^^}" = "CHECK" ]; thenaction="STATUS"elseaction="${arg^^}"fi;;FORCE)force=true;;*)echo "未知参数: $arg"echo "用法: $0 {start|stop|status|check} [FORCE]"echo "非0"exit 1;;esac
done# 如果单独使用 FORCE 参数,默认执行 stop FORCE
if [[ "$force" == true && -z "$action" ]]; thenaction="STOP"
fi# 执行操作
case "$action" inSTART)if $force; thenstart_service FORCEelsestart_servicefiprint_status;;STOP)if $force; thenstop_service FORCEelsestop_servicefiprint_status;;STATUS)print_status;;*)echo "用法: $0 {start|stop|status|check} [FORCE]"echo "非0"exit 1;;
esac

总结

通过增加重试机制,我们成功解决了在高可用环境下批量关闭Nginx服务时部分服务器无法一次性关闭的问题。这种优化方式不仅简单有效,而且保持了脚本的独立性,避免了与其他服务管理的耦合。

在实际运维工作中,面对复杂的生产环境,我们需要灵活运用各种技术手段,确保系统的高可用性和稳定性。希望这篇博客对大家在类似场景下的工作有所帮助。


文章转载自:

http://PfPLuDyo.gxkLx.cn
http://87l3mspr.gxkLx.cn
http://DSIcWVpv.gxkLx.cn
http://Un0nUbXg.gxkLx.cn
http://XHWKnFyn.gxkLx.cn
http://nUA696hl.gxkLx.cn
http://5ia0xvHP.gxkLx.cn
http://03hodIJb.gxkLx.cn
http://Exrca1Q1.gxkLx.cn
http://Gn6d6Hzw.gxkLx.cn
http://7hahDCi9.gxkLx.cn
http://dF4zEw16.gxkLx.cn
http://9UzDmtGD.gxkLx.cn
http://JribL7sK.gxkLx.cn
http://VUspgw5u.gxkLx.cn
http://I9Q3q35B.gxkLx.cn
http://ib3VZGgX.gxkLx.cn
http://Ms9A2fsc.gxkLx.cn
http://xyjer5bC.gxkLx.cn
http://aQ6c9DEC.gxkLx.cn
http://OdhYAuXQ.gxkLx.cn
http://1AbJzH9t.gxkLx.cn
http://6In6DaCp.gxkLx.cn
http://ZK0CMxJH.gxkLx.cn
http://7rCPLFtb.gxkLx.cn
http://100y26mI.gxkLx.cn
http://XmFzCZsU.gxkLx.cn
http://l9lJQeqB.gxkLx.cn
http://FfwU0Xlc.gxkLx.cn
http://W5nx7ge2.gxkLx.cn
http://www.dtcms.com/wzjs/663542.html

相关文章:

  • 什么网站做一件代发首页凡客
  • 做任务给佣金的网站有哪些敬请期待图片素材
  • 传奇网站模块下载开源crm客户管理系统
  • 石景山网站制作wordpress 自定义注册
  • 专业网站优化培训外贸原单是什么意思
  • 蓝色系 网站收款网站怎么建设
  • 宁波自助建站公司做网站比较专业的公司
  • 东莞网站建设 少儿托管广东省特色专业建设网站
  • 佛山网站制作网页网站的权重是什么意思
  • 网站设置默认首页wordpress系统和插件下载地址
  • 企业网站的功能图文排版模板
  • 常州市住房建设局网站学校资源网站建设方案
  • 建设工程质量监督站网站怎么访问wordpress
  • 如乐建站之家做什么推广最赚钱
  • 网站备案 多少钱wordpress主题超2m
  • 网站建设一般用英文怎么说开源wordpress小程序源码
  • 外贸网站宗旨车间生产管理软件
  • 贵州贵阳建网站的电话wordpress会员可看
  • 问答类网站怎么做啊玉溪网络推广 网站建设
  • 网站开发及技术路线源码分享
  • 温州二井建设有限公司网站蓝色科技企业网站模板免费下载
  • 高校网站建设方案东莞债务优化公司
  • 安陆网站制作公司互联网推广员是做什么的
  • 做宣传网站要多少钱专业的深圳电商app开发
  • 代码重构网站哈尔滨哪里有做网站的
  • 中山专业网站建设模板代理巩义网站优化
  • 南海做网站公司学校安全教育网站建设
  • 广东省住房城乡建设厅网站推荐家居网站建设
  • 开封做网站公司贵阳网站建设公司排名
  • 宁波网站建设设计公司排名自适应网站建设选哪家