数据库容器化

数据库容器化

数据库容器化的争议

数据库容器化一直是运维领域的热门话题。支持者认为容器带来了运维便利,反对者担心性能和稳定性。实际上,非核心数据库适合容器化,核心生产数据库建议保持物理机/虚拟机部署

适合容器化的数据库场景

  • 开发和测试环境
  • CI/CD 集成测试
  • 微服务中的轻量级数据库
  • 临时分析任务
  • 边缘计算场景

容器化数据库的关键配置

1. 数据持久化

version: '3.8'
services:
  postgres:
    image: postgres:15
    volumes:
      # 数据文件使用 Docker Volume
      - pg-data:/var/lib/postgresql/data
      # 初始化脚本
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: myapp
      POSTGRES_PASSWORD: ${DB_PASSWORD}

2. 资源限制

# 必须设置资源限制,防止数据库吃光所有资源
docker run -d \
  --name mysql \
  --memory=4g \
  --cpus=2 \
  --memory-reservation=2g \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

3. 性能调优

services:
  mysql:
    image: mysql:8.0
    command:
      # 根据容器资源调整
      - --innodb_buffer_pool_size=2G
      - --max_connections=200
      - --innodb_log_file_size=512M
      # 性能优化
      - --skip-name-resolve
      - --innodb_flush_log_at_trx_commit=2
    volumes:
      - mysql-data:/var/lib/mysql
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 4G

4. 备份策略

#!/bin/bash
# backup_db.sh

# MySQL
docker exec mysql-container mysqldump \
  -u root -p$PASSWORD \
  --all-databases \
  --single-transaction \
  --routines \
  --triggers \
  | gzip > /backup/mysql_$(date +%Y%m%d).sql.gz

# PostgreSQL
docker exec pg-container pg_dumpall \
  -U postgres \
  | gzip > /backup/pg_$(date +%Y%m%d).sql.gz

# 保留 30 天
find /backup -name "*.sql.gz" -mtime +30 -delete

数据库容器化实践

MySQL

services:
  mysql:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: myapp
      MYSQL_USER: myapp
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - mysql-data:/var/lib/mysql
      - ./mysql.conf.d:/etc/mysql/conf.d
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

PostgreSQL

services:
  postgres:
    image: postgres:15
    restart: always
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: myapp
      POSTGRES_PASSWORD: ${PG_PASSWORD}
    volumes:
      - pg-data:/var/lib/postgresql/data
      - ./postgresql.conf:/etc/postgresql/postgresql.conf
    ports:
      - "5432:5432"
    shm_size: '256m'
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U myapp"]
      interval: 10s
      timeout: 5s
      retries: 5

Redis

services:
  redis:
    image: redis:7-alpine
    command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
    volumes:
      - redis-data:/data
    ports:
      - "6379:6379"

数据库容器化的风险

风险 说明 缓解措施
数据丢失 容器删除导致数据丢失 Volume 持久化 + 定期备份
性能损失 容器化带来的 I/O 开销 使用 Volume 而非 overlay2
网络延迟 容器网络 vs 宿主机网络 使用 host 网络模式
运维复杂性 备份/恢复流程变化 脚本自动化
版本升级 大版本升级复杂 使用官方镜像 + 数据迁移

什么时候不要容器化数据库

  • 核心交易系统
  • 数据库集群(需要自动故障转移)
  • 性能敏感型场景
  • 需要特殊内核参数的场景
  • 对运维工具有较强的集成需求

面试要点

  1. 数据库容器化的关键是数据持久化(Volume)和资源限制
  2. 开发/测试环境适合容器化,核心生产数据库需谨慎
  3. 数据库的备份恢复策略在容器化后需要重新设计
  4. shm_size 对 PostgreSQL 性能非常重要
  5. 健康检查确保数据库服务高可用

面试官常问:你们生产环境的数据库用容器化了吗?为什么?

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容