资讯专栏INFORMATION COLUMN

轻量级 memcached缓存代理 twemproxy实践

Dogee / 1922人阅读

摘要:本文内容脑图如下文章共字,阅读大约需要分钟概述是开源的轻量级代理服务器,本质就是一个集群管理工具,主要用来弥补和对集群管理的不足,其完成的最大功劳就是通过在后端减少同缓存服务器的连接数从而增加吞吐量。本文先实践一波让来一群小弟时的工作情况。

</>复制代码

  1. 本文内容脑图如下:

</>复制代码

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

概 述

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

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

</>复制代码

  1. 注: 本文首发于 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 部署

安装

</>复制代码

  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

</>复制代码

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

后 记

</>复制代码

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

My Personal Blog:CodeSheep 程序羊

我的半年技术博客之路



文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/61752.html

相关文章

  • 量级 memcached缓存代理 twemproxy实践

    摘要:本文内容脑图如下文章共字,阅读大约需要分钟概述是开源的轻量级代理服务器,本质就是一个集群管理工具,主要用来弥补和对集群管理的不足,其完成的最大功劳就是通过在后端减少同缓存服务器的连接数从而增加吞吐量。本文先实践一波让来一群小弟时的工作情况。 showImg(https://segmentfault.com/img/remote/1460000017056459); 本文内容脑图如下: ...

    ninefive 评论0 收藏0
  • PHP面试常考内容之Memcache和Redis(3)

    摘要:自己整理了一篇不同等级面试都问什么的文章,关注公众号琉忆编程库,回复等级,我发给你。 你好,是我琉忆。今天是周五了,再上一天班就周末了,提前祝大家周末愉快。嘿嘿。这篇文章是本周Memcache和Redis内存数据库常考的专题。本周一和周三更新的文章路径:PHP面试常考内容之Memcache和Redis(1)PHP面试常考内容之Memcache和Redis(2)本周(2019.2-18至...

    Lionad-Morotar 评论0 收藏0
  • PHP面试常考内容之Memcache和Redis(3)

    摘要:自己整理了一篇不同等级面试都问什么的文章,关注公众号琉忆编程库,回复等级,我发给你。 你好,是我琉忆。今天是周五了,再上一天班就周末了,提前祝大家周末愉快。嘿嘿。这篇文章是本周Memcache和Redis内存数据库常考的专题。本周一和周三更新的文章路径:PHP面试常考内容之Memcache和Redis(1)PHP面试常考内容之Memcache和Redis(2)本周(2019.2-18至...

    zhaochunqi 评论0 收藏0
  • 缓存架构的理论分析

    摘要:但实际情况是缓存是大型网站的标配。以上分析告诉我们缓存架构要满足冷热分离的特征不满足,因为冷数据可能挤走热数据。另外,众所周知,缓存架构还要满足读写分离的特征也不满足,因为写操作会争抢读操作的资源。这种风格需要缓存系统的支持。 问题背景 略谈服务端缓存设计 一文说到缓存不是必须的,因为数据库本身就利用了内存。但实际情况是缓存是大型网站的标配。 虽然经验显示RDBMS最快时只需0~1ms...

    jeffrey_up 评论0 收藏0

发表评论

0条评论

Dogee

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<