Skip to content

Memcached 批量部署

批量部署工具

1. Ansible

Ansible 简介

  • 基于 Python 的自动化配置管理工具
  • 无代理架构,仅需 SSH 访问
  • 使用 YAML 编写 playbook(剧本)
  • 支持并发执行,效率高

Ansible 部署 Memcached 示例

步骤 1:安装 Ansible

bash
# CentOS/RHEL 系统安装
 yum install ansible -y

# Ubuntu/Debian 系统安装
apt update
apt install ansible -y

步骤 2:创建主机清单

ini
# inventory.ini - Memcached 服务器清单
[memcached_servers]
192.168.1.101  # Memcached 服务器 1
192.168.1.102  # Memcached 服务器 2
192.168.1.103  # Memcached 服务器 3

步骤 3:编写部署剧本

yaml
# memcached_deploy.yml - Memcached 部署剧本
---
- name: 部署 Memcached 服务
  hosts: memcached_servers
  become: yes  # 提权到 root 用户
  vars:
    memcached_memory: 1024      # 内存大小(MB)
    memcached_port: 11211       # 监听端口
    memcached_listen: 0.0.0.0   # 监听地址
    memcached_user: memcached   # 运行用户
    memcached_max_connections: 1024  # 最大连接数
    memcached_threads: 4       # 线程数
  
  tasks:
    - name: 在 RedHat 系统安装 Memcached
      yum:
        name: memcached
        state: present
      when: ansible_os_family == "RedHat"

    - name: 在 Debian/Ubuntu 系统安装 Memcached
      apt:
        name: memcached
        state: present
        update_cache: yes
      when: ansible_os_family == "Debian"

    - name: 创建 Memcached 用户
      user:
        name: "{{ memcached_user }}"
        state: present
        system: yes

    - name: 配置 Memcached
      template:
        src: memcached.conf.j2
        dest: /etc/memcached.conf
        mode: 0644
      notify: 重启 Memcached

    - name: 配置 RedHat 系统的 Systemd 服务
      template:
        src: memcached.service.j2
        dest: /etc/systemd/system/memcached.service
        mode: 0644
      when: ansible_os_family == "RedHat"
      notify: 重启 Memcached

    - name: 启动并启用 Memcached 服务
      systemd:
        name: memcached
        state: started
        enabled: yes
        daemon_reload: yes

    - name: 配置 RedHat 系统防火墙
      firewalld:
        port: "{{ memcached_port }}/tcp"
        permanent: yes
        state: enabled
      when: ansible_os_family == "RedHat"
      notify: 重载防火墙

  handlers:
    - name: 重启 Memcached
      systemd:
        name: memcached
        state: restarted
        daemon_reload: yes

    - name: 重载防火墙
      systemd:
        name: firewalld
        state: reloaded

步骤 4:创建配置模板

memcached.conf.j2

txt
# Memcached 配置文件
# 生成时间: {{ ansible_date_time.iso8601 }}

# 内存大小(MB)
-m {{ memcached_memory }}

# 监听地址
-l {{ memcached_listen }}

# 监听端口
-p {{ memcached_port }}

# 运行用户
-u {{ memcached_user }}

# 最大连接数
-c {{ memcached_max_connections }}

# 线程数
-t {{ memcached_threads }}

# 禁用 UDP 协议
-U 0

memcached.service.j2

txt
[Unit]
Description=Memcached 缓存服务
After=network.target

[Service]
Type=simple
User={{ memcached_user }}
ExecStart=/usr/bin/memcached -u {{ memcached_user }} -l {{ memcached_listen }} -p {{ memcached_port }} -m {{ memcached_memory }} -c {{ memcached_max_connections }} -t {{ memcached_threads }} -U 0
Restart=on-failure

[Install]
WantedBy=multi-user.target

步骤 5:执行部署

bash
# 测试服务器连接
ansible all -i inventory.ini -m ping

# 执行 Memcached 部署
ansible-playbook -i inventory.ini memcached_deploy.yml

# 查看部署结果
ansible all -i inventory.ini -m command -a "systemctl status memcached"

2. Puppet

Puppet 简介

  • 基于 Ruby 的配置管理工具
  • 采用客户端-服务器架构
  • 使用 Ruby DSL 编写 manifests(清单)
  • 支持配置版本控制和回滚

Puppet 部署 Memcached 示例

