基於SLB實現滾動發布


一、滾動發布介紹

滾動發布(rolling update)是最常見的一種發布模式。比如我有10台機器,一台一台的進行部署。每台機器進行部署時,需要保證沒有請求會派發到該機器,否則用戶就會看到502的錯誤。所以需要有一個“下線”的操作,把當前機器從負載均衡中摘除,然后在部署完成之后,再把自己掛回到負載均衡中,這個過程稱為“上線”。接下來會講解,配合阿里雲SLB如何做上線/下線操作。

二、SLB配置

image

配置SLB監聽端口:

image

創建虛擬服務器組:

image

配置健康檢查(很重要,可以在后端服務器上配置好nginx后再來配置):

image

image

image

相關說明:圖中的關鍵點:

  1. 健康檢查路徑,需要由實例上的web服務器提供,在本例中是/nginx-status.html
  2. 健康檢查間隔,配置為2S。
  3. 健康閾值,配置為2,也就說2次健康檢查失敗,則認為該后端服務器不可用。同樣的,兩次連續的健康檢查成功,就會認為該后端服務器可用。
  4. 按照這個配置,如果/nginx-status.html這個URL不可用超過4S,則SLB會把該服務器摘除。在這4S內,應用服務仍需要是可用的,因為還會有請求派發過來。可以通過如下方式達到這個效果。

三、后端服務器配置

3.1、安裝應用服務

此服務以tomcat為例,兩台都需要安裝

image

3.2、配置nginx

yum安裝nginx參考文檔:https://www.cnblogs.com/songxingzhu/p/8568432.html

配置nginx並啟動:

[root@test-mysqldb ~]# vim /etc/nginx/conf.d/test.conf 
server {
    listen      80;
    server_name  localhost default;
    location ~ ^/(nginx-status) {
        root /usr/java/tomcat/status;
    }
    #location / {
    #    proxy_pass http://127.0.0.1:8080;
    #}
}

#創建相關文件及目錄
[root@test-mysqldb ~]# mkdir -p /usr/java/tomcat/status/
[root@test-mysqldb ~]# touch /usr/java/tomcat/status/nginx-status.html

#另一台可以做相同的配置

相關說明:

1)在機器上放置文件:/usr/java/tomcat/status/nginx-status.html 。當該文件被刪除時候,/nginx-status.html這個請求會返回404,4S之后,該實例就會被從SLB中摘除。這個過程也就是“下線”的過程。

2)與之對應,touch /usr/java/tomcat/status/nginx-status.html 這個操作就是上線的過程,也是4S之后生效。

配置好SLB,訪問SLB的ip地址是可以負載均衡的

image

3.3、服務啟動腳本

[root@jdk-76 status]# cat appctl.sh 
#!/bin/bash

PROG_NAME=$0
ACTION=$1
ONLINE_OFFLINE_WAIT_TIME=8  # 實例上下線的等待時間
APP_START_TIMEOUT=50     # 等待應用啟動的時間
APP_PORT=9001          # 應用端口
HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT}  # 應用健康檢查URL
HEALTH_CHECK_FILE_DIR=/usr/java/tomcat/status   # 腳本會在這個目錄下生成nginx-status.html文件
APP_HOME=/usr/java/tomcat/appboss-tomcat
#JAR_NAME=app-0.1.0.jar # jar包的名字
#APP_LOG=${APP_HOME}/logs/app.log # 應用的日志文件
PID_FILE=${APP_HOME}/tomcat.pid   # 應用的pid會保存到這個文件中
# 創建出相關目錄
#mkdir -p ${HEALTH_CHECK_FILE_DIR}  
#mkdir -p ${APP_HOME}
#mkdir -p ${APP_HOME}/logs

usage() {
    echo "Usage: $PROG_NAME {start|stop|online|offline|restart}"
    exit 2
}
online() {
    # 掛回SLB
    touch -m $HEALTH_CHECK_FILE_DIR/nginx-status.html || exit 1
    echo "wait app online in ${ONLINE_OFFLINE_WAIT_TIME} seconds..."
    sleep ${ONLINE_OFFLINE_WAIT_TIME}
}
offline() {
    # 摘除SLB
    rm -f $HEALTH_CHECK_FILE_DIR/nginx-status.html || exit 1
    echo "wait app offline in ${ONLINE_OFFLINE_WAIT_TIME} seconds..."
    sleep ${ONLINE_OFFLINE_WAIT_TIME}
}
health_check() {
    exptime=0
    echo "checking ${HEALTH_CHECK_URL}"
    while true
    do
        status_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code}  ${HEALTH_CHECK_URL}`
        if [ x$status_code != x200 ];then
            sleep 1
            ((exptime++))
            echo -n -e "\rWait app to pass health check: $exptime..."
        else
            break
        fi
        if [ $exptime -gt ${APP_START_TIMEOUT} ]; then
            echo
            echo 'app start failed'
            exit 1
        fi
    done
    echo "check ${HEALTH_CHECK_URL} success"
}
start_application() {
    echo "start tomcat"
    if [ -f "$PID_FILE" ] && kill -0 "$(cat ${PID_FILE})"; then
        echo "Application is running, exit"
        exit 0
    fi
    #rm -rf ${APP_HOME}/${JAR_NAME}
    #tar -zxvf /home/admin/package.tgz -C ${APP_HOME}
    #java -jar ${APP_HOME}/${JAR_NAME} > ${APP_LOG} 2>&1 &
    #echo $! > ${PID_FILE}
    ${APP_HOME}/bin/startup.sh
}
stop_application() {
    echo "stop tomcat"
    if [ -f "$PID_FILE" ]; then
        kill -9 `cat $PID_FILE`
        rm $PID_FILE
    else
        echo "pid file $PID_FILE does not exist, do noting"
    fi
}
start() {
    start_application
    health_check
    online
}
stop() {
    offline
    stop_application
}
case "$ACTION" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    online)
        online
    ;;
    offline)
        offline
    ;;
    restart)
        stop
        start
    ;;
    *)
        usage
    ;;
esac

參考文檔:

https://helpcdn.aliyun.com/document_detail/57399.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM