【灰度發佈與平滑發佈】
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有宕機自動檢測功能,
只須要在每臺服務器上先中止發佈,而後更新文件,再啓動就能夠了;
若是選擇部分的服務器進行更新,那就是灰度了。
純屬我的理解,上面的腳本還須要檢測;