轻量级 Memcached缓存代理 twemproxy实践

Posted CodeSheep

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了轻量级 Memcached缓存代理 twemproxy实践相关的知识,希望对你有一定的参考价值。

⬆️ 点上方蓝字 CodeSheep” 关注作者

文章共 533字,阅读大约需要 2分钟,文尾有计时器可自行对时!

本文内容脑图如下:

轻量级 Memcached缓存代理 twemproxy实践


概   述

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

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

轻量级 Memcached缓存代理 twemproxy实践


环境准备

准备三台节点:

轻量级 Memcached缓存代理 twemproxy实践


memcached 部署
  • 安装

 
   
   
 
  1. yum install memcached

  • 作为后台服务运行之

 
   
   
 
  1. memcached -u root -p 11211 -m 64m -d


twemproxy 部署
  • 安装 m4工具

 
   
   
 
  1. wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz

  2. tar -zvxf m4-1.4.9.tar.gz

  3. cd m4-1.4.9

  4. ./configure

  5. make

  6. make install

  • 安装 autoconf 工具

 
   
   
 
  1. wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz

  2. tar zxvf autoconf-2.69.tar.gz

  3. cd autoconf-2.69

  4. ./configure --prefix=/usr/

  5. make && make install

  • 安装 twemproxy代理

 
   
   
 
  1. wget https://github.com/twitter/twemproxy/archive/master.zip

  2. unzip master.zip

  3. mv twemproxy-master twemproxy

  4. mv twemproxy /usr/local/

  5. cd /usr/local/

  6. cd twemproxy/

  7. autoreconf -fvi

  8. ./configure --enable-debug=full

  9. make

  10. make install

  • 查看 twemproxy帮助

 
   
   
 
  1. nutcracker -h

 
   
   
 
  1. [root@localhost ~]# nutcracker -h

  2. This is nutcracker-0.4.1

  3. Usage: nutcracker [-?hVdDt] [-v verbosity level] [-o output file]

  4.                  [-c conf file] [-s stats port] [-a stats addr]

  5.                  [-i stats interval] [-p pid file] [-m mbuf size]

  6. Options:

  7.  -h, --help             : this help

  8.  -V, --version          : show version and exit

  9.  -t, --test-conf        : test configuration for syntax errors and exit

  10.  -d, --daemonize        : run as a daemon

  11.  -D, --describe-stats   : print stats description and exit

  12.  -v, --verbose=N        : set logging level (default: 5, min: 0, max: 11)

  13.  -o, --output=S         : set logging file (default: stderr)

  14.  -c, --conf-file=S      : set configuration file (default: conf/nutcracker.yml)

  15.  -s, --stats-port=N     : set stats monitoring port (default: 22222)

  16.  -a, --stats-addr=S     : set stats monitoring ip (default: 0.0.0.0)

  17.  -i, --stats-interval=N : set stats aggregation interval in msec (default: 30000 msec)

  18.  -p, --pid-file=S       : set pid file (default: off)

  19.  -m, --mbuf-size=N      : set size of mbuf chunk in bytes (default: 16384 bytes)

  • 准备 twemproxy配置文件

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

修改配置文件 nutcracker.yml

 
   
   
 
  1. memcached:

  2.  listen: 127.0.0.1:22121

  3.  hash: fnv1a_64

  4.  distribution: ketama

  5.  timeout: 400

  6.  backlog: 1024

  7.  preconnect: true

  8.  auto_eject_hosts: true

  9.  server_retry_timeout: 30000

  10.  server_failure_limit: 3

  11.  servers:

  12.   - 192.168.199.77:11211:1  

  13.   - 192.168.199.78:11211:1

  • 启动 tewmproxy服务

 
   
   
 
  1. nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml

  • 检查启动情况

 
   
   
 
  1. [root@localhost ~]# netstat -nltp | grep nutcracker

  2. tcp        0      0 0.0.0.0:22222           0.0.0.0:*               LISTEN      12737/nutcracker    

  3. tcp        0      0 192.168.199.79:22121    0.0.0.0:*               LISTEN      12737/nutcracker


数据读/写测试
  • 首先通过 twemproxy代理来写缓存

