久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

zerodown-timeupdate服務(wù)的方案

從問題開始

成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站制作、成都做網(wǎng)站、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)新河,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

先來拋一塊磚,對于靜態(tài)編譯的應(yīng)用程序,比如用C、C++、Golang或者其它的語言編寫的程序,如果我們修改一個(gè)BUG或者添加一個(gè)新的特性后,如何在服務(wù)不下線的情況下更遠(yuǎn)應(yīng)用程序呢?

拋出了一個(gè)問題,一個(gè)很平常的問題,有人對問題思考比較透徹,比如牛頓,被蘋果砸中了之后,引起了很多的思考,最后發(fā)現(xiàn)了萬有引力定律。

如果你被蘋果砸中了怎么辦?

玩笑話一句,那我們?nèi)绻惶O果砸中了會不死變成智障呢?

那么我們回到剛才這個(gè)問題 :

當(dāng)我們修復(fù)BUG,添加新的需求后,如何如絲般順滑地升級服務(wù)器應(yīng)用程序,而不會中斷服務(wù)?

這個(gè)問題意味著:

C / C++ / GO都是靜態(tài)語言,所有的指令都編譯在可執(zhí)行文件,升級就意味著編譯新的執(zhí)行文件替換舊的執(zhí)行文件,已經(jīng)運(yùn)行的進(jìn)程如何加載新的image(可執(zhí)行程序文件)去執(zhí)行呢?

正在處理的業(yè)務(wù)邏輯不能中斷,正在處理的連接不能暴力中斷?

這種如絲般順滑地升級應(yīng)用程序,我們稱之為熱更新。

用個(gè)形象上的比喻表示就是:

你現(xiàn)在在坐卡車,卡車開到了150KM/H

然后,有個(gè)輪胎,爆了

然后,司機(jī)說,你就直接換吧,我不停車。你小心點(diǎn)換

哦,Lee哥,我明白了,在這些情況下,我們是不能使用哪個(gè)萬能地“重啟”去解決問題的。

第一種解決方案:灰度發(fā)布和A/B測試引起的思考

灰度發(fā)布(又名金絲雀發(fā)布)是指在黑與白之間,能夠平滑過渡的一種發(fā)布方式。在其上可以進(jìn)行A/B testing,即讓一部分用戶繼續(xù)用產(chǎn)品特性A,一部分用戶開始用產(chǎn)品特性B,如果用戶對B沒有什么反對意見,那么逐步擴(kuò)大范圍,把所有用戶都遷移到B 上面來。灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時(shí)候就可以發(fā)現(xiàn)、調(diào)整問題,以保證其影響度。利用nginx做灰度發(fā)布的方案如下圖:

nginx是一個(gè)反向代理軟件,可以把外網(wǎng)的請求轉(zhuǎn)發(fā)到內(nèi)網(wǎng)的業(yè)務(wù)服務(wù)器上,系統(tǒng)的分層的設(shè)計(jì),一般我們把nginx歸為接入層,當(dāng)然LVS/F5/Apache等等都能去轉(zhuǎn)發(fā)用戶請求。比如我們來看一個(gè)nginx的配置:

http {

    upstream cluster {

        ip_hash;

        server 192.168.2.128:8086 weight=1 fail_timeout=15 max_fails =3;

        server 192.168.2.130:8086 weight=2 fail_timeout=15 max_fails =3;

    }

    server {

        listen 8080;

        location / {

            proxy_pass http://cluster;

        }

    }

}

我們對8080端口的訪問,都會轉(zhuǎn)發(fā)到cluster說定義的upstream里,upstream里會根據(jù)IP hash的策略轉(zhuǎn)發(fā)給192.168.2.128和192.168.2.130的8086端口的服務(wù)上。這里配置的是ip hash,當(dāng)然nginx還支持其他策略。

那么通過nginx如何去如絲般升級服務(wù)程序呢?

比如nginx的配置:

