1. 程式人生 > >OpenResty Codis集群緩存系統

OpenResty Codis集群緩存系統

redis openresty codis srcache

OpenResty Codis集群緩存系統


部署環境

OpenResty1.12.5

Codis3.2集群(客戶端不支持Redis集群協議故選擇了Codis集群)

Nginx1.12.1反向代理

Iis7源站


依賴的第三方模塊

echo-nginx-module
https://github.com/openresty/echo-nginx-module 
set-misc-nginx-module 
https://github.com/openresty/set-misc-nginx-module 
redis-nginx-module
redis2-nginx-module
https://github.com/openresty/redis2-nginx-module 
srcach-nginx-module 
https://github.com/openresty/srcache-nginx-module



測試架構

客戶端------OR入口------Codis緩存------Nginx反向代理------IIS源站



一,測試效果

測試SET GET KEY

http://www.test.com/350/thread-13741876.html

OR訪問日誌

172.17.0.20 - - [13/Sep/2017:20:14:23 +0800] "GET /350/thread-13741876.html HTTP/1.1" "200" 17909 0.060 18361 1382 [0.057] [MISS] [STORE] [6666]
172.17.0.20 - - [13/Sep/2017:20:15:52 +0800] "GET /350/thread-13741876.html HTTP/1.1" "200" 17896 0.003 18327 1382 [-] [HIT] [BYPASS] [-]



Nginx訪問日誌(只有1次記錄,第二次緩存命中沒有回源)

{ "@timestamp": "2017-09-13T20:14:33+08:00", "clientRealIp": "172.17.0.20", "size": 17896, "method": "GET", "responsetime": 0.055, "upstreamhost": "172.17.3.97:80", 
"http_host": "www.test.com", "url": "http://www.test.com/350/thread-13741876.html", "referrer": "-", "agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "status": "200"}



6666秒默認緩存

[[email protected] ]# redis-cli -h 172.17.6.131 -p 19000

172.17.6.131:19000> TTL www.test.com/350/thread-13741876.html

(integer) 6639


測試DEL KEY

瀏覽器發送刪除KEY請求

http://www.test.com/delkey/www.test.com/350/thread-13741876.html

Codis集群上驗證

172.17.6.131:19000> TTL www.test.com/350/thread-13741876.html

(integer) -2




二,配置詳解

1,設置Codis集群信息

    upstream redis_server {
        server 172.17.6.131:19000;#Codis集群對外VIP,TCP協議
        keepalive 100;#一個連接池最多100個連接可根據實際情況設置
}



2,設置Nginx反向代理

    upstream baa_bitauto_com {
        server 172.17.2.216:80;       #Nginx反向代理前端IP
}



3,刪除key,默認優先級最高,註意每個location裏記錄日誌方便查看

        location ~ /delkey/(.*) {
                set $redis_key $1;  #set redis_key為匹配url()裏內容
                redis2_query del $redis_key;    #redis2_query語法類似redis_cli語法例如語法: redis2_query 指令 參數1 參數2,這裏代表刪除key,key名字為上面獲取的 
                redis2_pass redis_server;  #redis反向代理可知道upsteam明或者IP:端口
                access_log  /data/wwwlogs/access_www.test.com-delkey.log srcache_log;
        }


4,這裏針對目錄進行配置測試

        location / {
            default_type text/html;
            srcache_methods GET;#設置對那些HTTP請求緩存,這裏只緩存GET
            srcache_response_cache_control off;  #默認開啟,用於http,server,location區域,開啟後發現response header的Cache-Control與Expires有以下情況的:private、no-store、no-cache、max-age=0、data-no-more-recently-than-now的跳過緩存;當源站策略為不緩存時需要強制緩存源站內容,這個參數需要設置為off,設置為off後緩存策略參考srcache_expire
            srcache_store_statuses 200 301 302;  #緩存狀態嗎,根據情況自己設定
            srcache_store_max_size 1024000;      #設置緩存key最大value值,單位字節
            
            set $key $host$uri;#設置key命名規則:域名加url
            set_escape_uri $escaped_key $key;   #轉義key,url裏面特殊字符需要轉義
            srcache_fetch GET /redis_get $key;   #獲取key內容 
            srcache_default_expire 6666;#設置默認緩存時間,單位秒
            srcache_max_expire 2h;            #設置最大緩存時間該值不能大於597h
            srcache_store PUT /redis_set key=$escaped_key&exptime=$srcache_expire;  #存儲key時設置key及過期時間,srcache_expire算法是這樣的:首先讀response header 的Cache-Control:max-age=N,其次讀response header的 Expires ,最後讀srcahe_default_expire
            add_header X-Cached-From $srcache_fetch_status;  #添加命中狀態響應頭
            add_header X-Cached-Store $srcache_store_status;  #添加存儲狀態響應頭
            add_header X-Key $key;#添加key名字響應頭
            add_header X-expire $srcache_expire;#添加過期時間響應頭
            access_log /data/wwwlogs/access_baa.bitauto.com-redis.log srcache_log;
            proxy_pass http://baa_bitauto_com;
        }

5,GET KEY配置

        location = /redis_get {
                internal;#內部訪問為了安全
                set $redis_key $args;      #對應前面的srcache_fetch GET /redis_get $key ,這個$args就是key的名字
                redis_pass redis_server;
        }


6,SET KEY配置

        location = /redis_set {
                internal;
                set_unescape_uri $exptime $arg_exptime;   #對應前面的srcache_store PUT /redis_set key=$escaped_key&exptime=$srcache_expire;  這裏是獲取並設置過期時間且使用了非轉義
                set_unescape_uri $key $arg_key;  #對應前面的srcache_store PUT /redis_set key=$escaped_key&exptime=$srcache_expire;  這裏是獲取並設置key且使用了非轉義
 
                redis2_query set $key $echo_request_body;  #這裏正式存儲key,key的value值是請求體,這裏用到了echo模塊
                redis2_query expire $key $exptime;               #設置key的過期時間 
                redis2_pass redis_server;
        }


7,日誌格式,分正常格式與Srcache格式

    log_format  srcache_log ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                                ‘"$status" $body_bytes_sent $request_time $bytes_sent $request_length ‘
                                ‘[$upstream_response_time] [$srcache_fetch_status] [$srcache_store_status] [$srcache_expire]‘;
#日誌格式對比傳統的nginx日誌格式新增了緩存名字狀態、緩存存儲狀態、過期時間



8,完整配置文件如下

略,根據實際情況修改。


本文出自 “jerrymin” 博客,請務必保留此出處http://jerrymin.blog.51cto.com/3002256/1969078

OpenResty Codis集群緩存系統