步骤 1:创建 Memcached 模块

bash
# 创建 Puppet 模块目录结构
mkdir -p /etc/puppetlabs/code/environments/production/modules/memcached/manifests
mkdir -p /etc/puppetlabs/code/environments/production/modules/memcached/templates

步骤 2:编写模块清单

init.pp

ruby
# /etc/puppetlabs/code/environments/production/modules/memcached/manifests/init.pp
class memcached (
  $memory            = 1024,     # 内存大小(MB)
  $port              = 11211,    # 监听端口
  $listen            = '0.0.0.0',# 监听地址
  $user              = 'memcached',# 运行用户
  $max_connections   = 1024,     # 最大连接数
  $threads           = 4,        # 线程数
) {
  
  # 安装 Memcached 软件包
  package { 'memcached':
    ensure => installed,
  }
  
  # 创建 Memcached 用户
  user { $user:
    ensure  => present,
    system  => true,
    require => Package['memcached'],
  }
  
  # 管理 Memcached 配置文件
  file { '/etc/memcached.conf':
    ensure  => file,
    content => template('memcached/memcached.conf.erb'),
    mode    => '0644',
    require => Package['memcached'],
    notify  => Service['memcached'],
  }
  
  # 管理 Memcached 服务
  service { 'memcached':
    ensure     => running,
    enable     => true,
    hasrestart => true,
    require    => [
      Package['memcached'],
      File['/etc/memcached.conf'],
    ],
  }
}

步骤 3:编写配置模板

memcached.conf.erb

erb
# Memcached 配置文件
# 生成时间: <%= Time.now %>

# 内存大小(MB)
-m <%= @memory %>

# 监听地址
-l <%= @listen %>

# 监听端口
-p <%= @port %>

# 运行用户
-u <%= @user %>

# 最大连接数
-c <%= @max_connections %>

# 线程数
-t <%= @threads %>

# 禁用 UDP 协议
-U 0

步骤 4:应用配置到节点

site.pp

ruby
# /etc/puppetlabs/code/environments/production/manifests/site.pp
# 匹配所有以 memcached-server- 开头的节点
node 'memcached-server-*' {
  class { 'memcached':
    memory          => 2048,      # 生产环境配置 2GB 内存
    max_connections => 2048,      # 最大连接数 2048
    threads         => 8,         # 8 线程
  }
}

步骤 5:执行部署

bash
# 在 Puppet Master 上执行配置应用
puppet apply /etc/puppetlabs/code/environments/production/manifests/site.pp

# 或在 Puppet Agent 节点上执行
puppet agent -t

3. Chef

Chef 简介

  • 基于 Ruby 的配置管理工具
  • 支持客户端-服务器和单机模式
  • 使用 Ruby DSL 编写 cookbooks(食谱)
  • 支持多种云平台和虚拟化技术

Chef 部署 Memcached 示例

步骤 1:创建 Cookbook

bash
# 安装 Chef Workstation 后执行
# 创建 Memcached Cookbook
chef generate cookbook memcached

步骤 2:编写部署 Recipe

default.rb

ruby
# recipes/default.rb - Memcached 部署配方
# 安装 Memcached 软件包
package 'memcached' do
  action :install
end

# 创建 Memcached 用户
user 'memcached' do
  system true
  action :create
end

# 管理 Memcached 配置文件
template '/etc/memcached.conf' do
  source 'memcached.conf.erb'
  mode '0644'
  variables(
    memory: 1024,           # 内存大小(MB)
    port: 11211,            # 监听端口
    listen: '0.0.0.0',      # 监听地址
    user: 'memcached',      # 运行用户
    max_connections: 1024,  # 最大连接数
    threads: 4              # 线程数
  )
  notifies :restart, 'service[memcached]'  # 配置变更后重启服务
end

# 管理 Memcached 服务
service 'memcached' do
  action [:enable, :start]  # 启用并启动服务
  supports restart: true    # 支持重启操作
end

步骤 3:编写配置模板

memcached.conf.erb

erb
# Memcached 配置文件
# 生成时间: <%= Time.now %>

# 内存大小(MB)
-m <%= @memory %>

# 监听地址
-l <%= @listen %>

# 监听端口
-p <%= @port %>

# 运行用户
-u <%= @user %>

# 最大连接数
-c <%= @max_connections %>

