Skip to content

Memcached 升级步骤

升级前准备

版本兼容性检查

查看当前版本

bash
# 查看当前 Memcached 版本
memcached -V

# 输出示例
memcached 1.5.22

检查目标版本兼容性

版本升级路径

  • 推荐渐进式升级,避免跨多个大版本
  • 例如:1.4.x → 1.5.x → 1.6.x → 1.6.x 最新版

环境备份

数据备份

bash
# 使用 memcached-dump 工具备份数据
memcached-dump --server=localhost --port=11211 > memcached_backup_$(date +%Y%m%d_%H%M%S).dump

# 或使用自定义脚本备份
#!/usr/bin/env python3
import memcache
import pickle
from datetime import datetime

mc = memcache.Client(['localhost:11211'])

def backup_memcached(output_file):
    # 注意:生产环境中如果键数量很大,此方法可能导致性能问题
    # 建议使用 sampling 或分批次备份
    
    # 获取所有键(生产环境慎用)
    stats = mc.get_stats()[0][1]
    total_items = int(stats['curr_items'])
    print(f"当前存储 {total_items} 个键值对")
    
    # 示例:备份所有键(生产环境建议抽样)
    # 注意:memcache 客户端可能不支持 get_list 方法,具体取决于客户端库
    try:
        keys = mc.get_list()
        data = mc.get_multi(keys)
        
        with open(output_file, 'wb') as f:
            pickle.dump(data, f)
        
        print(f"成功备份 {len(data)} 个键值对到 {output_file}")
    except Exception as e:
        print(f"备份失败: {e}")

backup_file = f"memcached_backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pkl"
backup_memcached(backup_file)

配置文件备份

bash
# 备份配置文件
cp /etc/memcached.conf /etc/memcached.conf.bak.$(date +%Y%m%d)

# 备份 systemd 配置(如果使用)
cp /etc/systemd/system/memcached.service /etc/systemd/system/memcached.service.bak.$(date +%Y%m%d)

服务状态记录

bash
# 记录当前服务状态
systemctl status memcached > memcached_status_$(date +%Y%m%d_%H%M%S).log

# 记录当前性能指标
echo -e "stats\nquit" | nc localhost 11211 > memcached_stats_$(date +%Y%m%d_%H%M%S).log

测试环境验证

搭建测试环境

  1. 复制生产环境配置到测试环境
  2. 导入生产环境备份数据
  3. 安装目标版本 Memcached
  4. 运行应用程序测试套件
  5. 验证功能和性能

测试重点

  • 基本读写功能
  • 连接管理
  • 内存使用
  • 性能指标
  • 客户端兼容性

升级步骤

1. 单实例升级

步骤1:停止当前服务

bash
# 停止 Memcached 服务
systemctl stop memcached

# 验证服务已停止
ps aux | grep memcached

步骤2:安装目标版本

CentOS/RHEL 系统

bash
# 使用 yum 安装(如果仓库中有目标版本)
yum install memcached-1.6.18 -y

# 或从源码编译
wget https://memcached.org/files/memcached-1.6.18.tar.gz
tar -xzf memcached-1.6.18.tar.gz
cd memcached-1.6.18
./configure
make
make install

Ubuntu/Debian 系统

bash
# 使用 apt 安装
apt update
apt install memcached=1.6.18 -y

# 或从源码编译
wget https://memcached.org/files/memcached-1.6.18.tar.gz
tar -xzf memcached-1.6.18.tar.gz
cd memcached-1.6.18
./configure
make
make install

步骤3:验证安装

bash
# 验证版本
memcached -V

# 输出示例
memcached 1.6.18

步骤4:更新配置文件

bash
# 对比配置文件差异
diff /etc/memcached.conf /etc/memcached.conf.bak.$(date +%Y%m%d)

# 根据新版本要求调整配置
vi /etc/memcached.conf

步骤5:启动服务

bash
# 启动服务
systemctl start memcached

# 验证服务状态
systemctl status memcached

# 验证连接
echo "stats" | nc localhost 11211

步骤6:功能验证

bash
# 测试基本读写功能
echo -e "set test_key 0 60 5\nvalue\nget test_key\nquit" | nc localhost 11211

2. 集群升级

滚动升级策略(推荐):

  1. 逐台升级集群中的 Memcached 实例
  2. 确保升级过程中集群整体可用
  3. 适用于高可用要求高的场景

步骤1:暂停实例流量

