zoukankan      html  css  js  c++  java
  • Twemproxy 代理Redis集群

    Twemproxy 概述

    Twemproxy(又称为nutcracker)是一个轻量级的Redis和Memcached代理,主要用来减少对后端缓存服务器的连接数。Twemproxy是由Twitter开源出来的缓存服务器集群管理工具,主要用来弥补Redis/Memcached 对集群(cluster)管理的不足。

    antirez(Redis作者)写过一篇对twemproxy的介绍,他认为twemproxy是目前Redis 分片管理的最好方案,虽然antirez的Redis cluster正在实现并且对其给予厚望,但从现有的cluster实现上还是认为cluster除了增加Redis复杂度,对于集群的管理没有twemproxy来的轻量和有效。

    Twemproxy特性

    • 轻量级、快速
    • 保持长连接
    • 减少了直接与缓存服务器连接的连接数量
    • 使用 pipelining 处理请求和响应
    • 支持代理到多台服务器上
    • 同时支持多个服务器池
    • 自动分片数据到多个服务器上
    • 实现完整的 memcached 的 ASCII 和再分配协议
    • 通过 yaml 文件配置服务器池
    • 支持多个哈希模式,包括一致性哈希和分布
    • 能够配置删除故障节点
    • 可以通过端口监控状态
    • 支持 linux, *bsd,os x 和 solaris

    功能

    • 通过代理的方式减少缓存服务器的连接数。
    • 自动在多台缓存服务器间共享数据。
    • 通过不同的策略与散列函数支持一致性散列。
    • 通过配置的方式禁用失败的结点。
    • 运行在多个实例上,客户端可以连接到首个可用的代理服务器。
    • 支持请求的流式与批处理,因而能够降低来回的消耗。

    集群架构

    image

    Twemproxy 安装

    1.编译安装:

    autoconf下载地址:http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
    twemproxy下载地址:https://codeload.github.com/twitter/twemproxy/zip/master
    twemproxy的安装要求autoconf的版本在2.64以上,否则提示"error: Autoconf version 2.64 or higher is required"。

    查找旧版本autoconf,并且卸载

    rpm -qf /usr/bin/autoconf  
    rpm -e --nodeps autoconf-2.63   

    安装最新版本

    tar zxvf autoconf-2.69.tar.gz 
    cd autoconf-2.69 
    ./configure --prefix=/usr 
    make && make install 

    编译安装twemproxy

    unzip twemproxy-master.zip
    cd twemproxy-master
    autoreconf -fvi
    ./configure --prefix=/usr/local/twemproxy
    make -j 8
    make install

    设置环境变量:

     echo "PATH=$PATH:/usr/local/twemproxy/sbin/" >> /etc/profile
     source /etc/profile

    2.创建相关目录(存放配置文件和pid文件)

    cd /usr/local/twemproxy
    mkdir run conf

    3.添加proxy配置文件

    vim /usr/local/twemproxy/conf/nutcracker.yml

    twemproxy命令行选项:

    Usage: nutcracker [-?hVdDt] [-v verbosity level] [-o output file]
    [-c conf file] [-s stats port] [-a stats addr]
    [-i stats interval] [-p pid file] [-m mbuf size]

    -h, –help : 查看帮助文档,显示命令选项
    -V, –version : 查看nutcracker版本
    -t, –test-conf : 测试配置脚本的正确性
    -d, –daemonize : 以守护进程运行
    -D, –describe-stats : 打印状态描述
    -v, –verbosity=N : 设置日志级别 (default: 5, min: 0, max: 11)
    -o, –output=S : 设置日志输出路径,默认为标准错误输出 (default: stderr)
    -c, –conf-file=S : 指定配置文件路径 (default: conf/nutcracker.yml)
    -s, –stats-port=N : 设置状态监控端口,默认22222 (default: 22222)
    -a, –stats-addr=S : 设置状态监控IP,默认0.0.0.0 (default: 0.0.0.0)
    -i, –stats-interval=N : 设置状态聚合间隔 (default: 30000 msec)
    -p, –pid-file=S : 指定进程pid文件路径,默认关闭 (default: off)
    -m, –mbuf-size=N : 设置mbuf块大小,默认16384 bytes

    启动twemproxy服务

    检测配置文件:

    ./sbin/nutcracker -t
    nutcracker: configuration file 'conf/nutcracker.yml' syntax is ok

    注意:默认检查命令会检查所在路径的conf下面的nutcracker.yml文件。

    启动命令:

    ./sbin/nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log

    查看是否启动成功:

    ps -ef|grep nutcracker

    Twemproxy 配置

    Twemproxy 通过YAML文件配置,例如:

    alpha:
      listen: 0.0.0.0:22121
      hash: fnv1a_64
      distribution: ketama
      auto_eject_hosts: true
      redis: true
      server_retry_timeout: 2000
      server_failure_limit: 1
      servers: --两台redis服务器的地址和端口
       - 10.23.22.240:6379:1   
       - 10.23.22.241:6379:1

    说明:

    listen
    twemproxy监听地址,支持UNIX域套接字。

    hash
    可以选择的key值的hash算法:

    • one_at_a_time
    • md5 
    • crc16 
    • crc32 (crc32 implementation compatible with libmemcached) 
    • crc32a (correct crc32 implementation as per the spec) 
    • fnv1_64 
    • fnv1a_64,默认选项
    • fnv1_32 
    • fnv1a_32 
    • hsieh 
    • murmur 
    • jenkins

    hash_tag
    hash_tag允许根据key的一个部分来计算key的hash值。hash_tag由两个字符组成,一个是hash_tag的开始,另外一个是hash_tag的结束,在hash_tag的开始和结束之间,是将用于计算key的hash值的部分,计算的结果会用于选择服务器。

    例如:如果hash_tag被定义为”{}”,那么key值为"user:{user1}:ids"和"user:{user1}:tweets"的hash值都是基于”user1”,最终会被映射到相同的服务器。而"user:user1:ids"将会使用整个key来计算hash,可能会被映射到不同的服务器。

    distribution
    存在ketama、modula和random3种可选的配置。其含义如下:

    • ketama,一致性hash算法,会根据服务器构造出一个hash ring,并为ring上的节点分配hash范围。ketama的优势在于单个节点添加、删除之后,会最大程度上保持整个群集中缓存的key值可以被重用。
    • modula,根据key值的hash值取模,根据取模的结果选择对应的服务器;
    • random,无论key值的hash是什么,都随机的选择一个服务器作为key值操作的目标;

    timeout

    单位是毫秒,是连接到server的超时值。默认是永久等待。

    backlog
    监听TCP 的backlog(连接等待队列)的长度,默认是512。

    preconnect
    是一个boolean值,指示twemproxy是否应该预连接pool中的server。默认是false。

    redis
    是一个boolean值,用来识别到服务器的通讯协议是redis还是memcached。默认是false。

    server_connections
    每个server可以被打开的连接数。默认,每个服务器开一个连接。

    auto_eject_hosts
    是一个boolean值,用于控制twemproxy是否应该根据server的连接状态重建群集。这个连接状态是由server_failure_limit阀值来控制。
    默认是false。

    server_retry_timeout
    单位是毫秒,控制服务器连接的时间间隔,在auto_eject_host被设置为true的时候产生作用。默认是30000 毫秒。

    server_failure_limit
    控制连接服务器的次数,在auto_eject_host被设置为true的时候产生作用。默认是2。

    servers
    一个pool中的服务器的地址、端口和权重的列表,包括一个可选的服务器的名字,如果提供服务器的名字,将会使用它决定server的次序,从而提供对应的一致性hash的hash ring。否则,将使用server被定义的次序。

    连接twemproxy

    和连接redis 一摸一样,只是端口换成了22121:

    redis-cli -p 22121
    127.0.0.1:22121> get kin
    "kin"
    127.0.0.1:22121> set kin king
    OK
    127.0.0.1:22121> get kin
    "king"

    Twemproxy 监控

    Twemproxy 监控端口默认为22222,并每隔30s收集一次信息。

    nutcracker --describe-stats

    报告的信息如下:

    pool stats:
      client_eof          "# eof on client connections"
      client_err          "# errors on client connections"
      client_connections  "# active client connections"
      server_ejects       "# times backend server was ejected"
      forward_error       "# times we encountered a forwarding error"
      fragments           "# fragments created from a multi-vector request"
    
    server stats:
      server_eof          "# eof on server connections"
      server_err          "# errors on server connections"
      server_timedout     "# timeouts on server connections"
      server_connections  "# active server connections"
      requests            "# requests"
      request_bytes       "total request bytes"
      responses           "# responses"
      response_bytes      "total response bytes"
      in_queue            "# requests in incoming queue"
      in_queue_bytes      "current request bytes in incoming queue"
      out_queue           "# requests in outgoing queue"
      out_queue_bytes     "current request bytes in outgoing queue"

    性能测试

    用redis自带的redis-benchmark进行性能测试:

    set 测试:

    twemproxy:

    redis-benchmark -10.23.22.240 -p 22121 -c 100 -t set -d 100

    原生redis:

    redis-benchmark -10.23.22.241 -p 6379 -c 100 -t set -d 100

    Get测试

    twemproxy:

    redis-benchmark -h 10.23.22.240 -22121 -100 -get -100

    原生redis:

    redis-benchmark -h 10.23.22.241 -6379 -100 -t get -100

     

    Twemproxy优缺点

    优缺点:

    1.前端使用 Twemproxy 做代理,后端的 Redis 数据能基本上根据 key 来进行比较均衡的分布。

    2.后端一台 Redis 挂掉后,Twemproxy 能够自动摘除。恢复后,Twemproxy 能够自动识别、恢复并重新加入到 Redis 组中重新使用。

    注意点:

    1.Redis 挂掉后,后端数据是否丢失依据 Redis 本身的策略配置,与 Twemproxy 基本无关。

    缺点:

    1.当redis集群动态添加节点时,Twemproxy 需要重启才能生效,并且数据不会自动重新 Reblance,需要人工单独写脚本来实现。

    2.性能上的损耗,作者是说最差情况下,性能损耗不会多于20%。

    3.单点问题,需要使用keepalived vip做高可用或者使用 HAProxy 进行负载均衡。

    4.不支持Redis的事务操作

    5.不支持针对多个值的操作,比如取sets的子交并补等(MGET 和 DEL 除外)

  • 相关阅读:
    poj 2488 DFS
    畅通工程 并查集模版
    KMP 模板
    poj 1426 DFS
    poj 2528 线段数
    poj 3468 线段数 修改区间(点)
    CVPR2012文章阅读(2)A Unified Approach to Salient Object Detection via Low Rank Matrix Recovery
    如何制定目标
    Saliency Map 最新综述
    计算机视觉模式识别重要会议杂志
  • 原文地址:https://www.cnblogs.com/-wenli/p/13533552.html
Copyright © 2011-2022 走看看