目錄
一、平滑發布與灰度發布
一、平滑發布與灰度發布
什么叫平滑:在發布的過程中不影響用戶的使用,系統不會因發布而暫停對外服務,不會造成用戶短暫性無法訪問;
什么叫灰度:發布后讓部分用戶使用新版本,其它用戶使用舊版本,逐步擴大影響范圍,最終達到全部更新的發布方式 ;
灰度發布與平滑發布其實是關聯的。當服務器的數量只有一臺的時候,不存在灰度發布,一旦發布了就是所有用戶都更新了, 所以這個時候只有平滑發布。當服務器數量大于一臺的時候,只要每臺服務器都能達到平滑發布的方式,然后設定好需要 發布的服務器占比數量,就可以實現灰度發布了。
單臺服務器的平滑發布模式: 單機狀態下,應用的持續服務主要依靠Nginx的負載均衡及自動切換功能; 為了能夠切換應用,需要在服務器中創建兩個相同的獨立應用,分配兩個不同的端口, 例如:app1,端口801; app2,端口802; 在Nginx中,將app1,app2作為負載均衡加載:
? ? upstream myapp{server 127.0.0.1:801; //app1server 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; //app1server 127.0.0.1:802; //app2}將這個文件內容覆蓋掉在原有的pub_app.confcp -f /vhost/pub/pub_app1_down.conf /vhost/pub_app.conf??步驟2:停止app1應用平滑重新加載一下nginx: service nginx reload或者:/usr/local/nginx/sbin/nginx -s reload?此時所有的請求都轉到了app2了;?步驟3:更新app1現在可以通過各種方式來更新應用了,例如:壓縮包方式:wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tarunzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tar其中:-o:不提示的情況下覆蓋文件;-d:指定解壓目錄步驟3.5 內部測試如果需要的話,可以在這一步對app1進行內部測試,以確保應用的正確性;?步驟4:準備發布app2配置文件;此時app1已經是最新版本的文件了,可以切換到app1來對外,?創建一個新的nginx配置文件:pub_app2_down.conf,設置為app1對外,app2停止即可:upstream myapp{server 127.0.0.1:801; //app1server 127.0.0.1:802 down; //app2}?將這個文件內容覆蓋掉在原有的pub_app.confcp -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 1cp -f /vhost/pub/pub_app1_down.conf /vhost/pub_app.conf#step 2service nginx reload#step 3wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tarunzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tar#step 4cp -f /vhost/pub/pub_app2_down.conf /vhost/pub_app.conf#step 5service nginx reload#step 6unzip -o -d /home/wwwroot/app2/ myapp-v3.2.32.tar#step 7cp -f /vhost/pub/pub_app.conf /vhost/pub_app.confservice nginx reload#============ 平滑發布 v1.0 =============== ? ??備注:也可以充分利用nginx的宕機檢測,省去步驟1,2,4,5,7;簡化后的腳本如下:?[pub_mini.sh]#======== 簡化版腳本 =============wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tarunzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tar?unzip -o -d /home/wwwroot/app2/ myapp-v3.2.32.tar#========= over ===========
多臺服務器平滑發布模式: 有了單臺平滑發布模式的基礎,多臺服務器就簡單了。 每臺服務器當作應用進行發布就可以了,由于nginx有宕機自動檢測功能, 只需要在每臺服務器上先停止發布,然后更新文件,再啟動就可以了; 如果選擇部分的服務器進行更新,那就是灰度了。