標籤:glib roc alt 拷貝 cookie text ade emc 範圍
nginx+lua+redis實現灰階發布:
灰階發布是指在黑白之間能夠平滑過渡的一種方式
AB test就是一種灰階發布方式,讓一部分使用者繼續用A,一部分使用者開始用B,如果使用者對B沒有什麼反對意見,那麼逐步擴大範圍,把所有使用者都遷移到B上面 來。灰階發布可以保證整體系統的穩定,在初始灰階的時候就可以發現、調整問題,以保證其影響度。
灰階發布可以保證應用系統的穩定,降低產品升級影響的使用者範圍;也可以按照一定的策略讓部分使用者提前參與產品測試,從而提早擷取到使用者的反饋,完善應用功能
原理:使用nginx做負載平衡和反向 Proxy,nginx內嵌lua模組,解析並執行lua編寫的指令碼邏輯,可以通過lua解析cookie以及訪問redis,而一些灰階發布分流的策略就是放在redis裡通過cookie關聯
執行過程:
- 當使用者請求到達前段代理服務nginx,內嵌的lua模組解析nginx設定檔中的lua指令碼代碼
- lua變數擷取到用戶端的ip地址,去查詢redis緩衝內是否有該建值,如果有傳回值執行@client_test,否則執行@client
- location @client_test把請求轉寄給部屬了new版代碼伺服器,[email protected]把請求轉寄給部屬了normal版代碼的伺服器,[email protected]把請求轉寄給部屬了normal版本代碼的伺服器,伺服器返回結果。整個過程完成
安裝配置過程詳解:
- 安裝nginx
安裝依賴包:yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers make pcre-develyum -y install gd gd2 gd-devel gd2-devel lua lua-develyum –y install memcached
下載lua模組、lua-memcache操作庫檔案和nginx包
wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.18.tar.gzwget https://github.com/chaoslawful/lua-nginx-module/archive/v0.8.5.tar.gzwget https://github.com/agentzh/lua-resty-memcached/archive/v0.11.tar.gzwget http://nginx.org/download/nginx-1.4.2.tar.gztar xvf nginx-1.4.2.tar.gzcd nginx-1.4.2/./configure --prefix=/soft/nginx/ --with-http_gzip_static_module --add-module=/root/ngx_devel_kit-0.2.18/ --add-module=/root/lua-nginx-module-0.8.5/makemake install
拷貝lua的memcached操作庫檔案
tar xvf v0.11.tar.gzcp -r lua-resty-memcached-0.11/lib/resty/ /usr/lib64/lua/5.1/
配置nginx
#vim /soft/nginx/conf/nginx.confworker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; proxy_next_upstream error timeout; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $http_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 100m; client_body_buffer_size 256k; proxy_connect_timeout 180; proxy_send_timeout 180; proxy_read_timeout 180; proxy_buffer_size 8k; proxy_buffers 8 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; upstream client { server 192.168.200.29:80; } upstream client_test { server 192.168.200.29:81; } server { listen 80; server_name localhost; location / { content_by_lua ‘ clientIP = ngx.req.get_headers()["X-Real-IP"] if clientIP == nil then clientIP = ngx.req.get_headers()["x_forwarded_for"] end if clientIP == nil then clientIP = ngx.var.remote_addr end local memcached = require "resty.memcached" local memc, err = memcached:new() if not memc then ngx.say("failed to instantiate memc: ", err) return end local ok, err = memc:connect("127.0.0.1", 11211) if not ok then ngx.say("failed to connect: ", err) return end local res, flags, err = memc:get(clientIP) if err then ngx.say("failed to get clientIP ", err) return end if res == "1" then ngx.exec("@client_test") return end ngx.exec("@client") ‘; } location @client{ proxy_pass http://client; } location @client_test{ proxy_pass http://client_test; } location /hello { default_type ‘text/plain‘; content_by_lua ‘ngx.say("hello, lua")‘; } location = /50x.html { root html; } }}
檢測設定檔:
/usr/local/nginx/sbin/nginx -t
出現ok顯示成功
啟動nginx
/usr/local/nginx/sbin/nginx
啟動memchaed服務
chkconfig --level 2345 memcached on
/etc/init.d/memcached start|stop
測試lua模組是否運行正常
telnet localhost 11211Trying ::1...Connected to localhost.Escape character is ‘^]‘.set 192.168.68.211 0 3600 1STOREDget 192.168.68.211VALUE 192.168.68.211 9 1ENDquit
注意:
set後第一個值為key值。
192.168.68.211這是key值是需要灰階測試的IP地址;
0 表示一個跟該key有關的自訂資料;
3600 表示該key值的有效時間;
1 表示key所對應的value值的位元組數。
下面訪問Nginx,效果符合預期,我的IP已經在memcached中儲存值,所以請求轉寄給執行灰階測試代碼的主機。
訪問http://測試伺服器ip地址/hello 如果顯示lua表示安裝成功
在另一台測試機(這裡是192.168.200.29)設定兩個虛擬機器主機,一個用80連接埠是執行正常代碼,一個是81連接埠執行灰階測試代碼。
在memcached中以你的客戶機IP地址為key,value值為1。這裡我的IP是192.168.68.211.
從memcached刪除我的主機IP值。
再次請求Nginx,請求轉寄給執行正常代碼內容的主機。
整個配置並不複雜,整個判斷過程對服務的影響非常小。如果需要使用這個系統最好自己看看lua指令碼。
nginx+lua+redis實現灰階發布_test