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 启动参数详解
完整参数列表
核心参数
| 参数 | 默认值 | 说明 |
|---|
-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 |