强曰为道

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

第 2 章:安装与部署

第 2 章:安装与部署

2.1 安装方式总览

平台推荐方式难度
Ubuntu / Debianapt 包管理器★☆☆
CentOS / RHELyum / dnf★☆☆
macOSbrew★☆☆
源码编译configure && make★★☆
Dockerdocker run★☆☆
WindowsWSL2 或 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>11211TCP 监听端口
-U <port>11211UDP 监听端口(0 禁用)
-l <addr>所有接口监听地址
-c <num>1024最大并发连接数
-t <num>4工作线程数
-d以守护进程运行
-u <user>当前用户运行用户
-P <file>PID 文件路径
-f <factor>1.25Slab 增长因子
-n <bytes>48最小 chunk 空间(字节)
-s <file>Unix Socket 路径
-a <mode>0700Socket 文件权限

高级参数

参数默认值说明
-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