伪分布式内存缓存之Memcached

为什么标题称Memcached为伪分布式内存缓存呢?

1. Memcached服务端没有集群化方案,存在单点故障的风险。

2. Memcached服务端没有持久化机制,数据存放在内存中,进程退出数据丢失。

 

1. Memcached安装与使用

 官方网站:http://memcached.org/

 下载地址: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. 性能测试报告

 [待补充]

 

猜你喜欢

转载自sunxien.iteye.com/blog/2356620
今日推荐