强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Memcached 完全指南 / 第 2 章:安装与部署

第 2 章:安装与部署

2.1 安装方式总览

平台 推荐方式 难度
Ubuntu / Debian apt 包管理器 ★☆☆
CentOS / RHEL yum / dnf ★☆☆
macOS brew ★☆☆
源码编译 configure && make ★★☆
Docker docker run ★☆☆
Windows WSL2 或 Cygwin ★★☆

2.2 Linux 安装

Ubuntu / Debian

# 更新包索引
sudo apt-get update

# 安装 Memcached 和开发库
sudo apt-get install -y memcached libmemcached-tools

# 验证安装
memcached -h | head -5
# memcached 1.6.x

# 查看服务状态
sudo systemctl status memcached

# 启动并设置开机自启
sudo systemctl start memcached
sudo systemctl enable memcached

默认安装后的配置文件位于 /etc/memcached.conf

# 查看默认配置
cat /etc/memcached.conf

典型的默认配置内容:

# /etc/memcached.conf
-d              # 以守护进程运行
logfile /var/log/memcached.log
-m 64           # 最大内存 64MB
-p 11211        # 监听端口
-u memcache     # 运行用户
-l 127.0.0.1    # 只监听本地(安全)
-c 1024         # 最大连接数
-t 4            # 工作线程数

CentOS / RHEL / Fedora

# CentOS 7 / RHEL 7
sudo yum install -y memcached

# CentOS 8+ / RHEL 8+ / Fedora
sudo dnf install -y memcached

# 启动服务
sudo systemctl start memcached
sudo systemctl enable memcached

# 检查防火墙(如果需要远程访问)
sudo firewall-cmd --add-port=11211/tcp --permanent
sudo firewall-cmd --reload

源码编译安装

适用于需要最新版本或自定义编译选项的场景:

# 安装依赖
sudo apt-get install -y build-essential libevent-dev

# 下载源码(以 1.6.31 为例)
cd /tmp
wget https://memcached.org/files/memcached-1.6.31.tar.gz
tar xzf memcached-1.6.31.tar.gz
cd memcached-1.6.31

# 配置编译选项
./configure \
    --prefix=/usr/local/memcached \
    --enable-sasl           \  # 启用 SASL 认证
    --enable-tls            \  # 启用 TLS 加密
    --enable-seccomp           # 启用 seccomp 沙箱

# 编译(-j 指定并行数)
make -j$(nproc)

# 安装
sudo make install

# 验证
/usr/local/memcached/bin/memcached -h

编译选项说明