# 线程数
-t <%= @threads %>

# 禁用 UDP 协议
-U 0

步骤 4:执行部署

bash
# 单机模式部署
chef-client --local-mode --runlist 'recipe[memcached]'

# 客户端-服务器模式部署
knife bootstrap memcached-server-1.example.com --runlist 'recipe[memcached]'

4. SaltStack

SaltStack 简介

  • 基于 Python 的配置管理和远程执行工具
  • 采用客户端-服务器架构
  • 使用 YAML 编写 states(状态)
  • 支持批量执行和实时响应

SaltStack 部署 Memcached 示例

步骤 1:创建 State 文件

memcached.sls

yaml
# /srv/salt/memcached.sls - Memcached 状态配置
memcached-package:
  pkg.installed:
    - name: memcached  # 安装 Memcached 包

memcached-user:
  user.present:
    - name: memcached  # 创建 Memcached 用户
    - system: True     # 系统用户
    - require:
      - pkg: memcached-package  # 依赖于包安装

memcached-config:
  file.managed:
    - name: /etc/memcached.conf  # 配置文件路径
    - source: salt://memcached/memcached.conf.j2  # 模板源
    - template: jinja  # 使用 Jinja 模板
    - context:         # 模板变量
        memory: 1024           # 内存大小(MB)
        port: 11211            # 监听端口
        listen: 0.0.0.0        # 监听地址
        user: memcached        # 运行用户
        max_connections: 1024  # 最大连接数
        threads: 4             # 线程数
    - require:
      - pkg: memcached-package  # 依赖于包安装
    - watch_in:
      - service: memcached-service  # 配置变更后重启服务

memcached-service:
  service.running:
    - name: memcached  # 服务名称
    - enable: True     # 开机自启
    - require:
      - pkg: memcached-package  # 依赖于包安装
      - file: memcached-config  # 依赖于配置文件

步骤 2:编写配置模板

memcached.conf.j2

txt
# Memcached 配置文件
# 生成时间: {{ grains['datetime'] }}

# 内存大小(MB)
-m {{ memory }}

# 监听地址
-l {{ listen }}

# 监听端口
-p {{ port }}

# 运行用户
-u {{ user }}

# 最大连接数
-c {{ max_connections }}

# 线程数
-t {{ threads }}

# 禁用 UDP 协议
-U 0

步骤 3:执行部署

bash
# 测试所有 Minion 连接
 salt '*' test.ping

# 执行 Memcached 部署
salt '*' state.apply memcached

# 查看部署结果
salt '*' service.status memcached

5. Docker + Kubernetes

Docker 批量部署

Dockerfile

dockerfile
FROM memcached:1.6.18-alpine  # 使用 Alpine 基础镜像,体积更小

# 添加自定义配置文件
COPY memcached.conf /etc/memcached.conf

# 启动命令配置
CMD ["memcached", "-u", "memcached", "-l", "0.0.0.0", "-p", "11211", "-m", "1024", "-c", "1024", "-t", "4", "-U", "0"]

使用 Docker Compose 批量部署

bash
# docker-compose.yml - Docker Compose 配置
version: '3'
services:
  memcached-1:  # 第一个 Memcached 实例
    build: .
    ports:
      - "11211:11211"  # 映射到主机 11211 端口
    restart: always  # 总是重启
  
  memcached-2:  # 第二个 Memcached 实例
    build: .
    ports:
      - "11212:11211"  # 映射到主机 11212 端口
    restart: always
  
  memcached-3:  # 第三个 Memcached 实例
    build: .
    ports:
      - "11213:11211"  # 映射到主机 11213 端口
    restart: always

# 启动所有 Memcached 服务
docker-compose up -d

Kubernetes 批量部署

memcached-deployment.yaml

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: memcached-deployment  # Deployment 名称
spec:
  replicas: 3  # 部署 3 个副本
  selector:
    matchLabels:
      app: memcached  # 匹配标签
  template:
    metadata:
      labels:
        app: memcached  # Pod 标签
    spec:
      containers:
      - name: memcached
        image: memcached:1.6.18-alpine  # 使用官方 Alpine 镜像
        ports:
        - containerPort: 11211  # 容器端口
        args: ["-m", "1024", "-c", "1024", "-t", "4", "-U", "0"]  # 启动参数
        resources:
          limits:  # 资源限制
            memory: "1Gi"  # 最大内存 1GB
            cpu: "1"       # 最大 CPU 1 核
          requests:  # 资源请求
            memory: "1Gi"  # 请求内存 1GB
            cpu: "0.5"     # 请求 CPU 0.5 核