一连存入了 6个key

 
   
   
 
  1. [root@localhost conf]# telnet localhost 22121

  2. Trying ::1...

  3. telnet: connect to address ::1: Connection refused

  4. Trying 127.0.0.1...

  5. Connected to localhost.

  6. Escape character is '^]'.

  7. set key1  0 0 1

  8. 1

  9. STORED

  10. set key2 0 0 1

  11. 2

  12. STORED

  13. set key3 0 0 1

  14. 3

  15. STORED

  16. set key4 0 0 1

  17. 4

  18. STORED

  19. set key5 0 0 1

  20. 5

  21. STORED

  22. set key6 0 0 1

  23. 6

  24. STORED

  • 查看发现所有缓存都写到了 memcached2中

 
   
   
 
  1. [root@localhost ~]# telnet 127.0.0.1 11211

  2. Trying 127.0.0.1...

  3. Connected to 127.0.0.1.

  4. Escape character is '^]'.

  5. get key1

  6. VALUE key1 0 1

  7. 1

  8. END

  9. get key2  

  10. VALUE key2 0 1

  11. 2

  12. END

  13. get key3

  14. VALUE key3 0 1

  15. 3

  16. END

  17. get key4

  18. VALUE key4 0 1

  19. 4

  20. END

  21. get key5

  22. VALUE key5 0 1

  23. 5

  24. END

  25. get key6

  26. VALUE key6 0 1

  27. 6

  28. END

  • 接下来断开 memcached2

 
   
   
 
  1. [root@localhost ~]# ps -aux | grep  mem

  2. root       634  0.0  0.0 326588  1960 ?        Ssl  15:58   0:00 memcached -u root -p 11211 -m 64m -d

  3. root       704  0.0  0.0 112676   984 pts/0    S+   16:01   0:00 grep --color=auto mem

  4. [root@localhost ~]# kill -9 634

  • 继续通过 twemproxy代理来写缓存

 
   
   
 
  1. [root@localhost conf]# telnet localhost 22121

  2. Trying ::1...

  3. telnet: connect to address ::1: Connection refused

  4. Trying 127.0.0.1...

  5. Connected to localhost.

  6. Escape character is '^]'.

  7. set key9 0 0 1

  8. 9

  9. STORED

  10. [root@localhost conf]#

  • 此时去memcached1查看:

 
   
   
 
  1. [root@localhost ~]# telnet 127.0.0.1 11211

  2. Trying 127.0.0.1...

  3. Connected to 127.0.0.1.

  4. Escape character is '^]'.

  5. get key9

  6. VALUE key9 0 1

  7. 9

  8. END

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

  • 我们再重新启动 memcached2

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

 
   
   
 
  1. [root@localhost conf]# telnet localhost 22121

  2. Trying ::1...

  3. telnet: connect to address ::1: Connection refused

  4. Trying 127.0.0.1...

  5. Connected to localhost.

  6. Escape character is '^]'.

  7. set key10 0 0 1

  8. x

  9. STORED

  10. set key11 0 0 1

  11. y

  12. STORED

  • 然后发现数据又写到 memcached2中了

 
   
   
 
  1. [root@localhost ~]# telnet 127.0.0.1 11211

  2. Trying 127.0.0.1...

  3. Connected to 127.0.0.1.

  4. Escape character is '^]'.

  5. get key10

  6. VALUE key10 0 1

  7. x

  8. END

  9. get key11

  10. VALUE key11 0 1

  11. y

  12. END

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


后   记

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

  •  个人网站:www.codesheep.cn (程序羊)

我的更多系列原创文章:

  ●  

  ●  系列连载文章

  ●  

  ●  

  ●  

  ●  

  ●  

  ●  

  ●  


你花了   ·  来阅读

点个  再走吧~ 

点原文,去作者官网 codesheep.cn阅读

以上是关于轻量级 Memcached缓存代理 twemproxy实践的主要内容,如果未能解决你的问题,请参考以下文章

Git@OSC 项目推荐 —— KV 类数据库代理框架快速,轻量级,支持 memcached

Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解

Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解

缓存服务器memcached和varnish

缓存服务器之memcached和varnish

超简单的memcached集群搭建