memcached

Memcachd官网http://memcached.org/ 

Memcached介绍

Memcached是一个高性能的分布式内存对象缓存系统,基于Key-Value的存储的内存数据库或者说hash,整合memcachedmysql是未来趋势,目前最新的mysql5.6已提供了innodb引擎对memcached的接口,不过只是开发版本没有GA(http://www.oschina.net/news/24013/new-features-in-mysql-5-6)

 基本特征

1.协议简单

memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。telnet

2.基于libevent的事件处理

Libevent是提供系统异步事件处理机制如(epollkqueue

)的 API ,也是 memcachd 安装的前提,一般基 libevent 的软件性能比较高,如 nginx 

3内置内存存储方式

为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。

4不互相通信的分布式

各个memcached不会互相通信以共享信息,各自存储数据

一、安装配置

1. libevent

Libevent是提供系统异步事件处理机制如(epollkqueue)的API,也是memcachd安装的前提,一般基libevent的软件性能比较高,如nginx

官网:http://libevent.org/目前最新版本libevent-2.0.19

安装

检查系统是否安装libevent的库文件

ldconfig -v|greplibevent

wgethttp://cloud.github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz

(目前最常用1.4x 2.0.x

tarzxvf libevent-2.0.19-stable.tar.gz

cd libevent-2.0.19-stable

./configure --prefix=/usr/local/libevent

make &&make install

echo "/usr/local/libevent/lib" >>/etc/ld.so.conf

ldconfig(加载库文件,系统默认不会/usr/local/libevent/lib下的lib库,需要添加lib列表)

ldconfig -v|greplibevent

wKiom1Mf9EKgQLEXAADPF2XzWuQ741.jpg

2、安装memcached

wgethttp://memcached.googlecode.com/files/memcached-1.4.14.tar.gz

tarzxvf memcached-1.4.14.tar.gz

cd memcached-1.4.14

./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/

make &&make install

二、memcached启动参数

启动服务

/usr/local/memcached/bin/memcached -d -m 32 -l192.168.3.100-p 11211 -u nobody �Cd

启动常用参数

启动方式:

-d 以守护程序(daemon)方式运行

-u root 指定用户,如果当前为 root ,需要使用此参数?

-P /tmp/a.pid保存PID到指定文件

内存设置:

-m 1024 数据内存数量,不包含memcached本身占用,单位

-M 内存不够时禁止LRU,报错

-n 48初始chunk=key+suffix+value+32结构体,默认48

-f 1.25 增长因子,默认1.25

-L启用大内存页,可以降低内存浪费,改进性能

连接设置:

-l 127.0.0.1 监听的 IP 地址,本机可以不设置此参数

-p 11211 TCP端口,默认为11211,可以不设置

-U 11211UDP端口,默认为112110为关闭

并发设置:

-c 1024最大并发连接数,默认1024,最好是200 

-t 4线程数,默认4。由于memcached采用NIO,所以更多

-R 20每个event连接最大并发数,默认20

-C禁用CAS命令(可以禁止版本计数,减少开销)

三、memcached stats命令

获取运行状态
echo stats | nc 192.168.3.100 11211

telnet到memcached服务器后有很多的命令可以使用,除了大家熟知的add、get、set、incr、decr、replace、delete等赋值命令外,还有一系列的获取服务器信息的命令,这部分命令都是以stats开头的。
常用的命令

1、stats 2、stats reset 3、stats malloc 4、stats maps 5、stats sizes 6、stats slabs 

7、stats items [on|off|dump] 8、stats cachedumpslab_idlimit_num 9、stats detail [on|off|dump] 

1、stats :显示服务器信息、统计数据等

参数

描述

pid

15837

memcache服务器进程ID

uptime

201086

服务器已运行秒数

time

1345391337

服务器当前Unix时间戳

version

1.4.13

memcache版本

libevent

2.0.19-stable

libevent版本

pointer_size

32

操作系统指针大小

rusage_user

0.123981

进程累计用户时间

rusage_system

2.110679

进程累计系统时间

curr_connections

5

当前连接数量

total_connections

230

Memcached运行以来连接总数

connection_structures

14

Memcached分配的连接结构数量

reserved_fds

20

内部使用的FD数

cmd_get

20

get命令请求次数

cmd_set

7

set命令请求次数

cmd_flush

0

flush命令请求次数

cmd_touch

0

touch命令请求次数

get_hits

20

get命令命中次数

get_misses

0

get命令未命中次数

delete_misses

0

delete命令未命中次数

delete_hits

0

delete命令命中次数

incr_misses

0

incr命令未命中次数

incr_hits

0

incr命令命中次数

decr_misses

0

decr命令未命中次数

decr_hits

0

decr命令命中次数

cas_misses

0

cas命令未命中次数

cas_hits

0

cas命令命中次数

cas_badval

0

使用擦拭次数

touch_hits

0

touch命令命中次数

touch_misses

0

touch命令未命中次数

auth_cmds

0

认证命令处理的次数

auth_errors

0

认证失败数目

bytes_read

6836

读取总字节数

bytes_written

483107

发送总字节数

limit_maxbytes

33554432

分配的内存总大小(字节)

accepting_conns

1

接受新的连接

listen_disabled_num

0

失效的监听数

threads

4

当前线程数

conn_yields

0

连接操作主动放弃数目

hash_power_level

16

hash表等级

hash_bytes

262144

当前hash表大小

hash_is_expanding

0

hash表正在扩展

expired_unfetched

0

已过期但未获取的对象数目

evicted_unfetched

0

已驱逐但未获取的对象数目

bytes

313

当前存储占用的字节数

curr_items

6

当前存储的数据总数

total_items

6

启动以来存储的数据总数

evictions

0

LRU释放的对象数目

reclaimed

0

已过期的数据条目来存储新数据的数目

2、stats reset 清空统计数据

stats reset
RESET

stats
STAT pid 2305
STAT uptime 40596
STAT time 1294906749
STAT version 1.2.6
STAT pointer_size 64
STAT rusage_user 1.671745
STAT rusage_system 2.803573
STAT curr_items 86642
STAT total_items 0
STAT bytes 29865212
STAT curr_connections 14
STAT total_connections 0
STAT connection_structures 16
STAT cmd_get 0
STAT cmd_set 0
STAT get_hits 0
STAT get_misses 0
STAT evictions 0
STAT bytes_read 9
STAT bytes_written 14
STAT limit_maxbytes 67108864
STAT threads 4
END 

3、stats malloc显示内存分配数据

stats malloc
STAT arena_size 708608
STAT free_chunks 4
STAT fastbin_blocks 0
STAT mmapped_regions 65
STAT mmapped_space 66752512
STAT max_total_alloc 0
STAT fastbin_space 0
STAT total_alloc 614032
STAT total_free 94576
STAT releasable_space 94272
END

4、stats maps是把/proc/self/maps的数据显示出来。如果远程攻击者连接到了memcached的TCP端口(默认11211)并发布了stats maps命令,Memcached就会直接将/proc/self/maps的输出管道传输给客户端。这可能导致泄漏所分配内存区域的地址。

stats maps
00365000-00378000 r-xp 00000000 08:01 149004 /lib/libnsl-2.3.4.so
00378000-00379000 r--p 00012000 08:01 149004 /lib/libnsl-2.3.4.so
00379000-0037a000 rw-p 00013000 08:01 149004 /lib/libnsl-2.3.4.so
.

5、stats size

6、stats slabs 

详细介绍stats slabs
STAT 1:chunk_size 88 
STAT 1:chunks_per_page 11915 
STAT 1:total_pages 1 
STAT 1:total_chunks 11915 
STAT 1:used_chunks 11915 
STAT 1:free_chunks 0 
STAT 1:free_chunks_end 11914 
STAT active_slabs 1 
STAT total_malloced 1048520 
END 
chunk_size:
每个chunk(块)使用的空间数量,一个item存储到一个近似大小的chunk中 
chunk_per_page:
每page存在的chunk数量,slabs是按页(page)分配的,一页一般为1M,每个slab(也即每页)又划分为若干chunk,这里涉及到memcached的内存管理,这里不多解释,可以参考后面的附文。 
total_pages:
该slabclass分配到的page数量 
total_chunks:
该slabclass拥有的chunk数量 
used_chunks:
已经分配给item的chunk数量(不一定已经装填了item) 
free_chunks:
尚未分配给item的chunk数量,或者由delete释放的chunk 
free_chunks_end:slabclass
中最后一页的自由块数量,即该slabclass尚有多少自由块可以用来装填item 
active_slabs:
已分配的slabclass数量 
total_malloced:
已分配给slab page的内存数量

7stats items显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)stats detail [on|off|dump]
设置或者显示详细操作记录

参数为on,打开详细操作记录
参数为off,关闭详细操作记录
参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)

