OpenResty Codis集群缓存系统

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秒默认缓存
[root@client ]# 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,完整配置文件如下
略,根据实际情况修改。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • Codis 3.2 部署配置汇总 概念总结 集群配置前需要了解架构,集群分片主要分三种: 客户端分片:这个需要自己...
    三杯水Plus阅读 5,999评论 0 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,652评论 18 139
  • 在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx...
    pure_adoration阅读 4,063评论 4 77
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 2,003评论 0 9
  • 阿里月饼事件,五名工程师编写程序在机器的帮助下抢了124盒月饼。他们因此丢掉了饭碗。这件事情虽然已经过去了一段时间...
    ellafwj阅读 209评论 0 0