---
apiVersion: v1
kind: Service
metadata:
  name: memcached-service  # Service 名称
spec:
  selector:
    app: memcached  # 匹配标签
  ports:
  - port: 11211        # Service 端口
    targetPort: 11211  # 目标 Pod 端口
  type: ClusterIP      # ClusterIP 类型,仅集群内部访问

执行 Kubernetes 部署

bash
# 应用部署配置
kubectl apply -f memcached-deployment.yaml

# 查看部署状态
kubectl get deployments  # 查看 Deployment 状态
kubectl get pods         # 查看 Pod 状态
kubectl get services     # 查看 Service 状态

批量部署最佳实践

1. 配置标准化

建议

  • 制定统一的配置模板,确保所有节点配置一致
  • 采用变量化配置,便于根据开发、测试、生产等不同环境调整参数
  • 使用 Git 等版本控制工具管理配置文件,便于追溯变更
  • 定期审查和更新配置标准,适应业务需求变化

配置示例

yaml
# 开发环境配置
development:
  memory: 512           # 开发环境分配 512MB 内存
  max_connections: 512  # 最大连接数 512
  threads: 2            # 2 线程

# 测试环境配置
testing:
  memory: 1024          # 测试环境分配 1GB 内存
  max_connections: 1024 # 最大连接数 1024
  threads: 4            # 4 线程

# 生产环境配置
production:
  memory: 2048          # 生产环境分配 2GB 内存
  max_connections: 2048 # 最大连接数 2048
  threads: 8            # 8 线程

2. 自动化测试

建议

  • 部署前进行配置验证,确保配置文件语法正确
  • 部署后进行功能测试,验证服务是否正常运行
  • 实现自动化回归测试,确保每次部署不破坏现有功能
  • 监控部署过程中的错误,及时发现和处理问题

测试脚本示例

bash
#!/bin/bash
# Memcached 部署测试脚本 - 用于验证 Memcached 服务部署是否成功

echo "=== Memcached 部署测试 ==="

# 测试 1: 检查 Memcached 服务是否运行
if systemctl is-active --quiet memcached; then
    echo "✓ Memcached 服务正在运行"
else
    echo "✗ Memcached 服务未运行"
    exit 1
fi

# 测试 2: 检查 Memcached 端口是否监听
if netstat -tuln | grep -q 11211; then
    echo "✓ Memcached 端口 11211 正在监听"
else
    echo "✗ Memcached 端口 11211 未监听"
    exit 1
fi

# 测试 3: 测试 Memcached 基本功能
# 使用 echo 命令发送 set 和 get 命令,验证数据存储和读取功能
echo -e "set test_key 0 60 5\nvalue\nget test_key\nquit" | nc localhost 11211 | grep -q "value"
if [ $? -eq 0 ]; then
    echo "✓ Memcached 基本功能正常(数据存储和读取)"
else
    echo "✗ Memcached 基本功能异常"
    exit 1
fi

echo "=== 所有测试通过,Memcached 部署成功! ==="
exit 0

3. 滚动部署

建议

  • 采用滚动部署策略,逐步更新集群中的节点,减少服务中断时间
  • 每次只更新部分节点(如 30%),确保剩余节点正常提供服务
  • 监控部署过程中的性能变化,如响应时间、错误率等
  • 准备回滚方案,一旦发现问题可快速恢复到之前的版本

Ansible 滚动部署示例

yaml
# 在 playbook 中添加滚动部署配置
strategy: free          # 使用自由策略,允许任务在不同节点并行执行
serial: "30%"           # 每次更新 30% 的节点

Kubernetes 滚动更新

bash
# 更新 Memcached 镜像版本
kubectl set image deployment/memcached-deployment memcached=memcached:1.6.19-alpine

# 查看滚动更新状态
kubectl rollout status deployment/memcached-deployment

# 如果更新出现问题,执行回滚操作
kubectl rollout undo deployment/memcached-deployment

4. 监控与告警

