美文网首页
无感知更新服务脚本

无感知更新服务脚本

作者: Lupino | 来源:发表于2020-12-16 23:10 被阅读0次

背景

我们的web服务是用python写的,跑在 docker container 里面,并且用docker-compose 来管理。

用bash来生成docker-compose.yml文件

将 docker-compose 的每个 service 写到单独的文件里面。

文件 web/server1

    server1:
        image: xxx-server:server1
        ports:
        - 8080:8080

文件 web/server2

    server2:
        image: xxx-server:server2
        ports:
        - 8081:8080

bash 生成 docker-compose.yml

文件 build.sh

OUTPUT=docker-compose.yml

WEB=(
    web/server1
    web/server2
)

merge_files() {
    FILES=$@
    for F in ${FILES[@]}; do
        cat "${F}" >> ${OUTPUT}
    done
}
cat > ${OUTPUT} <<EOF
version: "3.6"
services:
EOF

merge_files ${WEB[@]}

禁用和启用服务

可以通过注释server1来禁用server1,注释server2来禁用server2
通过去除注释server1来启用server1,去除注释server2来启用server2

文件 utils.sh

enable_service() {
    service=$1
    sed -i 's/#*//' ${service}
}
disable_service() {
    service=$1
    sed -i 's/^\([^#]*\)/#\1/' ${service}
}

nginx 添加或移除服务

通过upstream可以方便添加或移除服务

配置 upstream

upstream server {
    server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
    # server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
}

添加或移除服务

文件 utils.sh

NGING_CONF=/etc/nginx/conf.d/yisite.conf

disable_port() {
    port=$1
    sed -i "s/^    server 127.0.0.1:${port}/    # server 127.0.0.1:${port}/" ${NGING_CONF}
}

enable_port() {
    port=$1
    sed -i "s/^    # server 127.0.0.1:${port}/    server 127.0.0.1:${port}/" ${NGING_CONF}
}

启用脚本

整合启用服务docker-compose.yml 和 nginx 配置文件

#!/usr/bin/env bash

. utils.sh

SERVER=${1:-serverall}

if [ "${SERVER}" == "server1" ]; then
    enable_service web/server1
    enable_port 8080
elif [ "${SERVER}" == "server2" ]; then
    enable_service web/server2
    enable_port 8081
elif [ "${SERVER}" == "serverall" ]; then
    enable_service web/server1
    enable_port 8080
    enable_service web/server2
    enable_port 8081
fi

./build.sh

禁用服务脚本

整合禁用服务docker-compose.yml 和 nginx 配置文件

文件 disable.sh

#!/usr/bin/env bash

. utils.sh

SERVER=${1}

if [ "${SERVER}" == "server1" ]; then
    disable_service web/server1
    disable_port 8080
    ./build.sh
    nginx -t || exit 1
    nginx -s reload
elif [ "${SERVER}" == "server2" ]; then
    disable_service server2
    disable_port 8081
    ./build.sh
    nginx -t || exit 1
    nginx -s reload
else
    echo "disable.sh server1|server2"
fi

便捷启动脚本

将docker-compose启动和nginx重启整合在一起

#!/usr/bin/env bash

docker-compose up -d --remove-orphans

nginx -t || exit 1

nginx -s reload

来实际操作

假设现在运行的是 server1

  1. 启用 server2
./enable.sh server2
  1. 运行便捷启动脚本
./start.sh
  1. 查看 server2 的日志,如果没有问题进入第 6 步

  2. 关闭 server2

./disable.sh server2
  1. 进入第一步
  2. 禁用 server1
./disable.sh server1
  1. 查看 server1, 等到没有新的请求
  2. 运行便捷启动脚本移除 server1
./start.sh
  1. 到此服务器便完成更新

相关文章

  • 无感知更新服务脚本

    背景 我们的web服务是用python写的,跑在 docker container 里面,并且用docker-co...

  • Docker Swarm 进阶:服务滚动部署

    文/Anoyi 服务平滑升级,即服务不停机更新,客户端无感知。 ► 案例演示:Redis 版本升级 4.0.4 -...

  • 客户端无感知的更新服务

    我们的服务端使用python写的,用nginx做反向代理。 常规情况下,更新服务是要把服务关掉然后在开启一个新的节...

  • 几个常用的脚本备份

    1 定期备份数据库 2 测试服务器自动更新脚本

  • Spring boot 2.3优雅下线,距离生产还有多远?

    简介:对于任何一个线上应用,如何在服务更新部署过程中保证业务无感知是开发者必须要解决的问题,即从应用停止到重启恢复...

  • iOS 热更新-方案对比

    前言 公司要添加热更新bug,现在总结对比下iOS热更新都有哪些 一、JSPath 热更新时,从服务器拉去js脚本...

  • jmeter+Jenkins配合使用

    问题背景 jmeter脚本在远程服务器上执行,怎么自动化更新脚本并且执行? 解决方法 利用Jmeter 命令行下动...

  • python 游戏自动更新

    本脚本用于游戏服务器端的自动更新,主要流程就是把更新包和脚本的配置文件放在一个中心端center,分支机房clie...

  • HTTP-缓存控制

    静态服务器(无缓存无更新请求数据) 优点:简单。 缺点:每次请求必须查找返回原始文件,浪费带宽。 有缓存-无更新请...

  • 自瞄3.15

    【脚本开关→】开【←脚本开关】 【脚本版本→】通用技能自瞄3.15【←脚本版本】 【脚本关闭公告→】脚本已更新.....

网友评论

      本文标题:无感知更新服务脚本

      本文链接:https://www.haomeiwen.com/subject/rdzogktx.html