《memcached全面剖析》
第1章 memcached的基础
1.1 memcached是什么?
memcached是高性能的分布式内存缓存服务器。
一般的做法是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态web应用的速度、可扩展性。
1.2 memcached的特征
- 协议简单:使用简单的基于文本行的协议
- 基于libevent的事件处理
- 内置内存存储方式
- memcached不互相通信的分布式:通过客户端实现分布式
1.3 安装memcached
- memcached的安装:默认安装到 /usr/local/bin 下
- memcached的启动:前台启动 /usr/local/bin/memcached -p 11211 -m 64m -vv;作为 daemon后台启动 /usr/local/bin/memcached -p 11211 -m 64m -d
1.4 用客户端连接
许多语言都实现了连接memcached的客户端,其中以Perl、PHP为主。
1.5 使用 Cache::Memcached
- 使用 Cache::Memcached 连接 Memcached
- 保存数据:向 memcached 保存数据的方法有 add,replace 和 set。向 memcached 保存数据时可以指定期限。不指定期限时,memcached 按照 LRU 算法保存数据。
- 获取数据:可以使用 get 和 get_multi 方法。
- 删除数据:使用 delete 方法。set 方法会忽视 delete 方法设置的阻塞时间,执行保存数据。
- 增一和减一操作:应注意进行错误检查。
第2章 理解 memcached 的内存存储
2.1 Slab Allocation 机制:整理内存以便重复利用
Slab Allocation 的基本原理是按照预先分配的内存大小(Page),将其分割成特定的块(Chunk),并把尺寸相同的块分成组(Slab Class),以完全解决内存碎片问题。另外,slab allocation 还能重复使用已分配的内存。
2.2 在 slab 中缓存记录的原理
memcached 根据收到的数据的大小,选择最适合数据大小的 slab,并缓存到 chunk 中。
2.3 Slab Allocation 的缺点
由于分配的是特定长度的内存,因此无法有效利用分配的内存。
2.4 使用Growth Factor 进行调优
memcached 在启动时指定 Growth Factor 因子(通过 -f 选项),就可以在某种程度上控制 slab 之间的差异。默认值为 1.25。
2.5 查看 memcached 的内部状态
使用 memcached 的 stats 命令,可以查看 slabs 的利用率等各种信息。
2.6 查看 slabs 的使用状况
第3章 memcached 的删除机制和发展方向
3.1 memcached在数据删除方面有效利用资源
- 数据不会从memcached真正消失
- Lazy Expiration:memcached不会从内部监视记录是否过期,而是在get时查看记录的时间戳,检查是否过期。
3.2 LRU:从缓存中有效删除数据的原理
3.3 memcached的最新发展方向
- 二进制协议:不需要文本协议的解析处理,提升memcached的性能和安全性。协议的包为24字节的帧,其后面是键和无结构数据。头部Header的长度为16字节,分为Request Header 和 Response Header。头部包含了表示包的有效性的Magic字节、命令种类、键长度、值长度等信息。
- 外部引擎的加载功能
3.4 外部引擎支持
- 外部引擎支持的必要性:外部引擎的加载机制能封装memcached的网络功能、事件处理等复杂操作。
- 简单API设计成功的关键
- 重新审视现在的体系:将内存存储的代码从核心服务器中独立出来,才能灵活地支持外部引擎。
第4章 memcached的分布式算法
4.1 memcached的分布式
memcached的分布式,是完全由客户端程序库实现的。
memcached的分布式是什么意思?
向memcached添加数据时,客户端的算法会根据键来选择要保存数据的memcached服务器;从memcached获取数据时,客户端会通过与数据保存时相同的算法,根据键来选择memcached服务器。
4.2 Cache::Memcached的分布式方法
根据余数计算分散
首先求得键的整数哈希值,再除以服务器台数,根据其余数来选择服务器。
当选择的服务器无法连接时,Cache::Memcached会将连接次数添加到键之后,再次计算哈希值并尝试连接。
根据余数计算分散的缺点
- 影响缓存的命中率,给数据库服务器带来极大的负载
4.3 Consistent Hashing
Consistent Hashing的简单说明
首先求出memcached服务器(节点)的哈希值,并将其配置到0~2^32的圆上,再用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从键映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2^32仍然找不到服务器,就会保存到第一台memcached服务器上。
在添加一台memcached服务器之后,只有在圆上增加服务器的地点和逆时针方向第一台服务器之间的键会受到影响。
如果使用虚拟节点的思想,为每个物理节点在圆上分配100~200个点,就能抑制服务器的分布不均匀,最大限度地减小服务器增减时的缓存重新分布。
支持Consistent Hashing的函数库
PHP客户端:libketama
Perl客户端:Cache::Memcached::Fast和Cache::Memcached::libmemcached
第5章 memcached的应用和兼容程序
5.1 mixi案例研究
随着网站访问量的急剧增加,单纯为数据库添加slave已经无法满足需要,因此引入了memcached。
服务器配置和数量
将数据库服务器、应用服务器等换成性能更强大、内存更多的服务器,这样可以抑制服务器数量的剧增,降低管理成本,还可以将换下来的服务器用作memcached服务器。
memcached进程
每台memcached服务器仅启动一个memcached进程。memcached进程的实际内存分配量要比指定的容量大。
memcached使用方法和客户端
现在mixi的服务将200台左右的memcached服务器作为一个pool使用。每台服务器的容量为3GB,那么就有了将近600GB的巨大内存数据库。
通过Cache::memcached::Fast维持连接
公共数据的处理和rehash
Cache::memcached::Fast会在连接服务器失败时,短时间内不再连接该服务器。
mixi还为公共数据的键名设置命名规则,符合命名规则的键名的数据会保存到多台服务器中,取数据时仅从其中一台服务器选取即可。
5.2 memcached应用经验
通过daemontools启动
daemontools可以监视memcached进程,在memcached进程死掉后自动启动它。
监视
memcached的性能
5.3 兼容应用程序
- repcached
- Flared
- memcachedb
- Tokyo Tyrant
《memcached全面剖析》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- HSV做通道分离是出现的Vector内存越界错误
vector<Mat> hsvSplit; //因为我们读取的是彩色图,直方图均衡化需要在HSV空间做 split(imgHSV, hsvSplit); equalizeHist(hsvS ...
- [Atcoder Regular Contest 062] Tutorial
Link: ARC 062 传送门 C: 每次判断增加a/b哪个合法即可 并不用判断两个都合法时哪个更优,因为此时两者答案必定相同 #include <bits/stdc++.h> usi ...
- POJ 1912 A highway and the seven dwarfs (凸包)
[题目链接] http://poj.org/problem?id=1912 [题目大意] 给出一些点,表示一些屋子,这些屋子共同组成了村庄,现在要建一些高速公路 问是否经过了村庄. [题解] 这些屋子 ...
- 【莫队算法】URAL - 2080 - Wallet
http://www.cnblogs.com/icode-girl/p/5783983.html 要注意卡片没有都被使用的情况. #include<cstdio> #include< ...
- 【博弈论】【SG函数】【找规律】Gym - 101147A - The game of Osho
以后这种题还是不能空想,必须打个表看看,规律还是比较好找的……具体是啥看代码.用SG函数暴力的部分就不放了. #include<cstdio> using namespace std; i ...
- 【后缀数组】bzoj2217 Secretary
考虑简化问题:计算一个字符串中至少出现两次的最长子串.答案一定会在sa中相邻两个后缀的lcp中.因为后缀的位置在sa中相距越远,其lcp的长度就越短,这是由于字典序的性质决定的. 于是,在s1和s2中 ...
- 【树状数组】bzoj2743 [HEOI2012]采花
http://www.cnblogs.com/proverbs/archive/2012/10/29/2745281.html (↑)这样处理之后,每次询问时,对于每种颜色,从1到其倒数第二次出现的位 ...
- cocos2d-x引擎优化 修改记录
3.13 一些无聊的bug etc1 在android 平台不能正常显示,包括 cc.Button,setGray,clipeNode 3.13.1优化记录 7月 2.公式计算改为长整型, ...
- IIS 7 网站权限问题
IIS7 应用程序池[标识]为[ApplicationPoolIdentity] 给程序目录赋权限: IUSER IIS AppPool\[应用程序池名]
- npm依赖管理:冗余,依赖树
npm的依赖树查询:原理都是查询文件夹node_modules的结构.比如mac的node_modules位置在/usr/local/lib下.具体项目的node_modules位置位于项目根目录下. ...