建议

  • 部署后自动将 Memcached 实例加入监控系统(如 Prometheus + Grafana)
  • 设置基础告警规则,如服务宕机、内存使用率过高、连接数过多等
  • 监控服务健康状态,包括可用性、响应时间等指标
  • 收集性能指标,如命中率、每秒请求数、延迟等,用于性能分析和优化

Prometheus 自动发现配置

yaml
# prometheus.yml - Prometheus 配置文件
scrape_configs:
  - job_name: 'memcached'       # 监控任务名称
    kubernetes_sd_configs:      # 使用 Kubernetes 服务发现
    - role: pod                 # 发现所有 Pod
    relabel_configs:            # 标签重写配置
    - source_labels: [__meta_kubernetes_pod_label_app]  # 匹配标签
      action: keep              # 保留匹配的 Pod
      regex: memcached          # 只保留 app=memcached 的 Pod
    - source_labels: [__address__]  # 获取 Pod 地址
      action: replace           # 替换地址
      regex: ([^:]+):\d+        # 提取 IP 地址
      replacement: $1:9150      # 替换为 IP:9150(Memcached Exporter 端口)
      target_label: __address__ # 目标标签

常见问题(FAQ)

Q1: 如何在不同环境中使用不同的配置?

A1: 实现不同环境使用不同配置的方法:

  • 使用配置管理工具的环境变量或参数化配置功能,如 Ansible 的 vars_files、Puppet 的 Hiera 等
  • 为不同环境创建不同的配置文件,部署时根据环境选择对应的配置
  • 使用条件语句根据环境自动选择配置,如 Ansible 的 when 条件、Puppet 的 if-else 等

Q2: 如何处理批量部署中的失败节点?

A2: 处理批量部署失败节点的方法:

  • 实现自动化回滚机制,当部署失败率超过阈值时自动回滚
  • 对失败节点进行标记和隔离,避免影响整个集群
  • 分析失败原因,修复后重新部署
  • 实现重试机制,对临时故障节点进行自动重试

Q3: 如何确保批量部署的一致性?

A3: 确保批量部署一致性的方法:

  • 使用版本控制的配置文件,确保所有节点使用相同版本的配置
  • 采用自动化部署工具,避免人工操作导致的不一致
  • 实现配置漂移检测,定期检查节点配置是否与标准配置一致
  • 定期进行配置审计,发现和修正不一致的配置

Q4: 如何升级批量部署的 Memcached 实例?

A4: 升级批量部署的 Memcached 实例的方法:

  • 采用滚动升级策略,逐步更新每个节点,减少服务中断
  • 在测试环境验证新版本的稳定性和兼容性
  • 制定详细的回滚计划,一旦出现问题可快速恢复
  • 监控升级过程中的性能变化,确保升级不影响业务

Q5: 如何在 Docker/Kubernetes 环境中批量部署 Memcached?

A5: 在容器化环境中批量部署 Memcached 的方法:

  • 使用 Docker Compose 部署多个 Memcached 容器,适合小规模部署
  • 使用 Kubernetes Deployment 实现副本管理,自动扩缩容
  • 配置适当的资源限制(CPU、内存),确保容器资源使用合理
  • 实现服务发现和负载均衡,便于客户端访问

Q6: 如何监控批量部署的 Memcached 实例?

A6: 监控批量部署的 Memcached 实例的方法:

  • 使用集中式监控系统,如 Prometheus + Grafana
  • 实现自动服务发现,新部署的节点自动加入监控
  • 设置统一的告警规则,确保所有节点的告警策略一致
  • 可视化展示集群状态,便于整体监控和管理

Q7: 如何优化批量部署的性能?

A7: 优化批量部署性能的方法:

  • 并行执行部署任务,提高部署效率
  • 减少部署步骤和依赖,简化部署流程
  • 使用高效的配置管理工具,如 Ansible、SaltStack 等
  • 优化镜像和配置文件大小,减少传输时间

批量部署检查清单

检查项描述状态
配置模板创建标准化的 Memcached 配置模板
自动化工具选择合适的自动化部署工具(如 Ansible、Puppet 等)
环境区分支持开发、测试、生产等不同环境的配置
测试脚本实现自动化测试脚本,验证部署结果
监控集成自动将新部署节点加入监控系统
回滚机制实现部署回滚功能,确保可快速恢复
文档记录编写详细的部署文档和流程
培训计划培训团队使用部署工具和流程
定期审查定期审查和更新部署流程
性能优化优化部署性能和效率