轻量级 memcached 缓存代理 twemproxy 实践 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
hansonwang99
V2EX    程序员

轻量级 memcached 缓存代理 twemproxy 实践

  •  
  •   hansonwang99
    hansonwang99 2018-11-19 06:35:01 +08:00 3148 次点击
    这是一个创建于 2529 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
    ChinaSyc
        1
    ChinaSyc  
       2018-11-19 09:00:38 +08:00
    很有用的教程,谢谢楼主。
    用于 Redis 也同样适用,很有帮助。
    hansonwang99
        2
    hansonwang99  
    OP
       2018-11-19 09:41:28 +08:00
    @ChinaSyc 多谢支持
    liuxu
        3
    liuxu  
       2018-11-19 10:11:27 +08:00   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 都没有,羞不羞,还好意思贴出来
    hansonwang99
        4
    hansonwang99  
    OP
       2018-11-19 11:34:31 +08:00 via iPhone
    @liuxu 多谢指教,打这么多字辛苦了
    julyclyde
        5
    julyclyde  
       2018-11-19 14:20:27 +08:00
    看到连 m4 和 autoconf 都自己编译,就看不下去了……
    fredcc
        6
    fredcc  
       2018-11-19 17:11:23 +08:00
    proxy 的 ha 怎么做的
    AstroProfundis
        7
    AstroProfundis  
       2018-11-19 17:37:14 +08:00
    有编译 autoconf / m4 的功夫不如换个新点的系统
    milzero
        8
    milzero  
       2018-11-19 18:42:39 +08:00
    洋洋洒洒一大篇,有几个字不是翻译的文档呢,看看文档就完全能明白的东西,值得在抄一遍,这种只能增加互联网垃圾,增加检索难道.
    xiaojinmaolove
        9
    xiaojinmaolove  
       2018-11-19 19:05:53 +08:00 via iPhone
    @yilelu0509 又是个疯狗咬人系列,看过楼主的其他文章,还是比较务实的,就算是翻译官方文档又有什么问题呢,你觉得别人文章不行你自己写啊,我真服了。。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3021 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 12:47 PVG 20:47 LAX 05:47 JFK 08:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86