關於平滑發佈與灰度發佈的理解

【灰度發佈與平滑發佈】
2017/2/24 xmhexinginx

平滑發佈:
    什麼叫平滑:在發佈的過程當中不影響用戶的使用,系統不會因發佈而暫停對外服務,不會形成用戶短暫性沒法訪問;服務器

灰度發佈:
    什麼叫灰度:發佈後讓部分用戶使用新版本,其它用戶使用舊版本,逐步擴大影響範圍,最終達到所有更新的發佈方式 ;app

灰度發佈與平滑發佈實際上是關聯的。當服務器的數量只有一臺的時候,不存在灰度發佈,一旦發佈了就是全部用戶都更新了,
因此這個時候只有平滑發佈。當服務器數量大於一臺的時候,只要每臺服務器都能達到平滑發佈的方式,而後設定好須要
發佈的服務器佔比數量,就能夠實現灰度發佈了。負載均衡


單臺服務器的平滑發佈模式:
    單機狀態下,應用的持續服務主要依靠Nginx的負載均衡及自動切換功能;
    爲了可以切換應用,須要在服務器中建立兩個相同的獨立應用,分配兩個不一樣的端口,
    例如:app1,端口801; app2,端口802;
    在Nginx中,將app1,app2做爲負載均衡加載:
    upstream myapp{
          server 127.0.0.1:801; //app1
          server 127.0.0.1:802; //app2
    }測試

    而後設置代理超時爲1秒,以便在某個應用中止時及時切換到另外一個應用:
server {
    listen 80;
    server_name localhost;
    location /{
    proxy_pass http://myapp;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_connect_timeout       1;
    proxy_read_timeout          1;
    proxy_send_timeout          1;
    }
}
    以上內容寫在單獨的配置文件中:/vhost/pub/pub_app.conf
    在nginx.conf裏包含進去:
    include /vhost/*.conf;代理


    如今系統會均衡地分配用戶訪問app1與app2。
    接下來咱們進行平滑發佈,咱們先把app1中止,而後將新版本發佈到app1中:
    步驟1: 準備發佈app1配置文件
    新作一個配置文件 pub_app1_down.conf,內容中把app1中止掉:
    upstream myapp{
          server 127.0.0.1:801 down; //app1
          server 127.0.0.1:802; //app2
    }
    
    將這個文件內容覆蓋掉在原有的pub_app.conf
    cp -f /vhost/pub/pub_app1_down.conf /vhost/pub_app.confserver


    步驟2:中止app1應用
    平滑從新一下nginx: 
    service nginx reload
    或者:
    /usr/local/nginx/sbin/nginx -s reloadip

    此時全部的請求都轉到了app2了;rem

    步驟3:更新app1
    如今能夠經過各類方式來更新應用了,例如:壓縮包方式:
    wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tar
    unzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tar
    其中:-o:不提示的狀況下覆蓋文件;-d:指定解壓目錄
    
    步驟3.5 內部測試
    若是須要的話,能夠在這一步對app1進行內部測試,以確保應用的正確性;get

    步驟4:準備發佈app2配置文件;
    此時app1已是最新版本的文件了,能夠切換到app1來對外,

    建立一個新的nginx配置文件:pub_app2_down.conf,設置爲app1對外,app2中止便可:
    
    upstream myapp{
          server 127.0.0.1:801; //app1
          server 127.0.0.1:802 down; //app2
    }

    將這個文件內容覆蓋掉在原有的pub_app.conf
    cp -f /vhost/pub/pub_app2_down.conf /vhost/pub_app.conf

    步驟5:切換到app1新版本應用 
    平滑從新一下nginx: 
    service nginx reload
    或者:
    /usr/local/nginx/sbin/nginx -s reload

    此時全部的請求都轉到了app1了,新版本開始運行;

    步驟6:更新app2
    與第3步同樣,解壓就能夠了,這裏能夠省去下載過程
    unzip -o -d /home/wwwroot/app2/ myapp-v3.2.32.tar

    步驟7:恢復app1,app2同時對外:
    cp -f /vhost/pub/pub_app.conf /vhost/pub_app.conf
    
    平滑從新一下nginx: 
    service nginx reload
    或者:
    /usr/local/nginx/sbin/nginx -s reload

    至此,整個應用都已經更新。

    將各步驟中的腳本彙總一下:

    [pub.sh]
    #============ 平滑發佈 v1.0 ===============
    #step 1
    cp -f /vhost/pub/pub_app1_down.conf /vhost/pub_app.conf
    
    #step 2
    service nginx reload
    
    #step 3
    wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tar
    unzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tar
    
    #step 4
    cp -f /vhost/pub/pub_app2_down.conf /vhost/pub_app.conf
    
    #step 5
    service nginx reload
    
    #step 6
    unzip -o -d /home/wwwroot/app2/ myapp-v3.2.32.tar
    
    #step 7
    cp -f /vhost/pub/pub_app.conf /vhost/pub_app.conf
    service nginx reload
    #============ 平滑發佈 v1.0  ===============    

    備註:也能夠充分利用nginx的宕機檢測,省去步驟1,2,4,5,7;
    簡化後的腳本以下:

    [pub_mini.sh]
    #======== 簡化版腳本 =============
    wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tar
    unzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tar

    unzip -o -d /home/wwwroot/app2/ myapp-v3.2.32.tar
    #========= over ===========

多臺服務器平滑發佈模式:
    有了單臺平滑發佈模式的基礎,多臺服務器就簡單了。
    每臺服務器看成應用進行發佈就能夠了,因爲nginx有宕機自動檢測功能,
    只須要在每臺服務器上先中止發佈,而後更新文件,再啓動就能夠了;
    若是選擇部分的服務器進行更新,那就是灰度了。

 

純屬我的理解,上面的腳本還須要檢測;

相關文章
相關標籤/搜索