选项 说明
--enable-sasl 启用 SASL 认证(需要 libsasl2-dev
--enable-tls 启用 TLS 传输加密(需要 libssl-dev
--enable-seccomp 启用 Linux seccomp 沙箱
--enable-asan 启用 AddressSanitizer(调试用)
--disable-docs 不构建 man 手册

2.3 macOS 安装

# 使用 Homebrew
brew install memcached

# 查看安装信息
brew info memcached

# 启动服务(后台)
brew services start memcached

# 或者前台运行(开发调试用)
memcached -vv -p 11211

# 验证
nc localhost 11211
version
# VERSION 1.6.x
quit

2.4 Docker 安装(推荐)

Docker 是最快捷的安装方式,适合开发和测试环境:

基本启动

# 拉取镜像
docker pull memcached:1.6-alpine

# 启动容器
docker run -d \
    --name memcached \
    -p 11211:11211 \
    memcached:1.6-alpine \
    memcached -m 128 -c 2048 -t 4

# 验证运行
docker stats memcached --no-stream
docker exec memcached memcached --version

常用 Docker 启动命令

# 开发环境:带详细日志
docker run -d --name mc-dev -p 11211:11211 \
    memcached:1.6-alpine \
    memcached -m 64 -vv

# 生产环境:资源限制
docker run -d --name mc-prod -p 11211:11211 \
    --memory=2g \
    --cpus=2 \
    --restart=unless-stopped \
    --ulimit nofile=65535:65535 \
    memcached:1.6-alpine \
    memcached -m 1024 -c 10000 -t 8

# 带 SASL 认证
docker run -d --name mc-sasl -p 11211:11211 \
    memcached:1.6-alpine \
    memcached -m 128 -S

镜像标签选择

标签 大小 说明
1.6-alpine ~10MB 推荐,基于 Alpine,最小镜像
1.6 ~90MB 基于 Debian
latest ~90MB 等同于 1.6

2.5 启动参数详解

完整参数列表

memcached -h

核心参数

参数 默认值 说明
-m <MB> 64 最大内存(MB)
-p <port> 11211 TCP 监听端口
-U <port> 11211 UDP 监听端口(0 禁用)
-l <addr> 所有接口 监听地址
-c <num> 1024 最大并发连接数
-t <num> 4 工作线程数
-d 以守护进程运行
-u <user> 当前用户 运行用户
-P <file> PID 文件路径
-f <factor> 1.25 Slab 增长因子
-n <bytes> 48 最小 chunk 空间(字节)
-s <file> Unix Socket 路径
-a <mode> 0700 Socket 文件权限

高级参数

参数 默认值 说明
-o <opts> 扩展选项(逗号分隔)
-I <size> 1m 单个 Item 最大值(1k-128m)
-k 锁定所有内存页(mlockall)
-S 启用 SASL 认证
-R <num> 20 单事件最大请求数
-C 禁用 CAS
-b <num> 1024 监听队列长度
-B <proto> auto 协议(auto/ascii/binary)
--enable-shutdown 允许 shutdown 命令
--memory-limit 内存限制后的行为

扩展选项(-o 参数)

# 常用扩展选项组合
memcached -o \
    maxconns_fast,      # 快速拒绝超限连接
    lru_crawler,        # 启用 LRU 爬虫
    lru_maintainer,     # 启用 LRU 维护线程
    hash_algorithm=murmur3,  # 哈希算法
    slab_automove=1,    # 自动 Slab 迁移
    no_hashexpand       # 禁止哈希表扩展
扩展选项 说明
maxconns_fast 达到连接上限时快速返回错误
lru_crawler 启用 LRU 爬虫清理过期 Item
lru_maintainer 启用 LRU 维护线程(推荐)
slab_automove 自动在 Slab Class 间迁移内存页
slab_reassign 允许手动/自动重新分配 Slab 页
hash_algorithm 哈希算法:murmur3(推荐)/ jenkins / crc32
no_hashexpand 禁止哈希表自动扩展
inline_ascii_resp 内联 ASCII 响应(性能优化)
track_sizes 启用 stats sizes 命令

2.6 典型部署配置

开发环境

memcached \
    -m 64 \
    -p 11211 \
    -l 127.0.0.1 \
    -c 256 \
    -t 2 \
    -vv

特点:小内存、本机访问、详细日志。

测试环境

memcached \
    -m 256 \
    -p 11211 \
    -l 0.0.0.0 \
    -c 1024 \
    -t 4 \
    -f 1.25 \
    -o lru_maintainer,slab_automove,maxconns_fast

生产环境

memcached \
    -m 4096 \
    -p 11211 \
    -l 10.0.1.10 \
    -c 65535 \
    -t 8 \
    -f 1.25 \
    -n 72 \
    -k \
    -o lru_maintainer,slab_automove,maxconns_fast,hash_algorithm=murmur3 \
    -R 20 \
    -u memcache \
    -P /var/run/memcached/memcached.pid

systemd 服务配置

# /etc/systemd/system/memcached.service
[Unit]
Description=Memcached Server
After=network.target

[Service]
Type=simple
User=memcache
Group=memcache
ExecStart=/usr/bin/memcached \
    -m 4096 \
    -p 11211 \
    -l 10.0.1.10 \
    -c 65535 \
    -t 8 \
    -k \
    -o lru_maintainer,slab_automove,maxconns_fast
ExecReload=/bin/kill -USR1 $MAINPID
LimitNOFILE=65535
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
# 生效并启动
sudo systemctl daemon-reload
sudo systemctl restart memcached
sudo systemctl status memcached

2.7 验证安装

基本连通性测试

# 方法一:使用 nc(netcat)
echo "version" | nc localhost 11211
# VERSION 1.6.31

# 方法二:使用 telnet
telnet localhost 11211
# version
# VERSION 1.6.31
# quit

# 方法三:使用 Python
python3 -c "
import socket
s = socket.socket()
s.connect(('localhost', 11211))
s.send(b'version\r\n')
print(s.recv(1024).decode())
s.close()
"

读写测试

# 通过 nc 执行基本读写
{
    echo "set testkey 0 60 5"
    echo "hello"
    echo "get testkey"
    echo "quit"
} | nc localhost 11211

# 预期输出:
# STORED
# VALUE testkey 0 5
# hello
# END

检查运行状态

# 查看进程
ps aux | grep memcached

# 查看监听端口
ss -tlnp | grep 11211

# 查看内存使用
echo "stats" | nc localhost 11211 | grep -E "bytes |curr_items|cmd_get|cmd_set|get_hits|get_misses"

# 查看连接数
echo "stats" | nc localhost 11211 | grep curr_connections

2.8 常见问题排查

启动失败

# 错误:bind(): Address already in use
# 原因:端口被占用
sudo lsof -i :11211
sudo kill -9 <PID>

# 错误:mlockall(): Cannot allocate memory
# 原因:内存锁定失败,ulimit 限制
sudo sh -c "echo 'memcache hard memlock unlimited' >> /etc/security/limits.conf"
sudo sh -c "echo 'memcache soft memlock unlimited' >> /etc/security/limits.conf"

# 错误:too many connections
# 原因:连接数超过 -c 限制
# 解决:增大 -c 参数或检查连接泄漏

内存不足

# 检查系统可用内存
free -h

# 检查 Memcached 实际使用
echo "stats" | nc localhost 11211 | grep -E "bytes |limit_maxbytes"

扩展阅读

小结

要点 内容
最快安装 Docker:docker run -d -p 11211:11211 memcached:1.6-alpine
生产必备 -k(内存锁定)、-o lru_maintainer、合适的 -m-t
安全提示 -l 127.0.0.1 限制监听地址,生产环境勿暴露公网
验证方式 echo "version" | nc localhost 11211