stats items dump
STAT items:1:number 7
STAT items:1:age 23124
STAT items:1:evicted 0
STAT items:1:outofmemory 0
........
END

8stats cachedumpslab_idlimit_num显示某个slab中的前limit_numkey列表,显示格式如下:ITEM key_name [ value_length b; expire_time|access_time s]其中,memcached 1.2.2及以前版本显示的是访问时间(timestamp) 1.2.4以上版本,包括1.2.4显示过期时间(timestamp)
如果是永不过期的key,expire_time会显示为服务器启动的时间

stats cachedump 7 2
ITEM copy_test1 [250 b; 1207795754 s]
ITEM copy_test [248 b; 1207793649 s]stats slabs
显示各个slab的信息,包括chunk的大小、数目、使用情况等

9stats detail dump ( stats detail [on|off|dump] )
PREFIX copy_test2 get 1 hit 1 set 0 del 0
PREFIX copy_test1 get 1 hit 1 set 0 del 0
PREFIX cpy get 1 hit 0 set 0 del 0

四、memcached常用的客户端软件

官方介绍网页http://code.google.com/p/memcached/wiki/Clients

1、libmemcachedCC++提供memcached连接的API,是其他语言也可以调用这个api连接,但过于底层但不好调用

目前最新的lobby启动这个库的支持(具体用看lddlobby

https://launchpad.net/libmemcached/+download

2、memcachephpAPI

3、python-memcachedpythonapi

4、Cache::Memcachedperlapi

5、Shell用于通过nc命令管理

1、数存储(假设keytestvalue12345

  printf "set test 0 0 5\r\n12345\r\n" | nc 192.168.3.100 11211

  STORED

  2、数据取回(假设keytest

printf "get test\r\n" | nc192.168.3.100 11211

VALUE test 0 5

  12345

  END

  3、数值增加1(假设keytest,并且value为正整数)

  printf "incr test 1\r\n" | nc192.168.3.100 11211

  12346

  4、数值减少3(假设keytest,并且value为正整数)

  printf "decr test 3\r\n" | nc192.168.3.100 11211

  12343

  5、数据删除(假设keytest

printf "delete test\r\n" | nc 192.168.3.100 11211

  DELETED

  6、查看Memcached状态

  printf "stats\r\n" | nc192.168.3.100 11211

五、memcached扩展软件

repcached

�Cmemcached提供复制(replication)功能的patch

�Cmasterslave,互为主辅

Flared

�C存储到QDBM。实现了异步复制和fail over等功能

memagent

�C连接多个memd,实现一致性Hash,请求转发

memcachedb

�Csina开发的存储到BerkleyDB

Tokyo Tyrant

�C存储到Tokyo Cabinet。与memcached协议兼容,能通过HTTP访问


 

你可能感兴趣的:(memcached)