首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

轻量级 memcached 缓存代理 twemproxy 实践

  •  
  •   hansonwang99 · 158 天前 · 1333 次点击
    这是一个创建于 158 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Profile

    本文内容脑图如下:

    本文内容脑图

    文章共 533 字,阅读大约需要 2 分钟 !


    概 述

    twemproxy ( nutcracker ) 是 Twitter 开源的轻量级 memcached / redis 代理服务器,本质就是一个集群管理工具,主要用来弥补 Redis 和 Memcached 对集群管理的不足,其完成的最大功劳就是通过在后端减少同缓存服务器的连接数从而增加吞吐量。我们将 Twemproxy 看成一个老大哥,背后 Carry 着一群 memcached / redis 实例小弟,如此看来,某一程序上也类似于 memcached / redis 的 HA。

    本文先实践一波让 twemproxy 来 Carry 一群 memcached 小弟时的工作情况。

    注: 本文首发于 My Personal Blog:CodeSheep·程序羊,欢迎光临 小站


    环境准备

    准备三台节点:

    • 192.168.199.77 | CentOS 7.4 | 部署 memcached1 实例 |
    • 192.168.199.78 | CentOS 7.4 | 部署 memcached2 实例 |
    • 192.168.199.79 | CentOS 7.4 | 部署 twemproxy 代理服务器 |

    memcached 部署

    • 安装
    yum install memcached
    
    • 作为后台服务运行之
    memcached -u root -p 11211 -m 64m -d
    

    twemproxy 部署

    • 安装 m4 工具
    wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz
    tar -zvxf m4-1.4.9.tar.gz
    cd m4-1.4.9
    ./configure
    make
    make install
    
    • 安装 autoconf 工具
    wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
    tar zxvf autoconf-2.69.tar.gz
    cd autoconf-2.69
    ./configure --prefix=/usr/
    make && make install
    
    • 安装 twemproxy 代理
    wget https://github.com/twitter/twemproxy/archive/master.zip
    unzip master.zip
    mv twemproxy-master twemproxy
    mv twemproxy /usr/local/
    cd /usr/local/
    cd twemproxy/
    autoreconf -fvi
    ./configure --enable-debug=full
    make
    make install
    
    • 查看 twemproxy 帮助
    nutcracker -h
    
    [root@localhost ~]# nutcracker -h
    This is nutcracker-0.4.1
    
    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]
    
    Options:
      -h, --help             : this help
      -V, --version          : show version and exit
      -t, --test-conf        : test configuration for syntax errors and exit
      -d, --daemonize        : run as a daemon
      -D, --describe-stats   : print stats description and exit
      -v, --verbose=N        : set logging level (default: 5, min: 0, max: 11)
      -o, --output=S         : set logging file (default: stderr)
      -c, --conf-file=S      : set configuration file (default: conf/nutcracker.yml)
      -s, --stats-port=N     : set stats monitoring port (default: 22222)
      -a, --stats-addr=S     : set stats monitoring ip (default: 0.0.0.0)
      -i, --stats-interval=N : set stats aggregation interval in msec (default: 30000 msec)
      -p, --pid-file=S       : set pid file (default: off)
      -m, --mbuf-size=N      : set size of mbuf chunk in bytes (default: 16384 bytes)
    
    • 准备 twemproxy 配置文件
    vim /usr/local/twemproxy/conf/nutcracker.yml
    

    修改配置文件 nutcracker.yml

    memcached:
      listen: 127.0.0.1:22121
      hash: fnv1a_64
      distribution: ketama
      timeout: 400
      backlog: 1024
      preconnect: true
      auto_eject_hosts: true
      server_retry_timeout: 30000
      server_failure_limit: 3
      servers:
       - 192.168.199.77:11211:1   
       - 192.168.199.78:11211:1
    
    • 启动 tewmproxy 服务
    nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml
    
    • 检查启动情况
    [root@localhost ~]# netstat -nltp | grep nutcracker
    tcp        0      0 0.0.0.0:22222           0.0.0.0:*               LISTEN      12737/nutcracker    
    tcp        0      0 192.168.199.79:22121    0.0.0.0:*               LISTEN      12737/nutcracker
    

    数据读 /写测试

    • 首先通过 twemproxy 代理来写缓存

    一连存入了 6 个 key

    [root@localhost conf]# telnet localhost 22121
    Trying ::1...
    telnet: connect to address ::1: Connection refused
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    set key1  0 0 1
    1
    STORED
    set key2 0 0 1
    2
    STORED
    set key3 0 0 1
    3
    STORED
    set key4 0 0 1
    4
    STORED
    set key5 0 0 1
    5
    STORED
    set key6 0 0 1
    6
    STORED
    
    • 查看发现所有缓存都写到了 memcached2 中
    [root@localhost ~]# telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    get key1
    VALUE key1 0 1
    1
    END
    get key2   
    VALUE key2 0 1
    2
    END
    get key3
    VALUE key3 0 1
    3
    END
    get key4
    VALUE key4 0 1
    4
    END
    get key5
    VALUE key5 0 1
    5
    END
    get key6
    VALUE key6 0 1
    6
    END
    
    • 接下来断开 memcached2
    [root@localhost ~]# ps -aux | grep  mem
    root       634  0.0  0.0 326588  1960 ?        Ssl  15:58   0:00 memcached -u root -p 11211 -m 64m -d
    root       704  0.0  0.0 112676   984 pts/0    S+   16:01   0:00 grep --color=auto mem
    [root@localhost ~]# kill -9 634
    
    • 继续通过 twemproxy 代理来写缓存
    [root@localhost conf]# telnet localhost 22121
    Trying ::1...
    telnet: connect to address ::1: Connection refused
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    set key9 0 0 1
    9
    STORED
    [root@localhost conf]# 
    
    • 此时去 memcached1 查看:
    [root@localhost ~]# telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    get key9
    VALUE key9 0 1
    9
    END
    

    我们发现 memcached2 断开后,缓存 key9 写到了 memcached1 中,而对于用户来说,由于是跟 twemproxy 代理交互,因此并不能感觉到后端 memcached2 实例的下线

    • 我们再重新启动 memcached2

    然后再继续通过代理写数据:

    [root@localhost conf]# telnet localhost 22121
    Trying ::1...
    telnet: connect to address ::1: Connection refused
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    set key10 0 0 1
    x
    STORED
    set key11 0 0 1
    y
    STORED
    
    • 然后发现数据又写到 memcached2 中了
    [root@localhost ~]# telnet 127.0.0.1 11211
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    get key10 
    VALUE key10 0 1
    x
    END
    get key11
    VALUE key11 0 1
    y
    END
    

    从上面这个实验过程可以看出,一台 memcached 实例挂掉后,twemproxy 能自动移除之;而恢复后,twemproxy 能够自动识别并重新加入到 memcached 组中重新使用


    后 记

    由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!



    9 回复  |  直到 2018-11-19 19:05:53 +08:00
        1
    ChinaSyc   158 天前
    很有用的教程,谢谢楼主。
    用于 Redis 也同样适用,很有帮助。
        2
    hansonwang99   158 天前
    @ChinaSyc 多谢支持
        3
    liuxu   158 天前   ♥ 1
    你确定你要复制粘贴源 github 带--enable-debug=full 的编译配置么?

    #ifdef NC_ASSERT_PANIC

    #define ASSERT(_x) do { \
    if (!(_x)) { \
    nc_assert(#_x, __FILE__, __LINE__, 1); \
    } \
    } while (0)

    void
    nc_assert(const char *cond, const char *file, int line, int panic)
    {
    log_error("assert '%s' failed @ (%s, %d)", cond, file, line);
    if (panic) {
    nc_stacktrace(1);
    abort();
    }
    }


    我知道推广个人博客不易,可你这往“程序员”节点推广的太多了吧。。就我平时随便点击就看到你的有 3 贴以上了,翻一翻历史记录全是推广,先是简书,然后是你的个人站

    v2ex 个人博客现在已经有正规新节点了:/go/blogger

    liuxu:nutcracker-0.4.1$ dig +noall +answer www.codesheep.cn
    www.codesheep.cn. 45 IN CNAME pages.coding.me.
    pages.coding.me. 45 IN A 103.210.21.11
    liuxu:nutcracker-0.4.1$ besttrace -q1 www.codesheep.cn
    traceroute to www.codesheep.cn (103.210.21.11), 30 hops max, 60 byte packets
    1 localhost (192.168.1.1) 0.49 ms * 局域网
    2 123.117.16.1 21.61 ms AS4808 中国 北京 联通
    3 *
    4 *
    5 124.65.194.117 10.98 ms AS4808 中国 北京 联通
    6 219.158.112.26 36.26 ms AS4837 中国 广东 广州 联通
    7 219.158.8.118 45.42 ms AS4837 中国 广东 广州 联通
    8 219.158.96.209 72.92 ms AS4837 中国 广东 广州 联通
    9 219.158.97.246 45.82 ms AS4837 中国 香港 联通
    10 202.77.23.26 106.78 ms AS10099 中国 香港 联通
    11 43.252.86.66 106.23 ms AS10099 中国 香港 联通
    12 103.1.67.6 81.02 ms AS10099 中国 香港 联通
    13 43.252.86.210 116.19 ms AS10099 中国 香港 联通
    14 *
    15 *
    16 *
    17 107.150.122.59 94.00 ms AS135377 中国 香港 zenlayer.com
    18 *
    19 *
    20 *
    21 *
    22 *
    23 *
    24 *
    25 *
    26 *
    27 *
    28 *
    29 *
    30 103.210.21.11 2875.46 ms AS135377 中国 香港 zenlayer.com


    说实在的,正规做站就应该备个案,香港线路天天炸,开你的博客主资源 TTFB 要 3 秒,整个页面 Load:1.3min

    推广就推广,coding 连个 https 都舍不得给么,都 2018 年都快过完了,博客连个 https 都没有,羞不羞,还好意思贴出来
        4
    hansonwang99   158 天前 via iPhone
    @liuxu 多谢指教,打这么多字辛苦了
        5
    julyclyde   158 天前
    看到连 m4 和 autoconf 都自己编译,就看不下去了……
        6
    fredcc   158 天前
    proxy 的 ha 怎么做的
        7
    AstroProfundis   158 天前
    有编译 autoconf / m4 的功夫不如换个新点的系统
        8
    yilelu0509   158 天前
    洋洋洒洒一大篇,有几个字不是翻译的文档呢,看看文档就完全能明白的东西,值得在抄一遍,这种只能增加互联网垃圾,增加检索难道.
        9
    xiaojinmaolove   157 天前 via iPhone
    @yilelu0509 又是个疯狗咬人系列,看过楼主的其他文章,还是比较务实的,就算是翻译官方文档又有什么问题呢,你觉得别人文章不行你自己写啊,我真服了。。。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2785 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 16ms · UTC 10:54 · PVG 18:54 · LAX 03:54 · JFK 06:54
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1