bash
# 使用负载均衡器移除实例
# 例如:Nginx 配置修改
# 或使用服务发现机制(如 Consul、Etcd)

# 或调整客户端配置,暂时移除该实例

步骤2:升级单实例

  • 按照单实例升级步骤进行

步骤3:验证实例

  • 确认实例正常运行
  • 测试基本功能

步骤4:恢复流量

  • 将实例重新加入负载均衡
  • 监控流量和性能

步骤5:继续下一个实例

  • 重复步骤1-4,直到所有实例升级完成

批量升级策略

  • 适用于非关键业务或有冗余集群的场景
  • 同时升级多个实例
  • 风险较高,建议在维护窗口进行

3. Docker/Kubernetes 环境升级

Docker 单实例升级

bash
# 停止并删除旧容器
docker stop memcached
docker rm memcached

# 拉取新镜像
docker pull memcached:1.6.18

# 启动新容器
docker run -d --name memcached -p 11211:11211 memcached:1.6.18 -m 1024 -c 1024

# 验证
 docker exec -it memcached memcached -V

Docker Compose 升级

yaml
# docker-compose.yml
version: '3'
services:
  memcached:
    image: memcached:1.6.18  # 更新版本号
    ports:
      - "11211:11211"
    command: ["-m", "1024", "-c", "1024"]
bash
# 重启服务
docker-compose up -d

Kubernetes 升级

yaml
# memcached-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: memcached
spec:
  replicas: 3
  selector:
    matchLabels:
      app: memcached
  template:
    metadata:
      labels:
        app: memcached
    spec:
      containers:
      - name: memcached
        image: memcached:1.6.18  # 更新版本号
        ports:
        - containerPort: 11211
        args: ["-m", "1024", "-c", "1024"]
bash
# 应用更新
kubectl apply -f memcached-deployment.yaml

# 验证滚动更新
ekubectl rollout status deployment/memcached

# 验证版本
kubectl exec -it $(kubectl get pods -l app=memcached -o jsonpath="{.items[0].metadata.name}") -- memcached -V

升级后验证

功能验证

基本功能测试

bash
# 测试 set/get 命令
echo -e "set test 0 60 5\nhello\nget test\nquit" | nc localhost 11211

# 测试删除命令
echo -e "delete test\nget test\nquit" | nc localhost 11211

# 测试统计命令
echo -e "stats\nquit" | nc localhost 11211

客户端兼容性测试

  • 运行应用程序的集成测试
  • 验证不同客户端库的兼容性
  • 测试连接池功能

性能验证

基准性能测试

bash
# 使用 memtier_benchmark 进行性能测试
memtier_benchmark -s localhost -p 11211 --protocol=memcache_text --clients=50 --threads=10 --test-time=30

# 或使用 ab 工具(简单测试)
ab -n 10000 -c 100 http://localhost:8080/test-endpoint  # 假设应用通过 8080 端口提供服务

监控关键指标

  • 内存使用率
  • CPU 使用率
  • 连接数
  • 命令执行速率
  • 缓存命中率
  • 响应时间

稳定性验证

压力测试

bash
# 使用 memtier_benchmark 进行压力测试
memtier_benchmark -s localhost -p 11211 --protocol=memcache_text --clients=100 --threads=20 --test-time=600 --ratio=3:1

长时间运行验证

  • 监控 24-48 小时
  • 检查日志中的错误信息
  • 验证内存泄漏情况

回滚策略

准备回滚

回滚触发条件

  • 严重功能故障
  • 性能大幅下降
  • 兼容性问题
  • 安全漏洞

回滚准备

  • 保留原版本安装包
  • 备份新版本配置
  • 准备回滚脚本

执行回滚

单实例回滚

bash
# 停止当前服务
systemctl stop memcached

# 安装原版本
# CentOS/RHEL
yum install memcached-1.5.22 -y

# Ubuntu/Debian
apt install memcached=1.5.22 -y

# 恢复配置文件
cp /etc/memcached.conf.bak.$(date +%Y%m%d) /etc/memcached.conf

# 启动服务
systemctl start memcached

# 验证
memcached -V

集群回滚

  • 按照滚动升级的反向顺序执行
  • 逐台回滚实例
  • 确保回滚过程中集群可用

回滚验证

  • 验证服务正常运行
  • 测试功能完整性
  • 监控性能指标
  • 检查日志错误

常见问题及解决方案

1. 升级后无法启动

问题症状

