爲了保障公司業務不受單點機房故障影響;須要作機房雙活;把流量分別導向不一樣的IDC機房,按比例分配;方法有多種,本文所講的就是模擬按客戶端不一樣cookie分流實現;nginx plug+自帶cookie分配,就是商業版支持,對於 大多的創業公司用的是源生的開源nginx則能夠經過應用層給不一樣的客戶端分配cookie值來導向到不一樣的IDC機房;這麼說容易理解點;本文就是經過模擬不一樣的客戶端cookie導向到不一樣的IDC機房;
架構以下:
html
圖中的高可用負載既能夠是單個機房的,也能夠是多個機房的入口;下面的IDCA ,IDCB等機房,既能夠是具體的web,也能夠是多個機房;nginx
功能實現:
nginx商業版自帶的cookie分配默認是經過客戶端攜帶的cookie作hash分配到各後端;這裏是經過應用層給客戶端分配cookie並導向到指定後端;實現過程以下:
應用程序給客戶端分配生成特定cookie鍵值,如ickey=」yunhnagweb201801」,安全公司或高可用負載設備經過匹配cookie值,將流量分配到不一樣的IDC機房;鍵值以01結尾分配到IDCA;鍵值以02結尾分配到IDCB;web
本次測試因爲沒有應用層分配cookie,經過模擬方式進行即生成cookie是在負載設備上經過請求ip的後綴來生成cookie並將請求分配到指定web(或叫IDC)上;
測試環境:
測試所用三臺主機:nginx 均是經過epel庫yum安裝便可!
負載設備:10.8.11.203 Centos7 nginx 1.12 域名:test.test.com
Web1(模擬IDCA): 10.8.11.144 域名:test.test.com
Web2(模擬IDCB): 10.8.11.181 域名:test.test.com
以上域名在本地和三臺hosts作對應解析;
當用戶訪問負載設備test.test.com時 經過請求的來源ip後綴來肯定流量分配到那臺IDC上;redis
配置
入口負載設備 nginx配置後端
[root@10.8.11.203 conf.d]# cat test_map_cookie.conf map $COOKIE_ickey $group { ~*[0-5]$ zone01; #cookie 0-5結尾走zone01 ~*[6-9]$ zone02; # cookie 6-9 結尾走zone02 default root; #默認 } upstream zone01 server 10.8.11.144:8080 weight=1 max_fails=1 fail_timeout=30s; } upstream zone02 { server 10.8.11.181:8080 weight=1 max_fails=1 fail_timeout=30s; } upstream root { server 10.8.11.203:80 weight=1 max_fails=1 fail_timeout=30s; } server { add_header Set-Cookie "ickey=bqx1x3x5hhda0000000002${remote_addr}"; #模擬客戶端訪問時帶的cookie(通常是應用層分配好) listen 80; server_name test.test.com; access_log logs/access_log main; error_log logs/error_log; location / { proxy_pass http://$group; proxy_set_header X-Forwarded-For $remote_addr; } }
這裏注意的是 後端web偵聽的端口不要和上層負載設備端口同樣;實測中這樣會行不通!安全
兩臺web配置
爲了能看到來自那臺web(IDC)響應,各自返回的web內容加以區別;cookie
Web1(IDCA):架構
[root@test-web_redis-144 conf.d]# cat web144.conf server{ listen 8080; server_name test.test.com; root /home/dongyc/web144/; index index.html; access_log /var/log/nginx/test.ickey.cn_nginx.log main; }
查看web內容:ide
[root@test-web_redis-144 conf.d]# cat /home/dongyc/web144/index.html <h1>test web web144 form IDCA.</h1>
Web2(IDCB):測試
[root@test-web_redis-181 conf.d]# cat web181.conf server{ listen 8080; server_name test.test.com; root /home/dongyc/web181/; index index.html; access_log /var/log/nginx/test.ickey.cn_nginx.log main; }
查看web內容:
[root@test-web_redis-181 conf.d]# cat /home/dongyc/web181/index.html <h1>test web 181 from IDCB.</h1>
因爲客戶端cookie模擬時以客戶端ip結尾,同時 0-5結尾的分配到IDCA,6-9分配到IDCB;所以找兩臺ip結尾分別在以上兩個區間便可看到效果,本次找的一臺是65 和66結尾的客戶端請求,以便 看到效果;
10.8.11.65請求:
10.8.11.66請求:
請求經過入口負載設備;經過cookie的值分配請求發往何處;此方案可行並獲得驗證;
線上可經過改造應用層給各客戶端分配特定cookie,安全公司經過cookie按比例分配到不一樣IDC;並在並個IDC出現故障時;切換流量到正常IDC中!
影響:當某IDC故障時,須要即時切換,並會丟失故障IDC登陸用戶的鏈接狀態;