伪分布式内存缓存之Memcached
为什么标题称Memcached为伪分布式内存缓存呢?
1. Memcached服务端没有集群化方案,存在单点故障的风险。
2. Memcached服务端没有持久化机制,数据存放在内存中,进程退出数据丢失。
1. Memcached安装与使用
下载地址:http://www.memcached.org/files/memcached-1.4.34.tar.gz
Memcached依赖libevent库:
apt-get install libevent-dev
yum install libevent-devel
其它系统安装脚本可以自己搜索......
解压memcached-1.x.x.tar.gz安装包:
wget https://memcached.org/latest [you might need to rename the file] tar -zxf memcached-1.x.x.tar.gz cd memcached-1.x.x ./configure --prefix=/usr/local/memcached make && make test && sudo make install
2. Memcached内存管理机制
说明:memcached服务端进程启动,通过 -m 参数分配一块指定大小的内存区域(默认:64M)。
memcached内存划分机制如图,首先理解几个概念:
1. Slab Class: 内存大小相同的Slab属于一个Slab Class,通过 -f 参数区分每个Slab的内存区块增长
2. Slab: 包含多个Chunk,每个Slab(默认:1M)按照最小内存大小进行切分
3. Chunk: 存储 [K-V] 数据的最小内存单元,通过 -n 参数指定最小内存分配空间
启动参数参考(部分命令未用过,注意是否支持):
-p 指定端口号(默认: 11211)
-U <num> UDP监听端口 (默认: 11211, 0 时关闭)
-s <file> 用于监听的UNIX套接字路径(禁用网络支持)
-a <mask> UNIX套接字访问掩码,八进制数字(默认:0700)
-m 指定最大使用内存大小(默认:64MB)
-t 线程数(默认:4)
-l <ip_addr> 绑定地址 (默认:允许所有地址绑定,存在安全隐患)
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-u <username> 绑定使用指定用于运行进程 <username> (只有root用户可以使用这个参数)
-P <file> 将PID写入文件<file>,这样可以使得后边进行快速进程终止, 需要与 -d 一起使用
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数(默认:1024)
-f 块大小增长因子(默认:1.25)
-n <bytes> 最小分配空间,key+value+flags默认是48
-k 锁定所有内存页。注意你可以锁定的内存上限。试图分配更多内存会失败的,所以留意启动守护 进程时所用的用户可分配的内存上限。(不是前面的 -u <username> 参数;在sh下,使用命 令"ulimit -S -l NUM_KB"来设置)
-v 提示信息(在事件循环中打印错误/警告信息)
-vv 详细信息(还打印客户端命令/响应)
-vvv 超详细信息(还打印内部状态的变化)
-h 打印这个帮助信息并退出。
-i 打印memcached和libevent的许可。
-L 尝试使用大内存页(如果可用的话)。提高内存页尺寸可以减少"页表缓冲(TLB)"丢失次数,提 高运行效率。为了从操作系统获得大内存页,memcached会把全部数据项分配到一个大区块
-D <char> 使用 <char> 作为前缀和ID的分隔符。这个用于按前缀获得状态报告。默认是":"(冒 号)。如果 指定了这个参数,则状态收集会自动开启;如果没指定,则需要用命令"stats detail on"来开启
-R 每个连接可处理的最大请求数
-C 禁用CAS
-b 设置后台日志队列的长度(默认:1024)
-B 绑定协议 - 可能值:ascii,binary,auto(默认)
-I 重写每个数据页尺寸。调整数据项最大尺寸
客户端写入命令,服务端的处理流程大致如下图:
3. Memcached如何解决单点故障?
方案一:采用客户端分片,例如:一致性哈希
方案二:引入中间层代理,例如:Twemproxy
4. Memcached如何支持高可用方案?
1. 主备复制:http://repcached.lab.klab.org/
引入主备复制方案后,实践中可以结合LVS作为前端负载均衡,以及Keepalived节点心跳检查。网上的架构案例非常多LVS+Keepalived+Twemproxy。总之,具体的方案落地结合具体的业务场景去设计。
5. 简单企业架构设计
图中仅显示Memcached在企业架构中充当的角色,之所以称为简单企业架构,由于以上所描述的架构图在实践中依然存在许多细节性的问题,而这些问题也算比较严重,甚至影响到系统运行的稳定性。实际开发中应该根据业务特点进行适当的调整或者重新设计。
6. 性能测试报告
[待补充]