http {  

    upstream cluster {  

        ip_hash;

        server 192.168.2.128:8086 weight=1 fail_timeout=15 max_fails =3;

        server 192.168.2.130:8086 weight=2 fail_timeout=15 max_fails =3;

    }  

    server {  

        listen 80;  

        location / {

            proxy_pass http://cluster;  

        }  

    }  

}

假如我們的服務(wù)部署在192.168.2.128上,現(xiàn)在我們修復(fù)BUG或者增加新的特性后,我們重新部署了一臺服務(wù)(比如192.168.2.130上),那么我們就可以修改nginx配置如上,然后執(zhí)行nginx -s reload加載新的配置,這樣我們現(xiàn)有的連接和服務(wù)都沒有斷掉,但是新的業(yè)務(wù)服務(wù)已經(jīng)可以開始服務(wù)了,這就是通過nginx做的灰度發(fā)布,依據(jù)這樣的方法做的測試稱之為A/B測試,好了,那如何讓老的服務(wù)徹底停掉呢?

可以修改nginx的配置如下,即在對應(yīng)的upstream的服務(wù)器上添加down字段:

http {  

    upstream cluster {  

        ip_hash;

server 192.168.2.128:8086 weight=1 fail_timeout=15 max_fails =3down;

        server 192.168.2.130:8086 weight=2 fail_timeout=15 max_fails =3;

    }  

    server {  

        listen 80;  

        location / {

            proxy_pass http://cluster;  

        }  

    }  

}

這樣等過一段時(shí)間,就可以把192.168.2.128上的服務(wù)給停掉了。

這就是通過接入層nginx的一個(gè)如絲般順滑的一個(gè)方案,這種思想同樣可以應(yīng)用于其他的比如LVS、apache等,當(dāng)然還可以通過DNS,zookeeper,etcd等,就是把流量全都打到新的系統(tǒng)上去。

灰度發(fā)布解決的流量轉(zhuǎn)發(fā)到新的系統(tǒng)中去,但是如果對于nginx這樣的應(yīng)用程序,或者我就是要在這臺機(jī)器上升級image,那怎么辦呢?這就必須要實(shí)現(xiàn)熱更新,這里需要考慮的問題是舊的服務(wù)如果緩存了數(shù)據(jù)怎么辦?如果正在處理業(yè)務(wù)邏輯怎么辦?

第二種解決方案:nginx的熱更新方案

nginx采用Master/Worker的多進(jìn)程模型,Master進(jìn)程負(fù)責(zé)整個(gè)nginx進(jìn)程的管理,比如停機(jī)、日志重啟和熱更新等等,worker進(jìn)程負(fù)責(zé)用戶的請求處理。

如上一個(gè)nginx里配置的所有的監(jiān)聽端口都是首先在Master進(jìn)程里create的socket(sfd)、bind、listen,然后Master在創(chuàng)建worker進(jìn)程的時(shí)候把這些socket通過unix domain socket復(fù)制給了Worker進(jìn)程,Worker進(jìn)程把這些socket全都添加到epoll,之后如果有客戶端連接進(jìn)來了,則由worker進(jìn)程負(fù)責(zé)處理,那么也就是說用戶的請求是由worker進(jìn)程處理的。

先交代了nginx的IO處理模型的背景,然后我們再看nginx的熱更新方案:

升級的步驟:

第一步:升級nginx二進(jìn)制文件,需要先將新的nginx可執(zhí)行文件替換原有舊的nginx文件,然后給nginx master進(jìn)程發(fā)送USR2信號,告知其開始升級可執(zhí)行文件;nginx master進(jìn)程會將老的pid文件增加.oldbin后綴,然后調(diào)用exec函數(shù)拉起新的master和worker進(jìn)程,并寫入新的master進(jìn)程的pid。

UID        PID  PPID  C STIME TTY          TIME CMD

root      4584     1  0 Oct17 ?        00:00:00 nginx: master process /usr/local/apigw/apigw_nginx/nginx

root     12936  4584  0 Oct26 ?        00:03:24 nginx: worker process

root     12937  4584  0 Oct26 ?        00:00:04 nginx: worker process

