• 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 除外)

  • 相关阅读:
    [转]centos sqlite3安装及简单命令
    [转] cmake源码编译安装jsoncpp
    [转]详解Linux(centos7)下安装OpenSSL安装图文方法
    [转]curl 命令模拟 HTTP GET/POST 请求
    [转]白话HTTP短连接中的Session和Token
    [转]浅谈HTTP中GET、POST用法以及它们的区别
    [转][linux][centos]嵌入式 Linux下编译并使用curl静态库
    [转]在CentOS安装CMake (CentOS7 64位适用)
    HTTP/2 资料汇总
    Http 1.x弊端与Http 2.0比较
  • 原文地址:https://www.cnblogs.com/-wenli/p/13533552.html
Copyright © 2020-2023  润新知