• 1. Memagent 负载均衡配置1
  • 2. Memagent 调研Memagent简介 Memagent优点与缺点 Memagent单点故障安装 Memagent使用 Memagent性能测试 Memagent结论 Memagent命令参考 Memagent配置说明 Memagent参考文献 2
  • 3. Memagent 简介Memagent是什么? Memagent功能? 3
  • 4. Memagent是什么在介绍Memagent是什么之前,首先简要说明一下Memcache,是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。 Memagent是一个Memcache 的代理。应用于Memcache 的客户端和服务端之间。 4Memcache客户端Memcache服务端Memagent 代理Memcache服务端Memcache备份Memcache客户端Memcache客户端
  • 5. Memagent是什么 memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。5
  • 6. Memagent功能memagent和每个memcache server保持多个长连接,效果是减少memcache server保持的连接数量及创建销毁连接的开销。 支持memcache的binary协议命令,实现请求的转发。 memagent和memcache一样,基于libevent的事件驱动来处理IO。 客户端与memagent断开连接,但是memagent与memcache不会断开连接的。节省连接创建的资源消耗。6
  • 7. Memagent功能支持ketama 的一致性hash算法。 一致性哈希算法(Consistent Hashing Algorithm)是一种分布式算法,常用于负载均衡。Memcached client也选择这种算法,解决将key-value均匀分配到众多Memcached server上的问题。它可以取代传统的取模操作,解决了取模操作无法应对增删Memcached Server的问题(增删server会导致同一个key,在get操作时分配不到数据真正存储的server,命中率会急剧下降) 支持memcache backup集群 当客户端获取数据的时候,从一个memcache服务器获取失败的时候,会从另外一台memcache服务器获取数据。 7
  • 8. Memagent优缺点优点 magent的CPU使用率小于memcach,有很少的内存使用情况。 方便的添加备份服务器。 缺点 有些情况下可能会导致内存泄漏(很少)。 mamagent没有考虑超时机制。 memcached存储大数据的效率是比较低的,当数据比较大的时候xmemcached会帮你压缩在存储,取出来的时候自动解压并反序列化,这个大小阀值默认是16K 8
  • 9. Memagent单点故障安装 安装包 Libevent 下载地址:http://libevent.org/ Memcached 下载地址:http://code.google.com/p/memcached/downloads/list Magent 下载地址:http://code.google.com/p/memagent/downloads/list9
  • 10. Linux下安装Libevent//下载命令 wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz //解压命令 tar zxvf libevent-1.4.13-stable.tar.gz //打开安装文件目录 cd libevent-1.4.13-stable/ //指定安装目录 ./configure --prefix=/usr //编译与安装 make && make install 10
  • 11. Linux下安装Memcahce//下载命令 http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz //解压命令 tar zxvf memcached-1.4.15.tar.gz //打开安装文件目录 cd memcached-1.4.15/ //指定安装目录 ./configure --with-libevent=/usr //编译与安装 make && make install11
  • 12. Linux下安装memagent //创建一个文件夹 mkdir magent cd magent/ //下载 wget http://memagent.googlecode.com/files/magent-0.6.tar.gz //解压 tar zxvf magent-0.6.tar.gz /sbin/ldconfig sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile make //出现错误gcc: /usr/lib64/libevent.a: No such file or directory //执行命令可解决: ln -s /usr/lib/libevent.a /usr/lib64/libevent.a    //再执行 gcc -lrt -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib64/libevent.a /usr/lib64/libm.a     //最后执行 cp magent /usr/bin/magent12
  • 13. Memagent 的使用启动应用 memcached -m 128 -u root -d -l 192.168.17.86 -p 11211 memcached -m 128 -u root -d -l 192.168.17.86 -p 11212 memcached -m 256 -u root -d -l 192.168.17.86 -p 11213 magent -u root -n 51200 -l 192.168.17.86 -p 12000 -s 192.168.17.86 :11211 -s 192.168.17.86 :11212 -b 192.168.17.86 :11213 分别在11211、11212、11213端口启动3个Memcached进程,在12000端口开启magent代理程序。 11211、11212端口为主Memcached,11213端口为备份Memcached 。 连接上12000的magent,set key1和set key2,根据哈希算法,key1被写入11212和11213端口的Memcached,key2被写入11211和11213端口的Memcached 当11211、11212端口的Memcached死掉,连接到12000端口的magent取数据,数据会从11213端口的Memcached取出 当11211、11212端口的Memcached重启复活,连接到12000端口,magent会从11211或11212端口的 Memcached取数据,由于这两台Memcached重启后无数据,因此magent取得的将是空值,尽管11213端口的Memcached还有数 据(此问题尚待改进)。 13
  • 14. Memagent 的使用连接上12000的magent,set key1和set key2,根据哈希算法,key1被写入11212和11213端口的Memcached,key2被写入11211和11213端口的Memcached telnet 127.0.0.1 12000 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. stats memcached agent v0.4 matrix 1 -> 127.0.0.1:11211, pool size 0 matrix 2 -> 127.0.0.1:11212, pool size 0 END set key1 0 0 8 zhangyan STORED set key2 0 0 8 zhangyan STORED quit Connection closed by foreign host.14
  • 15. Memagent 的使用连接端口11211 key1 无值,因为key1存储在11212上,和备份机11213上 执行结果 telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to appt6.huacai.com (127.0.0.1). Escape character is '^]'. get key1 END get key2 VALUE key2 0 8 zhangyan END15
  • 16. Memagent 的使用连接端口11212 key2 无值,因为key2存储在11211上,和备份机11213上 执行结果 telnet 127.0.0.1 11212 Trying 127.0.0.1... Connected to appt6.huacai.com (127.0.0.1). Escape character is '^]'. get key1 VALUE key1 0 8 zhangyan END get key2 END16
  • 17. Memagent 的使用连接端口11213 端口11213是备份服务器,所以包含了服务器端口11211和11212的所有缓存数据。所以我们可以获取到key1和key2的值。 执行结果 telnet 127.0.0.1 11213 Trying 127.0.0.1... Connected to appt6.huacai.com (127.0.0.1). Escape character is '^]'. get key1 VALUE key1 0 8 zhangyan END get key2 VALUE key2 0 8 zhangyan END 17
  • 18. Memagent 的使用连接上12000的magent 会获取key1和key2的值,因为代理知道哪个key存放在哪个服务器上。 执行结果 telnet 127.0.0.1 12000 Trying 127.0.0.1... Connected to appt6.huacai.com (127.0.0.1). Escape character is '^]'. get key1 VALUE key1 0 8 zhangyan END get key2 VALUE key2 0 8 zhangyan END18
  • 19. Memagent 的使用模拟11211、11212端口的Memcached死掉 连接到12000端口的magent取数据,数据会从11213端口的Memcached中取出 执行 关掉11211端口和11212端口 ps -ef|grep memcached root 18067 15563 0 10:58 pts/0 00:00:00 grep memcached root 20774 1 0 Sep25 ? 00:00:00 memcached -m 1 28-u root -d -l 127.0.0.1 -p 11211 root 20781 1 0 Sep25 ? 00:00:00 memcached -m 1 28-u root -d -l 127.0.0.1 -p 11212 root 20788 1 0 Sep25 ? 00:00:00 memcached -m 256 -u root -d -l 127.0.0.1 -p 11213 kill -9 20774 kill -9 20781 19
  • 20. 连接端口11211,无法连接,说明已经被停掉。 127.0.0.1 11211 Trying 127.0.0.1... telnet: connect to address 127.0.0.1: Connection refused telnet: Unable to connect to remote host: Connection refused 连接端口11212,无法连接,说明已经被停掉。 telnet 127.0.0.1 11212 Trying 127.0.0.1... telnet: connect to address 127.0.0.1: Connection refused telnet: Unable to connect to remote host: Connection refused 连接端口12000,端口数据会从备份服务器获取到 telnet 127.0.0.1 12000 Trying 127.0.0.1... Connected to appt6.huacai.com (127.0.0.1). Escape character is '^]'. get key1 VALUE key1 0 8 zhangyan END get key2 VALUE key2 0 8 zhangyan END20
  • 21. Memagent 的使用模拟11211、11212端口的Memcached重新启动 连接到12000端口,magent会从11211或11212端口的 Memcached取数据,由于这两台Memcached重启后无数据,因此magent取得的将是空值。 执行 启动端口11211和11212的memcache缓存服务器。 memcached -m 128 -u root -d -l 127.0.0.1 -p 11211 memcached -m 1 28-u root -d -l 127.0.0.1 -p 11212 获取数据,无值 telnet 127.0.0.1 12000 Trying 127.0.0.1... Connected to appt6.huacai.com (127.0.0.1). Escape character is '^]'. get key1 END get key2 END21
  • 22. Memagent性能测试采用应用程序灌入数据(单线程本机) 22测试端口12000负载(2台负载1台备份)插入数据量(万)花费时间(ms)119093254467231092125415132031520176547625218469
  • 23. Memagent性能测试测试端口12000负载(2台负载1台备份)查询数据量(万)花费时间(ms)12中找11086025中找111016310中找111203415中找218140520中找22070323采用应用程序查询数据(单线程本机)
  • 24. 24Memagent性能测试采用应用程序灌入数据(多线程服务器) 24测试端口12000负载(2台负载1台备份)插入数据量(万)线程数(个)花费时间(ms)120510349220101045332015107344202010847
  • 25. 25Memagent性能测试测试端口12000负载(2台负载1台备份)查询数据量(万)线程数(个)花费时间(ms)120中找151994220中找1102590320中找1152893420中找120300925采用应用程序查询数据(多线程服务器)
  • 26. 结论存入数据 随着放入缓存的数据量成倍增长,与存入时间成正比,没有影响存入速度。 查询数据 随着数据量的增大,不会影响查询的速度。26
  • 27. 主备服务架构27Memcache 1Memcache 2Memcache …Memcache BMagentData
  • 28. 主备服务架构28优点缺点可以使用magent实现的算法把缓存数据负载到每一个缓存主服务器上对主服务器要求不高,但是对备份服务器要求较高,因为备份服务器是所有主服务器的全集,而没每一个主服务器都是备份服务器的一个真子集。添加一个主服务器很容易每添加一个主服务器,相应的对备份服务器要求就会提高。主备服务器挂一台,都可以拿到数据。如果一个主和备份服务器挂了,那么这个主的数据无法拿到。
  • 29. 主从服务器架构29Memcache 主Memcache 从Memcache 主Memcache 从算法 规则Data
  • 30. 主从服务器架构30优点缺点缓存数据可以均与分布到主从服务器上,随着数据量的增大只需要增加额外组的主从服务器需要自己实现对主从库和没组存取数据的控制。容易添加主从服务器可能会影响算法memcached -m 128 -u root -d -l 192.168.17.86 -p 11211 memcached -m 128 -u root -d -l 192.168.17.86 -p 11212 memcached -m 128 -u root -d -l 192.168.17.86 -p 11213 memcached -m 128 -u root -d -l 192.168.17.86 -p 11214 magent -u root -n 51200 -l 192.168.17.86 -p 12000 -s 192.168.17.86:11211 -b 192.168.17.86:11212 -s 192.168.17.86:11213 -b 192.168.17.86:11214
  • 31. 主备服务架构31Memcache 主1Memcache 备Magent交易DataMemcache 主2Memcache 主1Memcache 备Magent订单DataMemcache 主2
  • 32. Memagent 命令参数 -p 监听的端口       -l 连接的IP地址, 默认是本机       -d start 启动memcached服务       -d restart 重起memcached服务       -d stop|shutdown 关闭正在运行的memcached服务       -d install 安装memcached服务       -d uninstall 卸载memcached服务       -u 以的身份运行 (仅在以root运行的时候有效)       -m 最大内存使用,单位MB。默认64MB       -M 内存耗尽时返回错误,而不是删除项       -c 最大同时连接数,默认是1024       -f 块大小增长因子,默认是1.25       -n 最小分配空间,key+value+flags默认是48       -h 显示帮助32
  • 33. memcache 命令参数Stats命令详情解析 STAT pid 22610 进程编号 STAT uptime 9615 服务器运行时间 STAT time 1348648890 服务器当前的unix时间戳 STAT version 1.4.15 memcache版本 STAT libevent 1.4.13-stable libevent版本 STAT pointer_size 64 当前操作系统的指针大小(64位系统一般是64bit) STAT rusage_user 13.683919 STAT rusage_system 29.783472 STAT curr_connections 6 当前连接数 STAT total_connections 8 从服务器打开之后总的总连接数 STAT connection_structures 7 服务器分配的连接构造数 STAT reserved_fds 20 STAT cmd_get 216298 get命令(获取)总请求次数 STAT cmd_set 709383 set命令(设置)总请求次数 STAT cmd_flush 0 STAT cmd_touch 0 STAT get_hits 211265 总的命中次数 STAT get_misses 5033 总的未命中次数 STAT delete_misses 0 删除未命中次数33
  • 34. memcache 命令参数STAT delete_hits 0 STAT incr_misses 0 STAT incr_hits 0 STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT touch_hits 0 STAT touch_misses 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 31391121 总读取字节数 STAT bytes_written 15058300 总写字节数 STAT limit_maxbytes 1048576 分配给memcache的内存大小(字节)34
  • 35. memcache 命令参数STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 当前总线程数 STAT conn_yields 0 STAT hash_power_level 16 STAT hash_bytes 524288 STAT hash_is_expanding 0 STAT bytes 982792 STAT curr_items 10922 服务器当前存储的items数量 STAT total_items 709383 STAT expired_unfetched 0 STAT evicted_unfetched 500000 STAT evictions 671579 为获取空闲内存而删除的items数 STAT reclaimed 0 35
  • 36. 参考文献集群配置 http://visonguo.blog.51cto.com/510379/676763 算法: http://langyu.iteye.com/blog/684087 常见错误解决: http://ghostwolf.iteye.com/blog/774907 http://ruancl.blog.51cto.com/2699729/850951 36