root     12938  4584  0 Oct26 ?        00:00:04 nginx: worker process

root     23692  4584  0 21:28 ?        00:00:00 nginx: master process /usr/local/apigw/apigw_nginx/nginx

root     23693 23692  3 21:28 ?        00:00:00 nginx: worker process

root     23694 23692  3 21:28 ?        00:00:00 nginx: worker process

root     23695 23692  3 21:28 ?        00:00:00 nginx: worker process

關(guān)于exec家族的函數(shù)說明見下:

NAME

       execl, execlp, execle, execv, execvp, execvpe - execute a file

SYNOPSIS

       #include <unistd.h>

       extern char **environ;

       int execl(const char *path, const char *arg, ...

                       /* (char  *) NULL */);

       int execlp(const char *file, const char *arg, ...

                       /* (char  *) NULL */);

       int execle(const char *path, const char *arg, ...

                       /*, (char *) NULL, char * const envp[] */);

       int execv(const char *path, char *const argv[]);

       int execvp(const char *file, char *const argv[]);

       int execvpe(const char *file, char *const argv[],

                       char *const envp[]);

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       execvpe(): _GNU_SOURCE

DESCRIPTION

The  exec()  family of functions replaces the current process image with a new process image.  The functions described in this manual page are front-ends for execve(2).

       (See the manual page for execve(2) for further details about the replacement of the current process image.)

       The initial argument for these functions is the name of a file that is to be executed.

       The const char *arg and subsequent ellipses in the execl(), execlp(), and execle() functions can be thought of as arg0, arg1, ..., argn.  Together they describe a  list

       of  one or more pointers to null-terminated strings that represent the argument list available to the executed program.  The first argument, by convention, should point

       to the filename associated with the file being executed.  The list of arguments must be terminated by a null pointer, and, since  these  are  variadic  functions,  this

       pointer must be cast (char *) NULL.

       The  execv(),  execvp(),  and execvpe() functions provide an array of pointers to null-terminated strings that represent the argument list available to the new program.

       The first argument, by convention, should point to the filename associated with the file being executed.  The array of pointers must be terminated by a null pointer.

       The execle() and execvpe() functions allow the caller to specify the environment of the executed program via the argument envp.  The envp argument is an array of point‐

       ers  to null-terminated strings and must be terminated by a null pointer.  The other functions take the environment for the new process image from the external variable

       environ in the calling process.

第二步:在此之后,所有工作進(jìn)程(包括舊進(jìn)程和新進(jìn)程)將會繼續(xù)接受請求。這時(shí)候,需要發(fā)送WINCH信號給nginx master進(jìn)程,master進(jìn)程將會向worker進(jìn)程發(fā)送消息,告知其需要進(jìn)行g(shù)raceful shutdown,worker進(jìn)程會在連接處理完之后進(jìn)行退出。


UID        PID  PPID  C STIME TTY          TIME CMD

root      4584     1  0 Oct17 ?        00:00:00 nginx: master process /usr/local/apigw/apigw_nginx/nginx

root     12936  4584  0 Oct26 ?        00:03:24 nginx: worker process

root     12937  4584  0 Oct26 ?        00:00:04 nginx: worker process

root     12938  4584  0 Oct26 ?        00:00:04 nginx: worker process

root     23692  4584  0 21:28 ?        00:00:00 nginx: master process /usr/local/apigw/apigw_nginx/nginx

如果舊的worker進(jìn)程還需要處理連接,則worker進(jìn)程不會立即退出,需要待消息處理完后再退出。

第三步:經(jīng)過一段時(shí)間之后,將會只會有新的worker進(jìn)程處理新的連接。

注意,舊master進(jìn)程并不會關(guān)閉它的listen socket;因?yàn)槿绻鰡栴}后,需要回滾,master進(jìn)程需要法重新啟動(dòng)它的worker進(jìn)程。

