Memcached全面解析并使用zabbix进行监控
Memcached是什么?Memcached是一个分布式内存缓存服务器,用于缓存数据库查询结果,减少数据库的访问次数,提高动态web页面的速度及扩展性。
Memcached的特征
a.协议简单,Memcached使用简单的文本行协议
b.基于libevent的事件处理
c.内置内存存储方式
d.每个Memcached服务器之间互不通信
e.Memcached使用key-value的方式进行储存
Libevent: Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。
Libevent 已经被广泛的应用,作为底层的网络库;比如 memcached、 Vomit、 Nylon、 Netchat等等。
Memcached的内存存储
由于传统的内存分配使用malloc函数和free函数进行内存分配,导致内存产生的大量的内存碎片,无法被利用。
Memcached采用Slab Allocator实现内存的分配。
Slab Allocator的原理:按照预先规定将内存分配成大小特定且不等的内存快(chunk),并把大小相等的内存快组织成组(slab class)。
Memcached如何通过Slab Allocator实现数据的缓存?
当一个数据到达Memcached时,Memcached根据数据的大小去选择大小适宜的slab,在通过chunk的空闲列表,选中出chunk将数据缓存上去。
Memcached在分配内存过程中怎么实现不等长的内存划分呢?
Memcached在启动时会指定growth factor因子,来控制每个slab之间的差异,并不是随意进行划分的。如:growth factor因子为2,前一个slab class中的每个chunk的大小为2,则下一个slab class中的每一个chunk的大小为4,就这样一次类推。默认Memcahed设置中growth factor的值为1.25
启动时指定Memcached的growth factor因子
#memcached -f 2 -vv
-f:指定growth factor因子-vv:查看过程 Memcached的超时原理
Memcached怎么去监控自己在内存中缓存的资源是否过期,其采用Lazy Expiration,Memcached不会自动的去监控并检测缓存在内存中的内容是否过期,当一个请求到来时,Memcached才会去检查请求资源的记录时间戳,检查记录是否过期,如没有过期再进行返回。
Memcached的删除的原理
Memcached在内存中缓存数据时,首先选用已经超时的空间来记录本次要缓存的记录,若内存空间不足以缓存时,Memcached会使用LRU(最近最少未被使用算法)来将资源空间分配给新的记录。
Memcached的分布式调度
http://img.blog.csdn.net/20170522180412589?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FpcnVpMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
假如web服务器要缓存一个数据库到Memcached服务器,那么要缓存在那个上呢?
其实Memcached API提供了几个调度算法
a.余数计算:
把将要缓存在Memcached上的记录的key值进行C32计算,再将计算结果与node数+1进行取余,得到的结果就是此数据要缓存的Memcached服务器。
缺点:
当进行增加或者移除节点时,缓存数据进行重组,无法获取与保存时相同的服务器,从而影响缓存的命中率。
b.Consistent hash:
将node节点的主机名进行HASH计算,并配置在0~2^23的圆上,再将资源的key值进行HASH计算,并映射在圆上,从映射位置顺时针查找,找到的第一个服务器就将数据保存在此服务器上。
http://img.blog.csdn.net/20170522182448130?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FpcnVpMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
Memcached的安装方式
下载方式:
#wget http://memcached.org/files/memcached-1.4.36.tar.gz安装:
#tar -xzf memcached-1.4.36.tar.gz #mkdir /usr/local/memcached#yum install libeven-devel#cd memcached-1.4.36# ./configure --prefix=/usr/local/memcached --bindir=/usr/local/bin --sbindir=/usr/local/sbin #make && make install Memcached的启动
#memcached -p 20001 -m 64m -d Memcached状态查询
# memcached-tool 127.0.0.1:11211 stats#127.0.0.1:11211 Field Value
accepting_conns 1
auth_cmds 0
auth_errors 0
bytes 0
bytes_read 7 读了多少字节
bytes_written 0 写了多少字节
cas_badval 0
cas_hits 0
cas_misses 0
cmd_flush 0
cmd_get 0 进行了多少次获取
cmd_set 0 进行多少次插入
conn_yields 0
connection_structures 11
curr_connections 10
curr_items 0
decr_hits 0
decr_misses 0
delete_hits 0
delete_misses 0
evictions 0
get_hits 0 命中多少次
get_misses 0
incr_hits 0
incr_misses 0
limit_maxbytes 67108864
listen_disabled_num 0
pid 4465
pointer_size 64
rusage_system 0.035994
rusage_user 0.000999
threads 4
time1495460002
total_connections 11
total_items 0 内存中多少条记录
uptime 35
version 1.4.4 使用zabbix监听memcached
监听数据:命中多少,总过多少资源,多少次获取,多少次进行添加,读取字节书,写入字节数
1.在Memached的主机上安装zabbix
# yum install zabbix zabbix-agent
#vim /etc/zabbix_agent.conf
UserParameter=memcached.bytes_read
[*],/usr/bin/memcached-tool $1:$2 stats |grep "bytes_read" | awk '{print $2}'
UserParameter=memcached.bytes_written
[*],/usr/bin/memcached-tool $1:$2 stats |grep "bytes_written" | awk '{print $2}'
UserParameter=memcached.cmd_get
[*],/usr/bin/memcached-tool $1:$2 stats |grep "cmd_get" | awk '{print $2}'
UserParameter=memcached.cmd_set
[*],/usr/bin/memcached-tool $1:$2 stats |grep "cmd_set" | awk '{print $2}'
UserParameter=memcached.get_hits
[*],/usr/bin/memcached-tool $1:$2 stats |grep "get_hits" | awk '{print $2}'
UserParameter=memcached.total_items
[*],/usr/bin/memcached-tool $1:$2 stats |grep "total_items" | awk '{print $2}' 2.在另一台主机上安装zabbix-server并启动在web页面进行配置
configure->host->item(memcached host)
定义item:
http://img.blog.csdn.net/20170522223813969?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FpcnVpMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
http://img.blog.csdn.net/20170522223844110?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FpcnVpMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
http://img.blog.csdn.net/20170522223947185?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FpcnVpMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
定义Graphs
http://img.blog.csdn.net/20170522224116562?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FpcnVpMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
测试结果
http://img.blog.csdn.net/20170522224150031?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FpcnVpMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
页:
[1]