Memcache-基础架构
Memcache(或Memcached)是一种高性能的分布式内存对象缓存系统,广泛应用于互联网应用中以提升数据访问速度和减轻数据库负载。它通过将数据存储在内存中,减少了对磁盘I/O的需求,从而显著提高了应用程序的响应时间和整体性能。下面将从多个维度详细解析Memcache的基础架构。
核心架构组件
Memcache采用典型的客户端-服务器(C/S)架构,主要由以下核心组件构成:
客户端
负责与Memcached服务器通信,发送存储和检索请求。客户端可以使用多种编程语言实现(如PHP、Python、Perl等),并通过Memcached协议与服务器端进行通信。
服务器端
用C语言编写,负责数据存储和管理。服务器端架构包括:
- 内存存储:所有数据存储在内存中,读写速度极快
- 哈希表:使用高效的哈希算法快速定位数据
- LRU算法:管理内存空间回收
网络通信层
基于TCP/IP协议进行通信,默认端口11211。支持文本协议和二进制协议两种通信方式,其中二进制协议更高效,减少了解析开销。
内存管理机制
Memcache采用Slab Allocation内存管理机制,这是其高性能的核心设计:
内存划分:
- 将内存划分为64MB的页(page)
- 每页细分为1MB的块(chunk)
- 支持动态调整块大小(默认从64B到1MB共42种规格)
碎片控制策略:
- 相同大小的数据会分配到相同类型的块
- 自动填充机制减少内部碎片
- 定期内存整理线程处理外部碎片
淘汰算法:
- 增强版LRU(最近最少使用)算法
- 维护双向链表记录访问顺序
- 采样淘汰机制(随机选取5个key淘汰最旧的)
- 支持多种淘汰策略配置:ini
maxmemory-policy volatile-lru # 仅淘汰设置过期时间的key maxmemory-policy allkeys-lru # 淘汰所有类型的key maxmemory-policy volatile-ttl # 淘汰剩余时间最短的key
分布式架构
Memcache的分布式特性主要通过客户端实现:
数据分布算法:
- 求余数hash算法:先用key做hash运算得到一个整数,再做hash算法,根据余数进行路由。适合大多数据需求,但是不适合在动态变化的环境中
- 一致性哈希算法:按照hashi算法把对应的key通过一定的hash算法处理后映射形成一个首尾相接闭合循环,然后通过使用与对象存储一样的hash算法将机器也映射到环中,顺时针方向计算将所有对象存储到自己最近的机器中。适合在动态变化的环境中使用
虚拟节点技术:
- 默认每个物理节点对应160个虚拟节点
- 哈希空间:16384个槽位(slot)
- 提高数据分布均匀性
节点故障处理:
- 心跳检测间隔:1秒
- 判定超时:3次心跳无响应
- 自动跳过故障节点
- 重试机制可配置
数据存储与检索
数据模型:
- 简单的键值对(Key-Value)存储
- Key:唯一标识数据的字符串(不超过250字节)
- Value:实际存储的数据(建议不超过1MB)
- Expiration:过期时间(秒级精度,最长30天)
存储流程:
- 客户端发送存储请求,包含Key和Value
- 服务器接收到请求后,将数据存储在内存中
- 根据LRU策略管理缓存数据
- 服务器返回存储成功的响应
检索流程:
- 应用程序首先检查Memcached中是否存在所需数据
- 如果存在(命中),直接返回缓存数据
- 如果不存在(未命中),从数据库读取数据
- 将数据库返回的数据写入Memcached供后续使用
性能特性
Memcache具有极高的性能表现:
- 纯内存操作,单个实例可以处理数十万QPS(每秒查询数)
- 典型延迟表现:99%的请求响应时间低于1毫秒
- 性能基准测试示例:在8核CPU/32GB内存的节点上,可稳定处理120,000 QPS
- 横向扩展能力:
- 8节点集群:160万 QPS
- 32节点集群:580万 QPS
- 100节点集群:1200万 QPS
部署
创建程序用户
bash
useradd -M -s /sbin/nologin memcached安装libevent 事件驱动库
GitHub 地址:https://github.com/libevent/libevent
官网地址:http://libevent.org/
bash
# 安装基础依赖包
dnf -y install gcc gcc-c++ make openssl-devel
# 下载安装包
wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
tar zxvf libevent-2.1.12-stable.tar.gz -C /usr/src
cd /usr/src/libevent-2.1.12-stable
# 预配置
./configure --prefix=/usr/local/libevent
# 编译安装
make -j$(nproc) && make install备注:Libevent 是一个轻量级的开源高性能事件通知库,支持多种 I/O 多路复用技术,是 Memcached 的基础依赖
安装memcache
bash
# 下载安装包
wget https://memcached.org/files/memcached-1.6.39.tar.gz
tar zxvf memcached-1.6.39.tar.gz -C /usr/src
cd /usr/src/memcached-1.6.39
# 预配置
./configure \
--prefix=/usr/local/memcached \
--with-libevent=/usr/local/libevent
# 编译安装
make -j$(nproc) && make install
# 创建符号链接,使命令可直接调用
ln -s /usr/local/memcached/bin/* /usr/local/bin创建service管理文件
bash
cat > /usr/lib/systemd/system/memcached.service<< EOF
[Unit]
Description=Memcached Service
After=network.target
[Service]
Type=forking
User=root
Group=root
ExecStart=/usr/local/bin/memcached -d \
-m 4096 \
-p 11211 \
-u memcached \
-c 8192 \
-t $(nproc) \
-l 0.0.0.0 \
-R 100 \
-o slab_reassign,slab_automove
ExecStop=/usr/bin/pkill memcached
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable memcached --now内核优化
bash
echo 'net.ipv4.tcp_max_syn_backlog = 4096' >> /etc/sysctl.conf
echo 'net.core.somaxconn = 4096' >> /etc/sysctl.conf
sysctl -p启动服务
bash
# 启动命令
/usr/local/bin/memcached -d \
-m 4096 \ # 4GB内存
-p 11211 \ # 连接端口
-u memcached \ # 启动用户
-c 8192 \ # 最大连接数
-t 8 \ # 8线程(8核CPU)
-l 0.0.0.0 \ # 业务IP
-R 100 \ # 每事件最大请求
-o slab_reassign,slab_automove \ # 自动内存调整
-v >> /var/log/memcached.log 2>&1启动参数:
| 参数 | 默认值 | 优化建议 | 说明 |
|---|---|---|---|
-m | 64MB | 512MB-2GB | 根据可用内存的70%设置 |
-c | 1024 | 4096-16384 | 最大并发连接数 |
-t | 4 | CPU核心数 | 工作线程数 |
-l | 0.0.0.0 | 指定业务IP | 安全限制 |
-R | 20 | 50-100 | 每个事件最大请求数 |
-B | auto | ascii | 强制使用ASCII协议提高兼容性 |
客户端测试
bash
# 网络连通性测试
telnet 127.0.0.1 11211
# 连接后可通过 Memcached 协议命令操作
# 存储数据
set mykey 0 60 5
hello
# 获取数据
get mykey
# 查看服务器状态
stats
# 删除数据
delete mykey
# 获取统计信息
dnf -y install nc
echo "stats" | nc 127.0.0.1 11211高级集群解决方案
使用Magent构建集群
Magent是Memcached代理组件,可实现:
- 自动故障转移和重连机制
- 数据备份功能
- 负载均衡
Repcached主从复制
Repcached是Memcached的分支,支持:
- 主从复制功能
- 故障自动切换
- 数据同步