第四步:如果升級成功,則可以向舊master進(jìn)程發(fā)送QUIT信號,停止老的master進(jìn)程;如果新的master進(jìn)程(意外)退出,那么舊master進(jìn)程將會去掉自己的pid文件的.oldbin后綴。

幾個(gè)核心的步驟和命令說明如下:

操作的命令

master進(jìn)程相關(guān)信號

  • USR2 升級可執(zhí)行文件
  • WINCH 優(yōu)雅停止worker進(jìn)程
  • QUIT 優(yōu)雅停止master進(jìn)程

worker進(jìn)程相關(guān)信號

  • TERM, INT 快速退出進(jìn)程
  • QUIT 優(yōu)雅停止進(jìn)程

nginx本身是一個(gè)代理組件(代理http TCP UDP),本身并沒有什么業(yè)務(wù)邏輯,也即沒有什么狀態(tài)數(shù)據(jù)可言,即使有業(yè)務(wù)邏輯這套方案也是可以的。

nginx是如何graceful shutdown的?也即正在處理的http請求和長連接怎么處理?

如何啟動(dòng)新的的image:

好了,以上就是zero down-time update的一些方案,如果還有不明白可以看下面這個(gè)視頻。
https://www.bilibili.com/video/av57429199

當(dāng)前標(biāo)題:zerodown-timeupdate服務(wù)的方案
文章鏈接:http://www.js-pz168.com/article40/jgdjeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管營銷型網(wǎng)站建設(shè)網(wǎng)站改版網(wǎng)站導(dǎo)航標(biāo)簽優(yōu)化品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
中文字幕中文乱码欧美一区二区| 九一九一国产精品| 韩日精品视频一区| 91婷婷韩国欧美一区二区| 蜜桃成人在线| 欧美日本一区二区| 中文字幕高清一区| 青娱乐精品在线视频| 99精品偷自拍| 天堂精品一区二区三区| 日韩亚洲欧美综合| 亚洲精选视频在线| 国产精品一二三四区| 精品国产中文字幕| 欧美午夜一区二区三区免费大片| 国产亚洲精品福利| 美腿丝袜亚洲一区| 国产乱码精品一区二区三区日韩精品| 在线免费观看日本欧美| 国产三级精品三级在线专区| 日本中文一区二区三区| 91九色视频在线观看| 色综合色综合色综合| 久久精品在线观看| 伦理电影国产精品| 激情欧美一区二区三区中文字幕| 欧美日韩在线亚洲一区蜜芽| 国产精品每日更新在线播放网址| 久久精品理论片| 久久婷婷人人澡人人喊人人爽| 欧美精品18+| 亚洲精品日韩专区silk| 不卡影院免费观看| 91国偷自产一区二区三区成为亚洲经典| 久久久91精品国产一区二区精品| 日本欧美在线看| 国模精品一区二区三区| 日韩一区二区精品在线观看| 亚洲国产综合91精品麻豆| 91日韩一区二区三区| 欧美系列在线观看| 亚洲综合激情另类小说区| 成年人国产精品| 欧美亚洲一区二区在线| 亚洲视频在线观看三级| 成人黄色在线看| 在线观看日韩电影| 亚洲精品免费在线播放| 97超碰欧美中文字幕| 在线看不卡av| 亚洲一区二区不卡免费| 91免费看网站| 91精品国产色综合久久不卡蜜臀 | 国产成人精品一区二| 亚欧精品在线| 亚洲欧洲成人自拍| 99久久久久久99| 欧美日韩国产综合一区二区| 亚洲一区日韩精品中文字幕| www日韩av| 精品久久久久久久久久久久包黑料| 免费成人在线网站| 日韩精品大片| 亚洲欧洲成人av每日更新| 99精品欧美一区二区蜜桃免费| 欧美人动与zoxxxx乱| 五月综合激情日本mⅴ| 久草热久草热线频97精品| 久久亚洲一区二区三区明星换脸 | 自拍av一区二区三区| 91在线观看高清| 日韩欧美二区三区| 国产中文字幕一区| 91久久香蕉国产日韩欧美9色| 一区二区三区高清| 国产一区二区免费在线观看| 欧美va亚洲va在线观看蝴蝶网| 狠狠色2019综合网| 综合国产精品久久久| 亚洲国产日韩av| 日本成人看片网址| 亚洲男人的天堂一区二区| 国产伦精品一区二区三| 久久精品夜色噜噜亚洲aⅴ| 成人精品gif动图一区| 9191国产精品| 韩国女主播一区| 欧洲视频一区二区| 视频一区欧美精品| 午夜久久资源| 亚洲v中文字幕| 视频一区二区在线| 亚洲国产精品一区二区久久恐怖片| 精品欧美日韩| 国产精品久久久久久久久久久免费看 | 欧美大片国产精品| 国产一区二三区| 在线观看日韩片| 亚洲成人激情社区| 亚洲春色综合另类校园电影| 亚洲综合小说图片| 日本一区二区三区视频在线播放| 亚洲乱码国产乱码精品精的特点| 欧美日韩三区四区| 亚洲综合成人网| 亚洲激情一区二区| 性做久久久久久免费观看| 日韩免费av一区二区三区| 亚洲一区国产视频| 亚洲一区精彩视频| 日本成人在线不卡视频| 在线免费观看不卡av| 精品一区二区在线观看| 欧美色窝79yyyycom| 黑人巨大精品欧美黑白配亚洲| 欧美日韩激情一区| 国产99精品国产| 欧美videossexotv100| 91丨九色丨国产丨porny| 国产亚洲污的网站| 国产美女精品在线观看| 亚洲精品综合在线| 视频一区二区在线| 免费成人av在线| 欧美精品自拍偷拍| www.亚洲人| 国产精品久久久久久久久免费相片 | 久久国产一区二区| 亚洲另类在线一区| 中国成人亚色综合网站| 久草精品在线观看| 欧美大片拔萝卜| 成人黄色片视频网站| 国产精品久久久久毛片软件| 欧美日韩精品久久| 视频一区二区三区入口| 欧美日韩综合一区| 懂色av中文字幕一区二区三区| 久久网站最新地址| 精品毛片久久久久久| 亚洲bt欧美bt精品777| 欧美色视频一区| 波多野结衣一区二区三区| 国产欧美一区二区精品性色| 久久久久se| 日韩av午夜在线观看| 91精品国产色综合久久不卡蜜臀| 91香蕉视频污| 一区二区在线观看不卡| 在线观看欧美黄色| 国产成人免费在线观看| 中文字幕欧美日本乱码一线二线 | av资源站一区| 中文字幕一区av| 亚洲女人毛片| 国产精品1区二区.| 国产精品视频第一区| 亚洲欧洲日韩综合二区| 精品亚洲免费视频| 久久精品视频一区二区| 日韩av一区二区三区美女毛片| 麻豆精品国产传媒mv男同| 亚洲精品一区二区三区蜜桃下载| 久久国产精品免费一区| 美洲天堂一区二卡三卡四卡视频| 精品国产1区二区| 美女精品国产| 国内一区二区在线| 国产精品欧美极品| 亚洲欧美丝袜| 成人教育av在线| 亚洲精品欧美激情| 欧美精品一级二级| 国产免费高清一区| 日韩电影免费在线看| www国产成人| 亚洲精品一区二区三| 成人午夜私人影院| 夜夜操天天操亚洲| 欧美大黄免费观看| 日韩.欧美.亚洲| 国产成人在线色| 亚洲欧美电影院| 欧美精选午夜久久久乱码6080| 极品日韩久久| 久久99精品久久久| 中文字幕一区二区三区蜜月| 欧美在线不卡一区| 国产精品播放| 久久99国产乱子伦精品免费| 中文幕一区二区三区久久蜜桃| 色婷婷综合激情| 97se视频在线观看| 免费观看91视频大全| 国产精品三级av| 欧美久久一二区| 日本最新一区二区三区视频观看| 成人妖精视频yjsp地址| 亚洲成人动漫一区| 精品久久久久久久人人人人传媒 |