本方案采用MinIO作为核心存储服务,配合Nginx实现边缘节点负载均衡,使用Docker Compose进行容器化部署。整套系统可在单台4核8GB内存的服务器上稳定运行,支持横向扩展。
边缘节点最低配置:
更新系统包并安装必要工具:
``` sudo apt update sudo apt upgrade -y sudo apt install -y curl wget vim net-tools ```安装Docker CE版本:
``` curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker $USER ```安装Docker Compose:
``` sudo curl -L "https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose ```创建docker-compose.yml文件:
``` version: '3.8' services: minio: image: minio/minio:RELEASE.2023-03-20T20-16-18Z container_name: minio restart: always command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: admin MINIO_ROOT_PASSWORD: ChangeThisPassword123! volumes: - ./data:/data - ./config:/root/.minio ports: - "9000:9000" - "9001:9001" networks: - edge-network networks: edge-network: driver: bridge ```启动服务并验证:
``` sudo docker-compose up -d sudo docker-compose ps ```访问控制台:http://服务器IP:9001,使用admin/ChangeThisPassword123!登录。
创建nginx.conf文件:
``` user www-data; worker_processes auto; pid /run/nginx.pid; events { worker_connections 1024; use epoll; multi_accept on; } http { upstream minio_backend { server minio:9000; keepalive 32; } server { listen 80; server_name _; location / { proxy_pass http://minio_backend; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 300; proxy_http_version 1.1; proxy_set_header Connection ""; chunked_transfer_encoding off; } } } ```在原有文件基础上添加Nginx服务:
``` nginx: image: nginx:1.18-alpine container_name: nginx-proxy restart: always volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro ports: - "80:80" depends_on: - minio networks: - edge-network ```添加MinIO服务器别名:
``` mc alias set local http://localhost:9000 admin ChangeThisPassword123! ```创建名为archive的存储桶:
``` mc mb local/archive ```创建存储桶访问策略文件bucket-policy.json:
``` { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::archive/" ] } ] } ```应用策略:
``` mc policy set local/archive bucket-policy.json ```安装boto3库:
``` pip install boto3 ```创建配置文件client_config.py:
``` import boto3 from botocore.client import Config s3_client = boto3.client( 's3', endpoint_url='http://服务器IP:80', aws_access_key_id='admin', aws_secret_access_key='ChangeThisPassword123!', config=Config(signature_version='s3v4'), region_name='us-east-1' ) ```
创建upload_file.py:
``` from client_config import s3_client def upload_file(file_path, bucket_name, object_name=None): if object_name is None: object_name = file_path.split('/')[-1] try: s3_client.upload_file( file_path, bucket_name, object_name, ExtraArgs={'ContentType': 'application/octet-stream'} ) print(f"文件 {file_path} 上传成功") except Exception as e: print(f"上传失败: {e}") 使用示例 upload_file('/path/to/your/file.pdf', 'archive') ```创建download_file.py:
``` from client_config import s3_client def download_file(bucket_name, object_name, file_path): try: s3_client.download_file(bucket_name, object_name, file_path) print(f"文件 {object_name} 下载成功") except Exception as e: print(f"下载失败: {e}") 使用示例 download_file('archive', 'file.pdf', '/local/path/file.pdf') ```创建健康检查脚本health_check.sh:
``` !/bin/bash 检查MinIO服务 MINIO_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:9000/minio/health/live) if [ "$MINIO_STATUS" -eq 200 ]; then echo "MinIO服务正常" else echo "MinIO服务异常" exit 1 fi 检查Nginx服务 NGINX_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost) if [ "$NGINX_STATUS" -eq 200 ]; then echo "Nginx服务正常" else echo "Nginx服务异常" exit 1 fi 检查磁盘空间 DISK_USAGE=$(df -h /opt/edge-storage/data | awk 'NR==2 {print $5}' | sed 's/%//') if [ "$DISK_USAGE" -gt 90 ]; then echo "警告:磁盘使用率超过90%" fi ```更新docker-compose.yml添加日志配置:
``` logging: driver: "json-file" options: max-size: "10m" max-file: "3" ```创建backup.sh:
``` !/bin/bash BACKUP_DIR="/opt/backups/$(date +%Y%m%d)" mkdir -p $BACKUP_DIR 备份MinIO数据 tar -czf $BACKUP_DIR/minio_data.tar.gz /opt/edge-storage/data 备份配置文件 tar -czf $BACKUP_DIR/config.tar.gz /opt/edge-storage/config /opt/edge-storage/nginx.conf 保留最近7天备份 find /opt/backups -type d -mtime +7 -exec rm -rf {} \; echo "备份完成:$BACKUP_DIR" ```编辑crontab:
``` crontab -e ```添加以下内容:
``` 每天凌晨2点执行备份 0 2 /bin/bash /opt/edge-storage/backup.sh ```问题1:MinIO服务无法启动
检查端口冲突:
``` netstat -tulpn | grep :9000 netstat -tulpn | grep :9001 ```如果端口被占用,修改docker-compose.yml中的端口映射。
问题2:文件上传失败
检查存储桶权限:
``` mc policy list local/archive ```检查网络连接:
``` curl -v http://localhost:9000/minio/health/live ```问题3:磁盘空间不足
清理旧版本文件:
``` 列出所有对象 mc ls local/archive 删除30天前的文件 mc find local/archive --older-than 30d --exec "mc rm {}" ```完整重启服务:
``` cd /opt/edge-storage sudo docker-compose down sudo docker-compose up -d sudo docker-compose logs -f ```调整Docker内存限制:
``` 在docker-compose.yml中添加 minio: deploy: resources: limits: memory: 4G reservations: memory: 2G ```