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,完整配置文件如下

略,根据实际情况修改。

时间: 2024-10-12 05:02:26

OpenResty Codis集群缓存系统的相关文章

实战Centos系统部署Codis集群服务

导读 Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务. 一.Codis简介 Codis 是 Wandoujia Infrastructu

C#使用Redis集群缓存

C#使用Redis集群缓存 本文介绍系统缓存组件,采用NOSQL之Redis作为系统缓存层. 一.背景 系统考虑到高并发的使用场景.对于并发提交场景,通过上一章节介绍的RabbitMQ组件解决.对于系统高并发查询,为了提供性能减少数据库压力,我们加入缓存机制,可以不同层次加入缓存支持,本文主要介绍应用服务层和数据层之间加入缓存机制提升性能.业界缓存组件有Redis.Memcached.MemoryCache.本系统采用Redis缓存组件,有些系统将Redis当作MQ使用,此场景本系统用Rabbi

codis集群使用经验

集群架构图 HA方案测试用例: 功能测试 基于各种场景, 我们主要针对redis缓存的get, set操作进行各种codis集群HA方案的验证 当codis集群中只有一个Group1时,该场景可以确保测试程序操作的数据都在该分组的redis实例中(通过codis-proxy的程序大多数不会使用hash tag来区分slots,该场景测试大多数操作场景,功能是否正常). 让Group1.Master下线. > 1. 验证get,set 正常, 会有5秒的服务不可用. 让Group1.Slave下线

codis集群搭建

Codis简介(来自开源中国社区) Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 CodisProxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务. Codis 由四部分组成: Codis Proxy

codis集群实例

codis配置实例 3.13.10.1架构图及环境 1.架构图 2.软件版本 (1)zookeeper-3.5.2-alpha.tar.gz (2)go1.8.1.linux-amd64.tar.gz (3)codis3.2 3.13.10.2 zookeeper集群安装 1.安装jdk 1.8(这一步不作详解) 2.下载zookeeper3.5.2安装 在192.168.2.122, 192.168.2.123, 192.168.2.124执行以下安装 (1)准备安装目录和数据存放目录,并建立

codis集群部署实战

一.概要 1.折腾codis集群已经快两个月了,感谢一直以来codis的作者刘奇和黄东旭的耐心支持,在这里给你们点个赞,现在我司已经有一个业务跑在了codis集群上,目前只是切了整个业务的10%的量,预计下周会全量切到codis上,这个时候大家肯定特别想知道codis稳定吗?有没有什么bug啊,你想知道的也是我想知道的,搞起吧,用了才知道,反正目前我们这没发现啥问题,一些小的问题已经及时联系作者改掉了,好吧,不扯淡了,写这篇文章的目的是帮助想了解codis的初学者快速部署(官方的部署文档对应运维

Twemproxy 分布式集群缓存代理服务器

Twemproxy 分布式集群缓存代理服务器 是一个使用C语言编写.以代理的方式实现的.轻量级的Redis代理服务器, 它通过引入一个代理层,将应用程序后端的多台Redis实例进行统一管理, 使 应用程序只需要在Twemproxy上进行操作,而不用关心后面具体有 多少个真实的Redis或Memcached实例,从而实现了基于Redis和 Memcached的集群服务.当某个节点宕掉时,Twemproxy可以自 动将它从集群中剔除,而当它恢复服务时,Twemproxy也会自动连接. 由 于是代理,

Elasticstack 5.1.2 集群日志系统部署及实践

Elasticstack 5.1.2 集群日志系统部署及实践 一.ELK Stack简介 ELK Stack 是Elasticsearch.Logstash.Kibana三个开源软件的组合,在实时数据检索和分析场合,三者通常是配合共用的. 可参考:https://www.elastic.co/products 二.Elasticstack重要组件 Elasticsearch: 准实时索引 Logtash: 收集数据,配置使用 Ruby DSL Kibana 展示数据,查询聚合,生成报表 Kafk

Codis集群的搭建与使用

一.简介 Codis是一个分布式的Redis解决方案,对于上层的应用来说,连接Codis Proxy和连接原生的Redis Server没有明显的区别(不支持的命令列表),上层应用可以像使用单机的Redis一样使用,Codis底层会处理请求的转发,不停机的数据迁移等工作,所有后边的一切事情,对于前面客户端来说是透明的,可以简单的认为后边连接是一个内存无限大的Redis服务. Codis架构图: 以上我们可以看到codis-proxy是单个节点的,因为我们可以通过结合keepalived来实现高可