nginx+memcached的配置

问题描述

      现在的搜索架构 QProxy -> Nginx -> Dispatch Nodes -> Search Nodes。

      最下层的Search Nodes保持了一个query命中的docList,但是其它信息,比如title,content等展示的内容每次query都需要重新读取,这将依赖于系统的Cache机制。

      而最终搜索结果的Cache(xml/json)是没有被cache的。

      现在Nginx实现了Dispatch Nodes的fail over和负载均衡,但是目前并没有实现Cache,这次的任务就是实现Nginx层的cache。而QProxy层现在也没有实现Cache,所以这个问题变得非常重要。

已有的解决方案

     目前Nginx实现的Cache方法包括:基于memcached的Cache,Proxy_Cache模块,具体参考nginx缓存cache的5种方案

     Proxy_Cache

         优点是:它是Nginx的核心模块,比较稳定。缺点是:它是基于磁盘的Cache,相对于memcached这样的实现来看,速度会慢一些。

     Nignx的Memcached模块

         优点是:也是Nginx的核心模块。缺点,没有完全实现Memcached的协议,只能读取Memcached的内容,而不能写入

      基于HttpMemcached模块的解决方案

         由于Nginx的标准Memcached模块不能写入Memcached,所以目前流行的解决方案如下图,Nginx读取Memcached,如果失败,那么把请求转发给后台的服务器,并返回结果。后台服务器处

         理结束后,还需要把结果写入Memcached,这样下次Nginx就可以直接读取Memcached的cache了。

                     
          具体实现参考Killer Java applications server with nginx and memcached
          这个解决方案的缺点是,需要JSP/PHP来写Memcached,这样它必须了解Memcached的位置,不便于把配置和cache信息集成的Nginx这一层。

解决方案

          我们现在的解决方案和上图类似,唯一的区别就是Tomcat不用写Cache,而是由Nginx来写入Cache。

          为了实现Nginx写入Cache,我们使用了第三方的Nginx模块,章亦春写的NginxHttpMemcModuleSR Cache模块

          另外我们作为Key的url参数比较长,可能会大于Memcached最大的长度250。当然我们可以修改Memcached的头文件memcached.h来解决这个问题:

      #define KEY_MAX_LENGTH 250

          不过感觉这样不太好,所以使用了MD5为url参数生成指纹来作为memcached的key,这要用到Set-Misc模块Devel_Kit模块

          此外为了调试方便,也安装了Echo模块

安装配置

        安装libevent

          安装Memcached需要先安装libevent,所有需要的文件都放在/home/qsearch/memcached里了。

    cd /home/qsearch/memcached/libevent-2.0.10-stable
./configure
make -j8
sudo make install 
      安装Memcached          
    cd /home/qsearch/memcached/memcached-1.4.5
./configure
make -j8
sudo make install

           ldd memcached 或者运行它,比如"error while loading shared libraries: libevent-2.0.so.5",原因是刚安装的libevent.so还没有被系统知道,所以需要/sbin/ldconfig一下

           为什么编译的时候没有错误呢?因为编译时会去/usr/lib/下找需要的so,所以能编译通过。而运行时为了效率,系统不会每次都扫描/usr/lib的内容,所以并不知道安装了新的libevent.so,所

           以需要ldconfig一下。网上的解决方法 不是好的方法。

           如果有老版本的libevent,想用新的版本链接,可以在Makefile里修改这行 LIBS =  -L/usr/local/lib/ -levent          

      安装Nginx

            安装的文件都放到/home/qsearch/nginx里,我们选择安装最新稳定版本0.8.54

 

     ./configure --prefix=/opt/nginx /
--with-pcre=../pcre-8.12 /
--add-module=../agentzh-echo-nginx-module-53f3dd9 /
--add-module=../simpl-ngx_devel_kit-7dbb4ce /
--add-module=../agentzh-set-misc-nginx-module-3967b60 /
--add-module=../agentzh-headers-more-nginx-module-7bba2a1 /
--add-module=../agentzh-memc-nginx-module-15c9303 /
--add-module=../agentzh-srcache-nginx-module-12e5418

make -j8
make install
      配置Nginx
    gzip  on;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/atom+xml;

upstream qsearch {
server l-schr1.s.cn5.qunar.com:8080 max_fails=1 fail_timeout=600s;
server l-schr2.s.cn5.qunar.com:8080 max_fails=1 fail_timeout=600s;
server l-schr3.s.cn5.qunar.com:8080 max_fails=1 fail_timeout=600s;
server l-schr4.s.cn5.qunar.com:8080 max_fails=1 fail_timeout=600s;
server l-schr5.s.cn5.qunar.com:8080 max_fails=1 fail_timeout=600s;
server l-schr6.s.cn5.qunar.com:8080 max_fails=1 fail_timeout=600s;
}

           上面开启gzip压缩,然后qsearch这个upstream的6台机器是dispatch节点,由Nginx来实现负载均衡和fail-over。上面的配置1次失败就让它休息10分钟

        location /solr/travel/ {
charset utf-8; # or some other encoding
default_type text/plain; # or some other MIME type

set $key $query_string;
set_md5 $key;
srcache_fetch GET /memc $key;
srcache_store PUT /memc $key;
more_clear_headers 'Accept-Encoding';

proxy_pass http://qsearch;
}

location /memc {
set $memc_key $query_string;
set $memc_exptime 300;
#memc_pass l-indx5.s.cn5.qunar.com:11211;
memc_pass 127.0.0.1:11212;
}

             上面的配置告诉Nginx,如果用户访问/solr/travel/,那么使用query的参数做为key,生成MD5,去/memc获取cache,如 果没有命中,那么走proxy_pass,访问dispatch Nodes。 location /memc 是memcached的配置,比如配置一条cache的过期时间为300s,memcached的地址为127.0.0.1:11212,更多的配置参考 NginxHttpMemcModule的文档。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值