Skip to content

Memcache-基础架构

官网:https://memcached.org/

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的分布式特性主要通过客户端实现:

  1. 数据分布算法

    • 求余数hash算法:先用key做hash运算得到一个整数,再做hash算法,根据余数进行路由。适合大多数据需求,但是不适合在动态变化的环境中
    • 一致性哈希算法:按照hashi算法把对应的key通过一定的hash算法处理后映射形成一个首尾相接闭合循环,然后通过使用与对象存储一样的hash算法将机器也映射到环中,顺时针方向计算将所有对象存储到自己最近的机器中。适合在动态变化的环境中使用
  2. 虚拟节点技术

    • 默认每个物理节点对应160个虚拟节点
    • 哈希空间:16384个槽位(slot)
    • 提高数据分布均匀性
  3. 节点故障处理

    • 心跳检测间隔: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

启动参数

参数默认值优化建议说明
-m64MB512MB-2GB根据可用内存的70%设置
-c10244096-16384最大并发连接数
-t4CPU核心数工作线程数
-l0.0.0.0指定业务IP安全限制
-R2050-100每个事件最大请求数
-Bautoascii强制使用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的分支,支持:

  • 主从复制功能
  • 故障自动切换
  • 数据同步