【memcached】读书笔记

只用过单台的,了解下分布式怎么用。

计划:
1、《Memcached全面解析》
http://tech.idv2.com/2008/08/17/memcachedpdf/
2、memcached官方网站
http://code.google.com/p/memcached/wiki/ReleaseNotes
http://code.google.com/p/memcached/wiki/NewStart
3、《Using memcached-How to scale your website easily》
4、其他cache方案

Book 1
-------------------------------------------------
翻译版本是2008年,6年前了,先看看吧,思路可以借鉴。
Ch1 基础
1.1、用于在db和app server中间提供缓冲层。
http://memcached.org/
最新稳定V 1.4.20
http://memcached.org/files/memcached-1.4.20.tar.gz


1.2、特点:协议简单、基于libevent事件处理、内存存储(内存管理专家)、节点间互不通信(你在玩儿我?另有proxy节点负责调度、组织、同步


?还是反正是cache,失效就失效?6年前是这样,现在肯定不是了)。
协议:get/set/
内存:LRU(Least Recently Used)
分布式:取决于客户端的实现,和服务器无关。hash啊,路由啊啥的在客户端实现。驱动程序来做?代码可以控制,提供API?这样也好,更灵活。


算法合适的话,效率也很高。可能的缺点:对一个集群有统一入口吗?如果没有,每个客户端(m个)都和每个节点(n个)连接,那最多就是mxn个


socket连接。
1.3、安装
wget http://memcached.org/latest
tar -zxvf memcached-1.x.x.tar.gz
cd memcached-1.x.x
./configure && make && make test && sudo make install


启动:
/memcached -p 11211 -m 2g -vv
or 
/memcached -p 11211 -m 2g -d


/memcached -h 可以查看更多启动项(过会儿再试验吧)


$ echo "stats settings" | nc localhost 11211
STAT maxbytes 67108864
STAT maxconns 1024
STAT tcpport 11211
STAT udpport 11211
STAT inter NULL
STAT verbosity 0
STAT oldest 0
STAT evictions on
STAT domain_socket NULL
STAT umask 700
STAT growth_factor 1.25
STAT chunk_size 48
STAT num_threads 4
STAT stat_key_prefix :
STAT detail_enabled no
STAT reqs_per_event 20
STAT cas_enabled yes
STAT tcp_backlog 1024
STAT binding_protocol auto-negotiate
STAT auth_enabled_sasl no
STAT item_size_max 1048576
END


1.4、客户端
http://code.google.com/p/memcached/wiki/Clients
Java
spymemcached

http://www.couchbase.org/code/couchbase/java
An improved Java API maintained by Matt Ingenthron and others at Couchbase.
Aggressively optimised, ability to run async, supports binary protocol, support Membase and Couchbase features, etc. See site for details.

Java memcached client
http://www.whalin.com/memcached
A Java API is maintained by Greg Whalin from Meetup.com.

More Java memcached clients
http://code.google.com/p/javamemcachedclient
http://code.google.com/p/memcache-client-forjava
http://code.google.com/p/xmemcached

Integrations
http://code.google.com/p/simple-spring-memcached
http://code.google.com/p/memcached-session-manager

add/replace/set/delete/incr/

Ch2 内存管理
Slab Allocation:申请大小不同的固定大小的,反复重用。可以通过控制Growth Factor调优。
查看内部状态:
$telnet localhost 11211
stats
...
quit


内存监视工具:http://code.sixapart.com/svn/memcached/trunk/server/scripts/memcachedtool
$memcached-tool localhost:11211


Ch3 删除机制和发展方向
3.1、删除机制
过期后就不管了,空间可以重复利用,客户端也看不到,并不真正删除。
(调用delete,估计也只是修改失效时间)
3.2、可以通过 memcached -M 制定不通过LRU删除数据,内存满会报错。
3.3、发展方向:
(1)二进制协议;
(2)实现外部引擎。


Ch4 分布式算法
由客户端实现。
将key hash,每次可以找到同一台memcached server,提高hit。(如果这台down了呢,那需要复制机制)
简单的hash算法,将crc32($key) mod $servercount,这是一个很傻的办法,$server_count变了呢?
Consistent Hashing算法:
step 1:设一个 0 - 2srt32 的圆。
step 2:将server 较均匀放上去。
step 3:寻找server的hash算法,对key hash,落在这个圆的某个点上,按固定方向找,肯定可以找到一台服务器。
step 4:增加服务器的情况:对某些key,缓存会失效,但影响是局部的。(增加服务器的时候,能把前面节点的数据都复制过来吗?)


(这个方法貌似不错,但怎么实现“均衡”呢?而且没考虑节点间的数据备份和复制。如果某台server down了呢?)


Ch5 案例
mixi案例,应该是日本某论坛,就当成百度贴吧吧。

