无感知更新服务脚本

2020-12-16  本文已影响0人  Lupino

背景

我们的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. 到此服务器便完成更新
上一篇 下一篇

猜你喜欢

热点阅读