轻量级 memcached 缓存代理 twemproxy 实践

本贴最后更新于 2194 天前,其中的信息可能已经时移世改

Profile

本文内容脑图如下:

本文内容脑图

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


概 述

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

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

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


环境准备

准备三台节点:

节点 OS 角色
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 组中重新使用


后 记

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

  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 62 关注
  • Memcached
    9 引用 • 6 回帖
  • 缓存
    42 引用 • 70 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...