1. 环境准备与系统配置
1.1 服务器规划与初始化检查
在开始部署前,我们需要明确服务器架构和基础环境。本次部署采用两台CentOS 7服务器,分别承担数据库和应用服务角色:
- 数据库服务器(ad-db):运行PostgreSQL 18容器
- 应用服务器(ad-app):运行Django应用和Redis服务
首先进行基础环境检查(两台服务器均需执行):
bash复制# 查看系统版本确认是否为CentOS 7
cat /etc/os-release
# 检查系统资源
free -h # 内存情况
df -h # 磁盘空间
nproc # CPU核心数
# 验证sudo权限
sudo -l
特别注意:CentOS 7已于2024年6月停止维护,默认yum源已失效。建议新项目考虑迁移至Rocky Linux或AlmaLinux等替代发行版。若必须使用CentOS 7,需先修复yum源。
1.2 修复CentOS 7的yum源
由于官方源已不可用,我们需要切换到阿里云归档源:
bash复制# 备份原有源
sudo mkdir -p /etc/yum.repos.d/backup
sudo mv /etc/yum.repos.d/CentOS-*.repo /etc/yum.repos.d/backup/
# 配置阿里云源
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 重建缓存
sudo yum clean all
sudo yum makecache
实际操作中可能会遇到网络波动导致下载失败,可尝试多次执行或更换其他镜像源(如腾讯云、华为云等)。
2. Docker安装与配置
2.1 Docker安装步骤
在两台服务器上执行相同的Docker安装流程:
bash复制# 安装基础依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加阿里云Docker源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装Docker引擎
sudo yum install -y docker-ce docker-ce-cli containerd.io --skip-broken
常见问题:若安装过程中出现网络超时,可能是由于国内网络环境导致。解决方案:
- 重试安装命令
- 更换为腾讯云镜像源
- 检查服务器网络连接
2.2 Docker服务管理
安装完成后需要启动并设置开机自启:
bash复制# 启动Docker服务
sudo systemctl start docker
# 设置开机自启
sudo systemctl enable docker
# 验证安装
sudo docker version
正常输出应包含Client和Server两个部分的版本信息。若只有Client信息,说明Docker服务未正确启动。
2.3 Docker存储配置
为避免根分区空间耗尽,建议将Docker数据目录迁移到大容量分区:
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<'EOF'
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://registry.docker-cn.com"
],
"data-root": "/data/docker"
}
EOF
# 重启Docker使配置生效
sudo systemctl restart docker
# 验证配置
sudo docker info | grep "Docker Root Dir"
重要提示:修改data-root后,原有镜像和容器将不可见。如需保留,需先迁移数据:
bash复制sudo systemctl stop docker sudo rsync -avz /var/lib/docker/ /data/docker/ sudo mv /var/lib/docker /var/lib/docker.bak
3. PostgreSQL容器化部署
3.1 准备工作
在数据库服务器(ad-db)上创建数据目录:
bash复制sudo mkdir -p /data/postgresql/data
sudo mkdir -p /data/postgresql/logs
# 设置权限(PostgreSQL容器内用户UID为999)
sudo chown -R 999:999 /data/postgresql
3.2 镜像获取与容器启动
由于Docker Hub在国内访问不稳定,我们使用第三方镜像源:
bash复制# 拉取PostgreSQL 18镜像
sudo docker pull docker.1panel.live/library/postgres:18
# 重命名镜像
sudo docker tag docker.1panel.live/library/postgres:18 postgres:18
启动PostgreSQL容器:
bash复制sudo docker run -d \
--name postgresql \
--restart always \
-e POSTGRES_PASSWORD=your_secure_password \
-e POSTGRES_USER=postgres \
-e PGDATA=/var/lib/postgresql/data \
-v /data/postgresql/data:/var/lib/postgresql/data \
-v /data/postgresql/logs:/var/log/postgresql \
-p 5432:5432 \
postgres:18
3.3 数据库初始化
进入容器执行初始化操作:
bash复制sudo docker exec -it postgresql psql -U postgres
在psql命令行中执行:
sql复制-- 创建应用用户
CREATE USER django_user WITH PASSWORD 'your_app_password';
-- 创建应用数据库
CREATE DATABASE django_db OWNER django_user;
-- 授权
GRANT ALL PRIVILEGES ON DATABASE django_db TO django_user;
-- 验证
\l -- 查看数据库列表
\du -- 查看用户列表
4. Redis服务部署
4.1 安装Redis 7
在应用服务器(ad-app)上安装Redis:
bash复制# 添加EPEL和Remi源
sudo yum install -y epel-release
sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
sudo yum install -y yum-utils
# 安装Redis 7
sudo yum install -y redis --enablerepo=remi
4.2 配置与安全设置
编辑Redis配置文件设置密码:
bash复制sudo nano /etc/redis.conf
找到并修改以下配置:
code复制requirepass your_redis_password
bind 0.0.0.0
protected-mode yes
重启Redis使配置生效:
bash复制sudo systemctl restart redis
sudo systemctl enable redis
4.3 连接验证
测试Redis连接:
bash复制# 无密码连接应被拒绝
redis-cli ping
# 带密码连接应返回PONG
redis-cli -a your_redis_password ping
5. 系统维护与监控
5.1 PostgreSQL维护命令
bash复制# 查看容器状态
sudo docker ps | grep postgresql
# 实时查看日志
sudo docker logs -f postgresql
# 数据库备份
sudo docker exec postgresql pg_dump -U postgres django_db > /data/postgresql/backup_$(date +%Y%m%d).sql
# 数据库恢复
sudo docker exec -i postgresql psql -U postgres django_db < /data/postgresql/backup_20240101.sql
5.2 Redis维护命令
bash复制# 服务状态管理
sudo systemctl status redis
sudo systemctl restart redis
# 命令行操作
redis-cli -a your_redis_password
# 内存分析
redis-cli -a your_redis_password info memory
# 性能监控
redis-cli -a your_redis_password --latency
6. 安全加固建议
6.1 PostgreSQL安全配置
-
修改默认监听地址:
bash复制sudo docker exec -it postgresql bash echo "listen_addresses = '10.60.9.y'" >> /var/lib/postgresql/data/postgresql.conf exit sudo docker restart postgresql -
配置IP访问控制:
bash复制sudo docker exec -it postgresql bash echo "host all all 10.60.9.x/32 md5" >> /var/lib/postgresql/data/pg_hba.conf exit sudo docker restart postgresql
6.2 Redis安全配置
-
禁用危险命令:
bash复制sudo nano /etc/redis.conf添加:
code复制rename-command FLUSHALL "" rename-command CONFIG "" rename-command SHUTDOWN "" -
启用防火墙限制:
bash复制sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.60.9.x" port protocol="tcp" port="6379" accept' sudo firewall-cmd --reload
7. 性能优化建议
7.1 PostgreSQL优化
-
调整共享缓冲区:
bash复制sudo docker exec -it postgresql bash echo "shared_buffers = 1GB" >> /var/lib/postgresql/data/postgresql.conf -
配置工作内存:
bash复制echo "work_mem = 16MB" >> /var/lib/postgresql/data/postgresql.conf
7.2 Redis优化
-
内存管理配置:
bash复制sudo nano /etc/redis.conf修改:
code复制maxmemory 8gb maxmemory-policy allkeys-lru -
启用持久化:
code复制appendonly yes appendfsync everysec
8. 常见问题排查
8.1 Docker相关问题
问题1:Docker启动失败,报错"Failed to start Docker Application Container Engine"
解决方案:
bash复制# 查看详细日志
journalctl -xe
# 常见原因及处理
sudo rm -rf /var/lib/docker/network/files
sudo systemctl restart docker
问题2:容器无法连接外部网络
解决方案:
bash复制# 检查防火墙
sudo firewall-cmd --list-all
# 临时关闭防火墙测试
sudo systemctl stop firewalld
8.2 PostgreSQL相关问题
问题1:数据库连接数不足
解决方案:
sql复制-- 查看当前连接数
SELECT count(*) FROM pg_stat_activity;
-- 修改最大连接数
ALTER SYSTEM SET max_connections = 200;
问题2:数据库性能下降
解决方案:
sql复制-- 查找慢查询
SELECT * FROM pg_stat_activity WHERE state != 'idle' ORDER BY query_start;
-- 分析表统计信息
ANALYZE;
8.3 Redis相关问题
问题1:Redis内存占用过高
解决方案:
bash复制# 查看内存使用详情
redis-cli -a your_password info memory
# 手动触发内存回收
redis-cli -a your_password MEMORY PURGE
问题2:Redis响应变慢
解决方案:
bash复制# 监控延迟
redis-cli -a your_password --latency
# 查看慢查询
redis-cli -a your_password SLOWLOG GET 10
9. 备份与恢复策略
9.1 PostgreSQL备份方案
- 定时全量备份:
bash复制# 每日备份脚本
sudo crontab -e
添加:
0 2 * * * docker exec postgresql pg_dump -U postgres django_db | gzip > /data/backups/pg_$(date +\%Y\%m\%d).sql.gz
- 增量备份配置:
bash复制sudo docker exec -it postgresql bash
echo "wal_level = replica" >> /var/lib/postgresql/data/postgresql.conf
echo "archive_mode = on" >> /var/lib/postgresql/data/postgresql.conf
echo "archive_command = 'cp %p /data/postgresql/wal/%f'" >> /var/lib/postgresql/data/postgresql.conf
exit
sudo docker restart postgresql
9.2 Redis备份方案
- RDB快照备份:
bash复制sudo nano /etc/redis.conf
设置:
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /data/redis
- AOF持久化备份:
code复制appendonly yes
appendfsync everysec
10. 监控与告警配置
10.1 基础监控设置
- 系统资源监控:
bash复制# 安装基础工具
sudo yum install -y sysstat
# 启用服务
sudo systemctl start sysstat
sudo systemctl enable sysstat
- 配置日志轮转:
bash复制sudo nano /etc/logrotate.d/docker
添加:
/data/docker/containers/*/*.log {
daily
rotate 7
compress
delaycompress
missingok
copytruncate
}
10.2 应用层监控
- PostgreSQL监控:
bash复制# 安装pg_stat_statements扩展
sudo docker exec -it postgresql psql -U postgres
CREATE EXTENSION pg_stat_statements;
- Redis监控:
bash复制# 使用redis-cli监控
redis-cli -a your_password --stat
11. 架构演进建议
随着业务发展,当前架构可能需要扩展:
- 读写分离:为PostgreSQL配置从库分担读负载
- Redis集群:当单实例内存不足时转为集群模式
- 容器编排:引入Kubernetes管理Docker容器
- 服务发现:集成Consul实现服务自动注册与发现
12. 迁移与升级规划
12.1 操作系统迁移
从CentOS 7迁移到Rocky Linux 8的注意事项:
- 先在新环境部署相同版本服务
- 使用逻辑备份迁移数据
- 逐步切换流量验证
12.2 数据库升级
PostgreSQL大版本升级步骤:
- 使用pg_dumpall备份全量数据
- 在新版本实例恢复数据
- 运行pg_upgrade检查兼容性
- 应用停服维护期间执行最终切换
13. 成本优化建议
-
存储优化:
- PostgreSQL启用表压缩
- Redis优化数据过期策略
-
资源调度:
- 为容器设置资源限制
- 根据业务峰谷调整实例规格
-
备份策略:
- 冷热数据分级存储
- 使用增量备份减少存储占用
14. 开发环境对接
14.1 本地连接配置
- PostgreSQL连接:
python复制# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'django_db',
'USER': 'django_user',
'PASSWORD': 'your_app_password',
'HOST': '10.60.9.y',
'PORT': '5432',
}
}
- Redis连接:
python复制CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://:your_redis_password@10.60.9.x:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
14.2 测试数据准备
- 使用Django Fixtures:
bash复制python manage.py dumpdata app.Model --indent 2 > fixture.json
python manage.py loaddata fixture.json
- Redis测试数据生成:
python复制import redis
r = redis.Redis(host='10.60.9.x', password='your_redis_password')
for i in range(1000):
r.set(f'key_{i}', f'value_{i}')
15. 持续集成部署
15.1 自动化部署脚本
- Docker构建脚本:
bash复制#!/bin/bash
# build.sh
docker build -t django-app .
docker tag django-app:latest registry.example.com/django-app:latest
docker push registry.example.com/django-app:latest
- 部署脚本:
bash复制#!/bin/bash
# deploy.sh
docker pull registry.example.com/django-app:latest
docker stop django-app || true
docker rm django-app || true
docker run -d --name django-app \
-p 8000:8000 \
-e DJANGO_SETTINGS_MODULE=project.settings.prod \
registry.example.com/django-app:latest
15.2 CI/CD集成
- GitLab CI示例:
yaml复制stages:
- test
- build
- deploy
test:
stage: test
script:
- python manage.py test
build:
stage: build
script:
- docker build -t django-app .
- docker tag django-app:latest registry.example.com/django-app:latest
- docker push registry.example.com/django-app:latest
deploy:
stage: deploy
script:
- ssh deploy@server "cd /opt/scripts && ./deploy.sh"
16. 安全审计与合规
16.1 定期安全检查
- PostgreSQL审计:
sql复制-- 启用审计日志
ALTER SYSTEM SET log_statement = 'all';
-- 查看敏感权限
SELECT * FROM pg_roles WHERE rolpassword IS NOT NULL;
- Redis安全扫描:
bash复制# 检查开放端口
nmap -p 6379 10.60.9.x
# 测试密码强度
redis-cli -a weak_password ping
16.2 合规配置
-
密码策略:
- 强制90天更换数据库密码
- 使用密码管理器生成强密码
-
访问控制:
- 限制SSH访问IP范围
- 为不同服务创建独立账户
17. 灾难恢复演练
17.1 恢复测试方案
- PostgreSQL恢复测试:
bash复制# 模拟数据丢失
docker stop postgresql
rm -rf /data/postgresql/data/*
# 从备份恢复
docker run --rm -v /data/postgresql/data:/var/lib/postgresql/data \
-v /data/backups:/backups postgres:18 \
bash -c "gunzip -c /backups/pg_latest.sql.gz | psql -U postgres"
- Redis恢复测试:
bash复制# 停止Redis
systemctl stop redis
# 恢复RDB文件
cp /data/backups/dump.rdb /var/lib/redis/
# 启动Redis
systemctl start redis
17.2 演练频率建议
- 季度全量恢复演练
- 月度关键数据验证
- 每周备份完整性检查
18. 文档与知识管理
18.1 系统文档规范
-
架构图维护:
- 使用PlantUML绘制最新架构
- 版本控制与变更记录
-
操作手册:
- 分角色编写(开发/运维/DBA)
- 包含常见问题速查
18.2 知识传承机制
- 定期内部技术分享
- 关键操作录制视频
- 建立运维知识库
19. 技术栈评估与更新
19.1 组件版本策略
-
PostgreSQL:
- 跟进最新稳定版(当前18.x)
- 评估新特性适用性
-
Redis:
- 保持与社区版同步
- 测试新数据结构性能
19.2 技术雷达扫描
-
每季度评估:
- 容器编排方案
- 监控工具链
- 数据库生态
-
年度架构评审:
- 微服务化可行性
- 云原生迁移路径
- 技术债务清理
20. 性能基准测试
20.1 测试方案设计
- PostgreSQL基准:
bash复制# 安装pgbench
docker exec postgresql apt-get update
docker exec postgresql apt-get install -y postgresql-contrib
# 初始化测试数据
docker exec postgresql pgbench -U postgres -i -s 100 django_db
# 执行测试
docker exec postgresql pgbench -U postgres -c 50 -j 2 -t 1000 django_db
- Redis基准:
bash复制# 使用redis-benchmark
redis-benchmark -h 10.60.9.x -a your_password -t set,get -n 100000 -c 50
20.2 性能指标监控
-
关键指标:
- PostgreSQL:TPS/QPS/锁等待
- Redis:OPS/内存碎片率/网络延迟
-
监控看板:
- Grafana集成展示
- 设置性能基线告警
经过完整的部署和优化后,这套技术栈能够支撑中等规模的Web应用运行。在实际使用中,建议根据业务负载特点持续调整参数配置,并建立完善的监控体系以便及时发现和解决问题。