结构是这样的:n台proxy(估计是nginx)连接m台app(估计是按职能划分),m台应用连l台mysql(master/slave,master/backup)。
m台app同时连200台memcached(应该不是一个大集群,而是按职能划分开的,若干group)。
memcached 服务器,是以前淘汰下来的DB Server:P4 2.8G(memcached对CPU要求不高),4G MM(这个可以加),146G SCSI(这个不重要),x86_64(可以大内存)。

每台服务器只起一个memcached进程(起1个和起多个的区别是什么?): 
memcached -p 11211 -u nobody -m 3000 -c 30720
内存分配了3G,给操作系统和socket连接留了1G。(每个socket连接占多少资源?)
将200台左右的memcached做一个pool使用。(这样要多少个连接啊!!nxm啊,hash算法里一定有解决的方法)
程序要保持同memcached的连接,不能用完就断,再用再连。这个是当然的啊!
rehash:当一台服务器不可用时(如连接失败3次或者超时1次),果断放弃。

hash算法是关键啊!文档中没有提啊!日本人果然xx。
然后就是监控和运维的问题了。
daemontools
nagios(http://www.nagios.org,这个神器一定要会用啊)
rrdtool(将stats结果以图形展示,进行性能监视,生成报表,发送邮件)

监测值:
请求数、每秒处理请求数、流量、TCP连接数、内存占用率、CPU占用率。








Book 2
-------------------------------------------------
刚才看了过期文档,起到了扫盲作用,现在赶快紧跟下时代,看看官网新动向。
About
高性能、分布是内存对象缓存系统。(提distributed了,好激动!)
举例子怎么用64m,怎么不说7G,美帝的服务器太低端了,还是这也是好久没更新的?
名人堂 左下角有个Simon Liu,还有个liu bo。中间还有个Ricky Zhou。
http://code.google.com/p/memcached/wiki/NewOverview
Client software, which is given a list (集群)of available(节点状态管理) memcached servers.
Item(key,expiration time ,optional flags,raw data)
Smarts Half in Client, Half in Server:客户端很重要,客户端都是第三方开发的吗?有客户端规范约束吗?
客户端需要:放数据到服务器,放数据到特定的服务器,当服务器离线时知道怎么办,从服务器取回keys。
服务器只做:存数据,让数据过期。
规矩:服务器之间互不相扰。可以违反这个规矩,但要谨慎。
神器的O(1),for everything。客户端找到server也要O(1)。
我们就是要忘掉过期的数据。
以后怎么发展:Memcached现在是一个平台了,好多人在上面做扩展,做SQL结果的缓存,做依照模板的数据展现(是页面缓存吗?)。
协议:memcached不是协议的唯一实现(可以自定义自己引擎),我们要做文化!
其他协议:Google protocol buffers, Facebook Thrift, Avro(这个是hadoop中提到的那个吗?)
持久化:与我们理念和气质不和,我们不会做。blabla
存储引擎:这段话说的很傲娇啊,如下:
通常来讲吧,存储引擎这个事情吧,老重要了!除了我们这个贼牛贼牛八辈子找不着的分片算法,还有好多人吧,跃跃欲试。
扯犊子呢!做这个引擎吧,不是能跟Memcached协议说上话就行了,那连门儿都没摸着呢。
最重要的,要考虑tc分配啊,je分类啊,CPU效率啊,说多了你们也不懂。
别瞎整,落你们几条街了,都给我老实实的。

TutorialCachingStory 
http://code.google.com/p/memcached/wiki/TutorialCachingStory
介绍一个典型的应用场景,文风很幽默,看原文吧。
大概就是受苦受难的朝鲜人民迎来了金大胖、二胖、三胖的节奏。


数据库出问题了!平均负载超过20(这是在搞笑吗?)。


6台 Web Server,搞出3台来,加1g内存,跑Memcached(限制为1G)。
$MEMCACHE_SERVERS = array(
    "10.1.1.1", //web1
    "10.1.1.2", //web2
    "10.1.1.3", //web3
);
$memcache = new Memcache();
foreach($MEMCACHE_SERVERS as $server){
    $memcache->addServer ( $server );
}


SELECT * FROM hugetable WHERE timestamp > lastweek ORDER BY timestamp ASC LIMIT 50000; (有病啊,一次加载50000)
花了5秒,我想说:no zuo no die。
$huge_data_for_front_page = $memcache->get("huge_data_for_front_page");
if($huge_data_for_front_page === false){
    $huge_data_for_front_page = array();
    $sql = "SELECT * FROM hugetable WHERE timestamp > lastweek ORDER BY timestamp ASC LIMIT 50000";
    $res = mysql_query($sql, $mysql_connection);
    while($rec = mysql_fetch_assoc($res)){
        $huge_data_for_front_page[] = $rec;
    }
    // cache for 10 minutes
    $memcache->set("huge_data_for_front_page", $huge_data_for_front_page, 0, 600);
}

// use $huge_data_for_front_page how you please
数据库负载降到10了。

数据只在一个服务器上缓存。
某个服务器down,自动负载到其他两台上,还是有个缓存失效的过程。(应该配双机互备)


ConfiguringServer  
-m, -d, and -v.
by default memcached listens on TCP and UDP ports, both 11211
-l
TCP
-p changes where it will listen for TCP connections. When changing the port via -p, the port for UDP will follow suit.


UDP
-U modifies the UDP port, defaulting to on. UDP is useful for fetching or setting small items, not as useful for manipulating large items. 


Setting this to 0 will disable it, if you're worried.


Clustering  
Noisy Gaggle:七嘴八舌,说啥的都有,消停消停再说。乱世到三国。


Clients
Pick Your Poison:饮鸩止渴,选个死法吧。


ConfiguringClient  
Hasing : 如果支持多个,需要选。
Consistent Hashing:增减服务器不要引起轩然大波。
Configuring Servers Consistently:单点down的时候,可以自适应
weighting:考虑不同节点的处理能力
Failure,failover:
压缩
管理好连接

Hardware Requirements
low on cpu,网络轻度到中度,MM高。
默认4个worker threads
RAM:biger better
服务器之间内存大小最好一致。
检测服务器的交换分区,如果开始使用虚拟内存了,你要及时调整。 

Tools for monitoring memcached(这个是要点)
http://code.google.com/p/memcached/wiki/MonitorLinks
http://code.google.com/p/memcached/wiki/Tools




Resources / Articles / Books(Slides部分应该好好看看,那么傲娇,一定有神奇之处。集群hash算法很可能要自己做)
http://code.google.com/p/memcached/wiki/Resources


 HowToLearnMoreScalability  
http://code.google.com/p/memcached/wiki/HowToLearnMoreScalability

Clients
(1)c/c++: libmemcached(久经考验,支持async,支持二进制协议),libmemcache,apr_memcache,memcache_client(主要关注windows,
最后更新2008),libketama
有几个最近不更新了。
(2)PHP: PECL/memcached,PECL/memcache,两者比较:http://code.google.com/p/memcached/wiki/PHPClientComparison
(3)Java:
spymemcached:http://www.couchbase.org/code/couchbase/java(专门了解下)
积极优化、支持async,支持二进制协议,支持membase和couchbase(这两个是什么?)
其他的大概看看吧.

Integrations
http://code.google.com/p/simple-spring-memcached(专门了解下)
http://code.google.com/p/memcached-session-manager(专门了解下)
(4)MySQL:https://launchpad.net/memcached-udfs (最近更新2009-11-15)
This is a set of MySQL UDFs (user defined functions) to work with memcached using libmemcached.

This is a set of MySQL UDFs (user defined functions) to work with memcached using libmemcached. With these functions you get, set, cas, append, prepend, delete, increment, decrement objects in memcached, as well as set which servers to use and which behavior the server connections will use. Combine these functions with MySQL triggers and you can manage your memcached cache. The library makes use of libmemcached. You can also use memcached as a global sequence generator for MySQL by making use of the increment  function. These functions are compatible with all versions of MySQL. The major contributing author is Patrick Galbraith The functions:


memc_servers_set()
memc_set(), memc_set_by_key()
memc_cas(), memc_cas_by_key(),
memc_get(), memc_get_by_key(),
memc_get_cas(), memc_get_cas_by_key(),
memc_delete(), memc_delete_by_key()
memc_append(), memc_append_by_key()
memc_prepend(), memc_prepend_by_key()
memc_increment(),
memc_decrement()
memc_replace(), memc_replace_by_key(),
memc_behavior_set(), memc_behavior_get(),
memc_behaviors_list(), memc_server_count(),
memc_udf_version(), memc_version()

协议:
http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt
打不开,下载不下来。
二进制协议:
http://code.google.com/p/memcached/wiki/MemcacheBinaryProtocol
2008年,仍是草案。RFC 2026 section10?


开发库:

git clone git://github.com/memcached/memcached.git

3、《Using memcached-How to scale your website easily》
2009年的
Server Hashing
#memcachedCompresionExample.pl
#!/usr/bin/perl
use Cache::Memcached;
# Set the server list up
my $memd = new Cache::Memcached {'servers' => [ "127.0.0.1:11211" ],};
#flush the servers to remove any unwanted data before testing.
$memd->flush_all();
#set compression level
$memd->set_compress_threshold(1_000);
$memd->enable_compress(1);
open(HANDLE, "full.html" );
undef $/;
$raw_data = <HANDLE>;
close(HANDLE);
$memd->set("Compressed" , $raw_data);
$memd->enable_compress(0);
$memd->set("Uncompressed" , $raw_data);
#disconnect from all servers
$memd->disconnect_all();


Apache Session:http://search.cpan.org/~enrys/Apache-Session-Memcached-0.03/
高可用方案:http://repcached.lab.klab.org/













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值