systemctl status memcached
● memcached.service - memcached daemon
   Loaded: loaded (/etc/systemd/system/memcached.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Wed 2023-05-17 14:30:00 CST; 1s ago

解决方案

bash
# 查看详细错误日志
journalctl -xe -u memcached

# 常见原因及解决:
# 1. 配置参数不兼容:检查配置文件,移除新版本不支持的参数
# 2. 端口冲突:检查端口占用情况
lsof -i :11211
# 3. 权限问题:检查数据目录和日志文件权限
ls -la /var/log/memcached.log

2. 客户端连接失败

问题症状

ERROR: Unable to connect to memcached server

解决方案

bash
# 检查服务是否运行
ps aux | grep memcached

# 检查监听地址和端口
netstat -tuln | grep 11211

# 检查防火墙设置
firewall-cmd --list-ports
# 或
ufw status

# 检查 SELinux 设置(CentOS/RHEL)
getenforce

3. 性能下降

问题症状

  • 响应时间增加
  • CPU 使用率升高
  • 吞吐量下降

解决方案

bash
# 检查配置参数
# 例如:线程数配置
vi /etc/memcached.conf
# 调整 -t 参数

# 检查内存配置
# 例如:增加内存容量
memcached -m 2048

# 检查客户端连接数
# 调整 -c 参数

4. 数据丢失

问题症状

  • 升级后部分或全部数据丢失

解决方案

bash
# 从备份恢复数据
# 使用自定义脚本恢复
#!/usr/bin/env python3
import memcache
import pickle

mc = memcache.Client(['localhost:11211'])

def restore_memcached(backup_file):
    with open(backup_file, 'rb') as f:
        data = pickle.load(f)
    
    # 批量恢复
    mc.set_multi(data)
    print(f"成功恢复 {len(data)} 个键值对")

restore_file = "memcached_backup_20230517_100000.pkl"
restore_memcached(restore_file)

最佳实践

1. 升级前

  • 制定详细的升级计划和回滚方案
  • 在测试环境验证升级过程
  • 备份所有重要数据和配置
  • 通知相关团队,安排维护窗口

2. 升级中

  • 遵循最小化影响原则
  • 监控关键指标
  • 及时记录问题和解决方案
  • 按照计划执行,避免临时变更

3. 升级后

  • 进行全面的功能和性能测试
  • 监控一段时间,确保稳定
  • 文档更新,记录升级过程和变更
  • 总结经验,优化升级流程

4. 长期策略

  • 建立定期升级机制
  • 关注官方安全公告和更新
  • 保持测试环境与生产环境版本一致
  • 建立自动化升级流程

常见问题(FAQ)

Q1: 升级 Memcached 是否会导致数据丢失?

A1: 是的,默认情况下升级会导致数据丢失,因为:

  • Memcached 数据存储在内存中
  • 升级过程需要重启服务
  • 重启会清空内存中的所有数据

解决方案

  • 提前备份数据
  • 使用集群滚动升级,减少影响范围
  • 应用程序实现缓存重建机制

Q2: 如何选择合适的升级时间?

A2: 建议:

  • 业务低峰期
  • 有足够的维护时间窗口
  • 相关团队人员在场
  • 避免重要业务活动期间

Q3: 升级后需要调整哪些配置参数?

A3: 主要关注:

  • 新版本废弃的参数
  • 新增的性能优化参数
  • 默认值变化的参数
  • 安全相关参数

建议:参考官方发布说明,对比配置文件差异。

Q4: 集群升级时如何保证服务可用性?

A4: 推荐滚动升级策略:

  • 逐台升级实例
  • 升级前从负载均衡中移除实例
  • 升级后验证正常再重新加入
  • 确保升级过程中集群有足够的可用实例

Q5: 如何验证升级后的性能?

A5: 验证方法:

  • 运行基准性能测试
  • 对比升级前后的关键指标
  • 监控生产流量下的表现
  • 运行应用程序的性能测试套件

Q6: 升级失败后如何快速回滚?

A6: 回滚步骤:

  1. 停止当前版本服务
  2. 安装原版本
  3. 恢复原配置
  4. 启动服务
  5. 验证功能

建议:提前准备回滚脚本,减少回滚时间。

Q7: 跨大版本升级需要注意什么?

A7: 跨大版本升级风险较高,建议:

  • 先在测试环境充分验证
  • 检查协议和数据格式兼容性
  • 关注配置参数的重大变更
  • 考虑分阶段升级
  • 准备详细的回滚方案